Aller au contenu

API Optimize

Unmap Optimize affecte les envois aux véhicules et ordonne leurs arrêts. Un envoi est un ramassage, une livraison, ou un ramassage associé à sa livraison. Le solveur cherche un plan de faible coût qui respecte vos fenêtres horaires, capacités de charge, pauses et limites de tournée, et renvoie une tournée par véhicule.

Le point de terminaison est en service à POST https://api.unmap.dev/optimize. Il accepte le format OptimizeToursRequest de l'API Route Optimization de Google Maps Platform et renvoie un OptimizeToursResponse. Les intégrations REST peuvent utiliser l'hôte et la clé API d'Unmap, sous réserve des champs pris en charge et des différences de comportement. Unmap n'est ni affilié à Google ni approuvé par Google.

Utilisez Optimize pour affecter les envois à un parc de véhicules ou planifier avec des fenêtres horaires, des capacités ou des pauses. Pour ordonner les arrêts d'un seul véhicule sans ces contraintes, utilisez /optimized-route.

Pour essayer une requête sans écrire de code, ouvrez le banc d'essai Optimize : collez une requête ou choisissez l'un des exemples commentés, exécutez-la avec votre clé et voyez chaque tournée sur une carte, avec son coût, ses heures et les envois écartés.

Votre première requête

Cet exemple affecte deux colis à une fourgonnette au centre-ville de Calgary. Il utilise des trajets en ligne droite à 10 mètres par seconde et ne dépend donc pas du réseau routier. Retirez useGeodesicDistances et geodesicMetersPerSecond pour planifier avec les temps de trajet routiers. Définissez UNMAP_API_KEY pour curl, ou key pour TypeScript, avec votre clé API. Fixez les heures globales de début et de fin du modèle à la journée que vous voulez planifier.

curl -X POST "https://api.unmap.dev/optimize" \
  -H "X-API-Key: $UNMAP_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "useGeodesicDistances": true,
    "geodesicMetersPerSecond": 10,
    "model": {
      "globalStartTime": "2026-10-13T15:00:00Z",
      "globalEndTime": "2026-10-14T03:00:00Z",
      "shipments": [
        { "label": "parcel-1", "deliveries": [{ "arrivalLocation": { "latitude": 51.0478, "longitude": -114.0593 } }] },
        { "label": "parcel-2", "deliveries": [{ "arrivalLocation": { "latitude": 51.0375, "longitude": -114.0814 } }] }
      ],
      "vehicles": [
        { "label": "van-1", "startLocation": { "latitude": 51.0447, "longitude": -114.0719 }, "costPerKilometer": 1 }
      ]
    }
  }'

La réponse ci-dessous provient d'une exécution locale de cette requête avec le même traitement et le même solveur. L'ordre des visites et les heures peuvent varier entre les exécutions. Le solveur utilise un budget de temps pour chercher un plan de moindre coût.

// 200, avec X-Unmap-Billable-Shipments: 2
{
  "routes": [
    {
      "vehicleIndex": 0,
      "vehicleLabel": "van-1",
      "vehicleStartTime": "2026-10-13T15:00:00Z",
      "vehicleEndTime": "2026-10-13T15:04:47Z",
      "visits": [
        { "shipmentIndex": 0, "isPickup": false, "visitRequestIndex": 0, "startTime": "2026-10-13T15:01:35Z", "detour": "0s", "shipmentLabel": "parcel-1" },
        { "shipmentIndex": 1, "isPickup": false, "visitRequestIndex": 0, "startTime": "2026-10-13T15:04:47Z", "detour": "183s", "shipmentLabel": "parcel-2" }
      ],
      "transitions": [
        { "travelDuration": "95s", "travelDistanceMeters": 946, "waitDuration": "0s", "breakDuration": "0s", "delayDuration": "0s", "totalDuration": "95s", "startTime": "2026-10-13T15:00:00Z" },
        { "travelDuration": "192s", "travelDistanceMeters": 1923, "waitDuration": "0s", "breakDuration": "0s", "delayDuration": "0s", "totalDuration": "192s", "startTime": "2026-10-13T15:01:35Z" },
        { "travelDuration": "0s", "travelDistanceMeters": 0, "waitDuration": "0s", "breakDuration": "0s", "delayDuration": "0s", "totalDuration": "0s", "startTime": "2026-10-13T15:04:47Z" }
      ],
      "metrics": {
        "performedShipmentCount": 2,
        "travelDuration": "287s",
        "waitDuration": "0s",
        "delayDuration": "0s",
        "breakDuration": "0s",
        "visitDuration": "0s",
        "totalDuration": "287s",
        "travelDistanceMeters": 2869
      },
      "routeCosts": { "model.vehicles.cost_per_kilometer": 2.869 },
      "routeTotalCost": 2.869
    }
  ],
  "metrics": {
    "aggregatedRouteMetrics": {
      "performedShipmentCount": 2,
      "travelDuration": "287s",
      "waitDuration": "0s",
      "delayDuration": "0s",
      "breakDuration": "0s",
      "visitDuration": "0s",
      "totalDuration": "287s",
      "travelDistanceMeters": 2869
    },
    "skippedMandatoryShipmentCount": 0,
    "usedVehicleCount": 1,
    "earliestVehicleStartTime": "2026-10-13T15:00:00Z",
    "latestVehicleEndTime": "2026-10-13T15:04:47Z",
    "costs": { "model.vehicles.cost_per_kilometer": 2.869 },
    "totalCost": 2.869
  }
}
  • routes : une par véhicule, dans l'ordre de la requête. visits donne l'ordre à suivre, chaque visite avec l'heure où le service commence. transitions compte une entrée de plus que visits : les trajets avant chaque visite, et le trajet jusqu'à l'arrivée du véhicule.
  • La fourgonnette n'a pas d'endLocation, donc sa tournée se termine à son dernier arrêt et la dernière transition a un temps et une distance de trajet nuls. Définissez endLocation pour la ramener à l'entrepôt.
  • metrics.totalCost inclut les coûts des tournées et les pénalités des envois facultatifs écartés. Ici, il correspond à costPerKilometer multiplié par la distance parcourue. Les coûts utilisent les unités que vous choisissez et ne représentent pas les frais d'API. Les horodatages de réponse sont en RFC 3339 et en UTC; les durées sont des chaînes en secondes, comme "95s".
  • Les envois non servis figurent dans skippedShipments; reasons peut être absent lorsqu'aucune cause précise n'est identifiée. Un envoi sans penaltyCost est obligatoire, sauf si ignore: true. Si le solveur ne peut pas servir tous les envois obligatoires, la requête échoue avec 400 FAILED_PRECONDITION.

Points de terminaison

POST /optimize
POST /v1/projects/{project}:optimizeTours
POST /v1/projects/{project}/locations/{location}:optimizeTours
POST /projects/{project}:optimizeTours
POST /projects/{project}/locations/{location}:optimizeTours

Les cinq chemins acceptent la même requête et renvoient le même format de réponse. Utilisez /optimize pour les nouvelles intégrations. Les quatre autres permettent de conserver les chemins des intégrations REST de Google Route Optimization. {project} et {location} sont ignorés, tout comme parent dans le corps, qui produit un avertissement. La clé API identifie le compte qui exécute et paie la requête. Seule la méthode :optimizeTours existe; tout autre suffixe de méthode est un 404 NOT_FOUND.

Envoyez la clé dans Authorization: Bearer <key>, X-API-Key, X-Goog-Api-Key ou ?key=. Gardez la clé hors de l'URL pour les appels côté serveur. Voir Authentification.

Le corps est en JSON, d'au plus 4 Mio (au-delà, c'est un 413). Les noms de champs peuvent être en camelCase ou en snake_case; la réponse est en camelCase. Chaque réponse qu'écrit le gestionnaire d'Optimize, une résolution ou l'une de ses erreurs, porte Cache-Control: no-store; un refus de la vérification de clé placée devant lui, comme un 401, porte plutôt les en-têtes habituels de la passerelle.

Temps de trajet

Une requête tire ses temps de trajet de l'une de trois sources :

  • Le réseau routier (par défaut). Les temps et distances de conduite viennent du même graphe routier canadien que les Itinéraires, en circulation fluide. considerRoadTraffic est accepté et ignoré, avec un avertissement si sa valeur est true. Les arrêts doivent être proches de routes au Canada, et chaque véhicule doit pouvoir atteindre ses arrêts. Les trajets locaux sur une île peuvent fonctionner même sans liaison routière avec le continent. Un envoi obligatoire injoignable fait échouer la requête avec 400 FAILED_PRECONDITION; un envoi facultatif injoignable est écarté. Les trajets routiers sont limités à 200 lieux distincts par requête, ou à la limite inférieure du forfait. Pour les requêtes plus grandes, utilisez les trajets en ligne droite ou vos propres matrices. Deux arrêts à plus de 1 000 km l'un de l'autre à vol d'oiseau sont traités comme injoignables entre eux, et une requête aussi étendue peut être refusée comme trop grosse pour une seule résolution; découpez-la par région.
  • La ligne droite. useGeodesicDistances: true avec geodesicMetersPerSecond (au moins 1) : la distance orthodromique à vitesse fixe. Fonctionne partout, y compris hors du Canada.
  • Vos propres matrices. model.durationDistanceMatrices avec durationDistanceMatrixSrcTags et durationDistanceMatrixDstTags. Chaque arrêt et chaque véhicule est alors placé par tags plutôt que par coordonnées, et une matrice par vehicleStartTag donne des trajets différents à des véhicules différents.

Les véhicules conduisent (travelMode DRIVING). Unmap ajoute un champ au véhicule, unmapProfile, qui nomme le profil routier; auto est la seule valeur pour l'instant.

Avec populatePolylines: true, Unmap tente d'ajouter routePolyline.points à chaque tournée utilisée. Il s'agit d'une polyligne encodée à la précision 5, tracée sur les routes canadiennes. Si le tracé échoue ou manque de temps, la tournée reste valide et revient sans polyligne, avec l'avertissement ROUTE_POLYLINE_UNAVAILABLE. Pour les requêtes géodésiques, une polyligne routière ne modifie pas les temps ni les distances en ligne droite utilisés pour planifier. Les requêtes avec vos propres matrices n'ont pas de coordonnées et ne renvoient pas de polylignes.

Ce qu'il planifie

Pris en charge aujourd'hui :

  • Des envois avec un ramassage, une livraison, ou les deux (une paire est servie par un seul véhicule, ramassage d'abord), chaque visite avec un lieu, une durée de service (duration) et des fenêtres horaires strictes (timeWindows).
  • Les charges : loadDemands sur l'envoi face aux loadLimits (maxLoad) du véhicule, par nom de type de charge.
  • Les envois facultatifs : penaltyCost ajoute un coût lorsqu'un envoi est écarté. Le solveur peut l'écarter pour réduire le coût total, respecter les contraintes, ou faute de trouver un plan qui l'inclut dans son budget de temps. ignore: true exclut un envoi de la planification, sans pénalité.
  • allowedVehicleIndices, pour limiter les véhicules qui peuvent servir un envoi.
  • Des véhicules avec un lieu de départ et d'arrivée (ou des extrémités ouvertes), une fenêtre de départ et une fenêtre d'arrivée, fixedCost, costPerHour, costPerTraveledHour et costPerKilometer.
  • Les limites strictes routeDurationLimit, travelDurationLimit et routeDistanceLimit.
  • Des fenêtres horaires souples sur les visites et sur le départ et l'arrivée d'un véhicule (softStartTime, softEndTime et leurs coûts horaires), des limites souples de durée de tournée et de temps de conduite, une limite souple de distance et une charge maximale souple, chacune rapportée sous sa propre clé dans metrics.costs.
  • Les pauses des chauffeurs : breakRule.breakRequests, chacune avec un début au plus tôt, un début au plus tard et une durée minimale.
  • Des étiquettes sur la requête, les envois, les visites et les véhicules, renvoyées dans la réponse.
  • searchMode : RETURN_FAST cesse d'améliorer le plan peu après une première solution, CONSUME_ALL_AVAILABLE_TIME utilise tout le timeout.

Les champs énumérés acceptent le nom ou l'entier, comme les clients de Google les envoient ("travelMode": 1).

Pas encore : les limites de durée souples quadratiques, plus d'une option de ramassage ou de livraison par envoi, plus d'une fenêtre de départ ou d'arrivée par véhicule, les types d'envois et les règles de précédence, les solutions injectées et la marche. Chacun est refusé avec FIELD_NOT_SUPPORTED_YET ou VALUE_NOT_SUPPORTED_YET plutôt qu'abandonné en silence, parce qu'un plan qui ignorerait une de vos contraintes serait faux sans vous le dire. Comme les limites de durée souples quadratiques, routeDistanceLimit.costPerKilometerBelowSoftMax est refusé, mais pour de bon et avec INVALID_VALUE : GMPRO ne le prend pas en charge non plus. Un identifiant de lieu Google est refusé aussi : géocodez l'adresse avec /geocode/search et envoyez des coordonnées. Champs pris en charge par Optimize donne chaque champ et son statut.

Valider sans résoudre

Envoyez "solvingMode": "VALIDATE_ONLY" pour vérifier une requête. Rien n'est calculé ni résolu, et ce n'est jamais facturé. Une requête valide répond 200 avec {}. Une requête invalide répond 200 avec chaque problème trouvé, jusqu'à maxValidationErrors (100 par défaut) :

// 200
{
  "validationErrors": [
    {
      "code": 11,
      "displayName": "MISSING_REQUIRED_FIELD",
      "fields": [{ "name": "geodesicMetersPerSecond" }],
      "errorMessage": "geodesicMetersPerSecond is required when useGeodesicDistances is true."
    }
  ]
}

Dans le mode de résolution par défaut, ces problèmes renvoient 400 INVALID_ARGUMENT, avec une violation de champ par erreur. VALIDATE_ONLY vérifie les champs et les contraintes de la requête; il ne vérifie ni l'accessibilité routière ni la possibilité de servir tous les envois ensemble. L'authentification, l'analyse du corps, sa taille et les limites du nombre d'envois ou de véhicules s'appliquent toujours et peuvent produire une réponse autre qu'un 200 avant la validation.

Limites par forfait

ForfaitEnvoisVéhiculesLieuxRésolution la plus longueRésolutions simultanées
Hobby25510010 s1
Indie5005050030 s2
Growth2 0002001 00060 s2
  • Envois compte chaque entrée de model.shipments, y compris les envois ignorés. Lieux compte les endroits distincts entre lesquels il faut se déplacer, une fois les doublons fusionnés. Une requête qui dépasse un compte est un 400 INVALID_ARGUMENT qui nomme la limite; découpez-la en requêtes plus petites.
  • Sur tous les forfaits, une requête peut utiliser au plus 16 noms de types de charge distincts, toutes ses clés loadDemands et loadLimits confondues. Un de plus est un 400 INVALID_ARGUMENT (OUT_OF_RANGE).
  • Le nombre total de cellules des matrices est limité au carré de la limite de lieux du forfait : 10 000 pour Hobby, 250 000 pour Indie et 1 000 000 pour Growth. Les matrices de plusieurs véhicules partagent cette limite. La limite de 4 Mio du corps s'applique aussi aux matrices fournies.
  • Résolution la plus longue plafonne timeout. Un délai plus long est ramené à la limite, avec un en-tête Warning: 299 - "timeout clamped to 30s for this plan" et un avertissement TIMEOUT_CLAMPED. Sans timeout, la résolution reçoit min(plafond, max(2, ceil(visites / 25))) secondes, où les visites sont les ramassages et les livraisons de la requête.
  • Résolutions simultanées vaut par compte, pour toutes ses clés. Une de plus est un 429 RESOURCE_EXHAUSTED avec Retry-After.
  • Les trajets routiers et la réponse du solveur partagent un budget de 140 secondes. Une étape qui dépasse le temps qui lui est alloué renvoie 504 DEADLINE_EXCEEDED. Le tracé facultatif des polylignes dispose de 30 secondes supplémentaires, pour un budget total maximal de 170 secondes. Une polyligne manquante ne fait jamais échouer la résolution.

Ce sont des valeurs de départ, fixées avant que le service ait été mesuré sous la charge de production, et elles peuvent changer.

Tarification

Un envoi effectué compte pour un appel des appels inclus dans votre forfait, la même réserve que celle des tuiles, du géocodage et des itinéraires. Un envoi effectué est un envoi visité sur une tournée lors d'une résolution réussie (200). Au-delà des appels inclus, Indie et Growth facturent le dépassement à leur prix habituel par appel, et Hobby s'arrête. Voir Forfaits et limites.

Gratuit :

  • VALIDATE_ONLY, quoi qu'il trouve.
  • Toute réponse autre qu'un 200 : erreurs de validation, limites, délais dépassés, pannes.
  • Chaque envoi de skippedShipments, ignoré ou non servi.
  • Un envoi résolu de nouveau dans les 24 heures qui suivent la résolution qui l'a d'abord facturé.

Contrairement aux autres points de terminaison, Optimize facture une requête provenant d'une origine de développement (localhost, *.pages.dev, *.workers.dev) comme n'importe quelle autre. Grâce à la nouvelle résolution gratuite ci-dessus, itérer sur une même requête reste peu coûteux.

Nouvelles résolutions. Les répartiteurs replanifient quand une fenêtre bouge ou qu'un chauffeur se déclare malade, et ce sont toujours les mêmes livraisons. Un envoi qui porte un label est donc reconnu par son étiquette et les lieux de ses visites, et un envoi sans étiquette par tout son contenu. Dans les 24 heures qui suivent la résolution qui l'a d'abord facturé, le même envoi est gratuit; une nouvelle résolution ne prolonge pas cette période. Une étiquette recyclée sur d'autres arrêts est un nouvel envoi. Quand la requête fournit ses propres matrices, l'identité couvre aussi les matrices et les startTags et endTags de chaque véhicule : de nouvelles données de trajet, ou un véhicule passé à une autre matrice, sont facturées de nouveau.

L'en-tête X-Unmap-Billable-Shipments indique le nombre d'envois facturables, y compris 0. Avant les trajets routiers ou la résolution, Unmap vérifie si le quota restant ou le plafond de dépenses couvre tous les nouveaux envois non ignorés de la requête. Les envois facultatifs comptent dans cette estimation, même si le solveur pourrait les écarter. Si l'estimation dépasse les appels disponibles, la requête renvoie 429 RESOURCE_EXHAUSTED avec le code de premier niveau quota_exceeded ou spend_cap.

La gratuité des nouvelles résolutions s'applique à toutes les clés d'un compte. Les envois en double dans une requête comptent comme des unités distinctes. Si la vérification de cette gratuité est indisponible après une résolution réussie, tous les envois effectués sont facturables. Consultez X-Unmap-Billable-Shipments pour connaître le nombre réel.

En-têtes de réponse

En-têteQuandQuoi
X-Unmap-Billable-Shipmentschaque 200Les envois facturés par cette requête.
X-Unmap-Optimize-Warningsquand il y a un avertissementUn tableau JSON de { code, field?, path?, count, message }, en ASCII seulement, d'au plus 4 Ko.
Warningtimeout a été ramené à la limite299 - "timeout clamped to <n>s for this plan".
Retry-After429 et 503 qu'on peut réessayerLes secondes à attendre.

Les avertissements ne changent jamais le corps de la réponse, qui garde la forme qu'attend un client Google. Les codes sont FIELD_IGNORED (un champ accepté qu'Unmap ne peut pas respecter), TIMEOUT_CLAMPED, ROAD_TRAVEL_DEGRADED et ROAD_TRAVEL_UNCONFIRMED (un budget de calcul d'itinéraires, et non le réseau routier, a décidé que certaines cellules étaient injoignables; un arrêt laissé de côté pourrait donc être servi, découpez la requête), ROUTE_POLYLINE_UNAVAILABLE et WARNINGS_TRUNCATED. Un navigateur peut lire les quatre en-têtes : la passerelle les expose par CORS.

Erreurs

Sur ces chemins, les erreurs ont la forme de celles de Google, avec la chaîne code de la passerelle à côté, pour qu'un client Google comme un client Unmap puisse les lire. Le statut est dans error.status (INVALID_ARGUMENT, FAILED_PRECONDITION, RESOURCE_EXHAUSTED, etc.), et les erreurs de validation donnent une entrée fieldViolations par problème, avec le chemin exact du champ. Là où Google peut répondre 200 en laissant de côté un envoi obligatoire, Unmap refuse avec un 400 FAILED_PRECONDITION.

Erreurs donne le corps complet, chaque statut, code de validation, avertissement et raison d'exclusion, avec la cause et le correctif.

Depuis la bibliothèque cliente

npm i @unmap/routing

optimizeTours() dans @unmap/routing envoie la clé dans X-API-Key, jamais dans l'URL, et renvoie la réponse d'Unmap au format Google, plus les informations des en-têtes. Elle est offerte dans @unmap/routing et @unmap/sdk depuis la 0.21.0.

import { optimizeTours, UnmapOptimizeError } from "@unmap/routing";
 
try {
  const { response, warnings, billableShipments, timeoutClamped } = await optimizeTours(
    {
      timeout: "10s",
      model: {
        shipments: [{ label: "order-1", deliveries: [{ arrivalLocation: { latitude: 51.05, longitude: -114.07 } }] }],
        vehicles: [{ label: "van-1", startLocation: { latitude: 51.04, longitude: -114.06 } }],
      },
    },
    { key },
  );
  console.log(response.routes, warnings, billableShipments, timeoutClamped);
} catch (e) {
  if (e instanceof UnmapOptimizeError) console.error(e.status, e.googleStatus, e.details);
}
  • Le même appel est router.optimizeTours(request) sur un Router, et unmap.router.optimizeTours(request) depuis @unmap/sdk.
  • warnings est l'en-tête X-Unmap-Optimize-Warnings décodé, billableShipments l'en-tête X-Unmap-Billable-Shipments décodé, et timeoutClamped avec clampedTimeoutSeconds disent si votre timeout a été raccourci.
  • Un échec lève UnmapOptimizeError : status est le statut HTTP, code le code de la passerelle, googleStatus le nom de statut de Google et details les error.details de Google. Les 429, 502, 503 et les pannes de transport sont réessayés par défaut.

Champs pris en charge

Chaque champ du format OptimizeToursRequest qu'utilise l'API Route Optimization de Google Maps Platform, et ce qu'en fait Unmap Optimize. Les noms et l'imbrication des champs suivent la référence REST publique de Google; les descriptions sont celles d'Unmap. Unmap n'est ni affilié à Google ni approuvé par Google.

Cette section est générée à partir de la table de champs du validateur; les vérifications du dépôt la gardent à jour. Elle compte 191 lignes : 126 pris en charge, 16 ignoré, 5 refusé, 30 prévu (V2), 14 prévu (V3).

Comment lire les tableaux

StatutCe que fait Unmap
pris en chargeRespecte le champ.
ignoréAccepte le champ sans rien en faire. Une valeur autre que celle par défaut ajoute une entrée FIELD_IGNORED à l'en-tête de réponse X-Unmap-Optimize-Warnings (une par champ, avec un compte). Jamais une erreur.
refuséRefuse le champ avec l'erreur indiquée. Unmap ne prévoit pas de le prendre en charge.
prévu (V2), prévu (V3)Refuse le champ avec FIELD_NOT_SUPPORTED_YET quand il a une valeur autre que celle par défaut, parce qu'abandonner une contrainte en silence renverrait un plan que vous n'avez pas demandé. Envoyé à sa valeur par défaut (false, 0, "0s", [], {}, une énumération _UNSPECIFIED, ou la valeur indiquée), il est accepté.

Un chemin comme model.shipments[].deliveries[].timeWindows[].startTime désigne un champ : nom[] est un élément d'un tableau, et nom{} est une valeur d'un dictionnaire dont les clés sont les vôtres (des noms de types de charge, comme loadLimits{}). Les champs situés sous un champ refusé ou ignoré ne sont pas listés, parce que rien en dessous n'est lu.

Règles qui valent pour tout le corps :

  • Les noms de champs peuvent être en camelCase ou en snake_case. Envoyer les deux graphies d'un même champ dans un même objet est une erreur CONFLICTING_FIELD_NAMES. Les clés de dictionnaire et les valeurs de chaîne ne sont jamais réécrites.
  • Un champ absent de ces tables est une erreur UNKNOWN_FIELD, pour qu'une faute de frappe n'abandonne jamais une contrainte en silence.
  • Les durées sont des chaînes comme "300s" ou "1.5s". Les horodatages sont des chaînes RFC 3339 ou { "seconds": ..., "nanos": ... }. Les entiers de 64 bits peuvent être des chaînes décimales ou des entiers JSON jusqu'à 2^53 - 1.
  • La validation s'arrête après maxValidationErrors erreurs (100 par défaut, au plus 10 000).
  • Une requête peut utiliser au plus 16 noms de types de charge distincts, comptés sur toutes les clés loadDemands et loadLimits du modèle. Le premier nom au-delà est une erreur OUT_OF_RANGE.
  • Un identifiant de lieu Google (placeId) est PLACE_ID_NOT_SUPPORTED; géocodez l'adresse avec /geocode/search et envoyez des coordonnées. Aucun champ ne prend d'URI : les méthodes par lots qui lisent les URI Cloud Storage gs:// ne sont pas offertes (elles répondent par un 404), et GCS_URI_NOT_SUPPORTED leur est réservé; rien ne le renvoie aujourd'hui.

Chaque code d'erreur est expliqué dans Erreurs.

La prise en charge des champs décrit la validation et le comportement offert. Elle ne garantit pas qu'une requête a une solution réalisable. populatePolylines tente un tracé routier pour les tournées avec coordonnées; les requêtes avec matrices fournies ne renvoient pas de polylignes. Voir les temps de trajet et les limites par forfait.

Les messages d'erreur et d'avertissement sont cités tels que l'API les renvoie, en anglais.

Champs de la requête

ChampStatutComportement
parentignoréLe projet Google Cloud auquel la requête appartient. Type string. Avertissement FIELD_IGNORED quand il est fixé : « parent is ignored: Unmap has no projects, so the request runs under the API key's account. »
timeoutpris en chargeTemps que le solveur peut consacrer à la résolution; plafonné par le forfait, avec une valeur par défaut en son absence. Type duration.
solvingModepris en chargeRésoudre le modèle, ou seulement le valider. Type enum. Valeur par défaut DEFAULT_SOLVE. Valeurs : DEFAULT_SOLVE, VALIDATE_ONLY prises en charge; DETECT_SOME_INFEASIBLE_SHIPMENTS refusée, prévue (V2); TRANSFORM_AND_RETURN_REQUEST refusée, prévue (V3).
searchModepris en chargeÉchange la qualité de la solution contre un temps de réponse plus court : RETURN_FAST cesse d'améliorer peu après la première solution, CONSUME_ALL_AVAILABLE_TIME (le comportement par défaut) cherche jusqu'à la fin du délai. Type enum. Valeurs : SEARCH_MODE_UNSPECIFIED, RETURN_FAST, CONSUME_ALL_AVAILABLE_TIME prises en charge.
injectedFirstSolutionRoutesprévu (V2)Tournées d'où part le solveur au lieu de construire sa propre première solution. Type message[]. Erreur FIELD_NOT_SUPPORTED_YET quand il a une valeur autre que celle par défaut : « injectedFirstSolutionRoutes is not supported yet (planned for V2). » Conseil : Retirez le champ ou laissez-le à sa valeur par défaut.
injectedSolutionConstraintprévu (V2)Une solution précédente dont les visites sont figées ou contraintes, pour une réoptimisation. Type message. Erreur FIELD_NOT_SUPPORTED_YET quand il a une valeur autre que celle par défaut : « injectedSolutionConstraint is not supported yet (planned for V2). » Conseil : Retirez le champ ou laissez-le à sa valeur par défaut.
refreshDetailsRoutesprévu (V2)Tournées existantes dont les horaires et les mesures sont recalculés sans nouvelle résolution. Type message[]. Erreur FIELD_NOT_SUPPORTED_YET quand il a une valeur autre que celle par défaut : « refreshDetailsRoutes is not supported yet (planned for V2). » Conseil : Retirez le champ ou laissez-le à sa valeur par défaut.
interpretInjectedSolutionsUsingLabelsprévu (V2)Associe les tournées injectées au modèle par étiquette plutôt que par indice. Type boolean. Erreur FIELD_NOT_SUPPORTED_YET quand il a une valeur autre que celle par défaut : « interpretInjectedSolutionsUsingLabels is not supported yet (planned for V2). » Conseil : Retirez le champ ou laissez-le à sa valeur par défaut.
considerRoadTrafficignoréDemande des temps de trajet qui tiennent compte de la circulation. Type boolean. Avertissement FIELD_IGNORED quand il est fixé : « considerRoadTraffic is ignored: Unmap travel times do not use live or historical traffic yet. » Ignoré plutôt que refusé : le plan reste valable avec des temps en circulation fluide, et la V3 ajoute des vitesses historiques.
populatePolylinespris en chargeAjoute une polyligne encodée pour chaque tournée utilisée, dans routes[].routePolyline. Type boolean. Valeur par défaut false.
populateTransitionPolylinesignoréDemande une polyligne encodée par transition entre deux arrêts. Type boolean. Avertissement FIELD_IGNORED quand il est fixé : « populateTransitionPolylines is ignored: Unmap returns one polyline per route, as routes[].routePolyline when populatePolylines is true. » Ignoré plutôt que refusé : la polyligne de la tournée porte la même géométrie, donc un client perd du détail, pas de l'exactitude.
allowLargeDeadlineDespiteInterruptionRiskignoréPermet un long délai sur l'infrastructure de Google, au risque d'une interruption. Type boolean. Avertissement FIELD_IGNORED quand il est fixé : « allowLargeDeadlineDespiteInterruptionRisk is ignored: Unmap caps the timeout per plan and clamps anything longer. »
useGeodesicDistancespris en chargeUtilise des distances à vol d'oiseau et une vitesse fixe au lieu des temps de trajet sur le réseau routier. Type boolean. Valeur par défaut false.
labelpris en chargeÉtiquette de la requête fournie par l'appelant, renvoyée comme requestLabel dans la réponse. Type string.
geodesicMetersPerSecondpris en chargeVitesse utilisée avec useGeodesicDistances, en mètres par seconde; au moins 1. Type number. Requis quand useGeodesicDistances vaut true : erreur MISSING_REQUIRED_FIELD.
maxValidationErrorspris en chargeNombre maximal d'erreurs de validation à renvoyer; 100 par défaut, plafonné à 10 000. Type int32. Valeur par défaut 100.

Champs du modèle

ChampStatutComportement
modelpris en chargeLes envois, les véhicules et les contraintes globales à planifier. Type object.
model.objectivesprévu (V3)Objectifs d'optimisation de rechange qui remplacent le modèle de coûts (expérimental dans GMPRO). Type message[]. Erreur FIELD_NOT_SUPPORTED_YET quand il a une valeur autre que celle par défaut : « model.objectives is not supported yet (planned for V3). » Conseil : Retirez le champ ou laissez-le à sa valeur par défaut.
model.globalStartTimepris en chargeDébut de l'horizon de planification; rien ne se passe avant. Type timestamp. Valeur par défaut 1970-01-01T00:00:00Z.
model.globalEndTimepris en chargeFin de l'horizon de planification; rien ne se passe après. Au plus 999 999 999 secondes (environ 31 ans) après globalStartTime. Type timestamp. Valeur par défaut 1971-01-01T00:00:00Z.
model.globalDurationCostPerHourprévu (V2)Coût horaire de toute la durée du plan, du départ le plus hâtif à l'arrivée la plus tardive. Type number. Erreur FIELD_NOT_SUPPORTED_YET quand il a une valeur autre que celle par défaut : « model.globalDurationCostPerHour is not supported yet (planned for V2). » Conseil : Retirez le champ ou laissez-le à sa valeur par défaut.
model.durationDistanceMatricespris en chargeDurées et distances de trajet fournies par l'appelant, utilisées au lieu du réseau routier ou du vol d'oiseau. Avec elles, chaque arrêt est placé par balises : les visites et les véhicules ne doivent pas porter de coordonnées, et useGeodesicDistances ne doit pas valoir true. Type object[].
model.durationDistanceMatrices[].rowspris en chargeUne ligne par balise d'origine, dans l'ordre de durationDistanceMatrixSrcTags. Type object[].
model.durationDistanceMatrices[].rows[].durationspris en chargeDurées de trajet de l'origine de cette ligne vers chaque balise de destination. Type duration[].
model.durationDistanceMatrices[].rows[].meterspris en chargeDistances de trajet en mètres de l'origine de cette ligne vers chaque balise de destination. Type number[].
model.durationDistanceMatrices[].vehicleStartTagpris en chargeLa balise de départ de véhicule qui sélectionne cette matrice; les startTags de chaque véhicule doivent en désigner exactement une. Vide, la matrice s'applique à tous les véhicules, ce qui n'est permis que s'il n'y a qu'une matrice. Type string.
model.durationDistanceMatrixSrcTagspris en chargeBalises qui nomment les lignes des matrices; uniques, non vides, et requises exactement quand durationDistanceMatrices est présent. Type string[].
model.durationDistanceMatrixDstTagspris en chargeBalises qui nomment les colonnes des matrices; uniques, non vides, et requises exactement quand durationDistanceMatrices est présent. Type string[].
model.transitionAttributesprévu (V3)Coûts, délais et limites supplémentaires sur les trajets entre arrêts balisés. Type message[]. Erreur FIELD_NOT_SUPPORTED_YET quand il a une valeur autre que celle par défaut : « model.transitionAttributes is not supported yet (planned for V3). » Conseil : Retirez le champ ou laissez-le à sa valeur par défaut.
model.shipmentTypeIncompatibilitiesprévu (V2)Types d'envois qui ne doivent pas partager un véhicule. Type message[]. Erreur FIELD_NOT_SUPPORTED_YET quand il a une valeur autre que celle par défaut : « model.shipmentTypeIncompatibilities is not supported yet (planned for V2). » Conseil : Retirez le champ ou laissez-le à sa valeur par défaut.
model.shipmentTypeRequirementsprévu (V2)Types d'envois qui exigent un autre type dans le même véhicule. Type message[]. Erreur FIELD_NOT_SUPPORTED_YET quand il a une valeur autre que celle par défaut : « model.shipmentTypeRequirements is not supported yet (planned for V2). » Conseil : Retirez le champ ou laissez-le à sa valeur par défaut.
model.precedenceRulesprévu (V3)Règles d'ordre entre les visites d'envois différents. Type message[]. Erreur FIELD_NOT_SUPPORTED_YET quand il a une valeur autre que celle par défaut : « model.precedenceRules is not supported yet (planned for V3). » Conseil : Retirez le champ ou laissez-le à sa valeur par défaut.
model.maxActiveVehiclesprévu (V2)Nombre maximal de véhicules que le plan peut utiliser. Type int32. Erreur FIELD_NOT_SUPPORTED_YET quand il a une valeur autre que celle par défaut : « model.maxActiveVehicles is not supported yet (planned for V2). » Conseil : Retirez le champ ou laissez-le à sa valeur par défaut.

Champs des envois

ChampStatutComportement
model.shipmentspris en chargeTout ce qu'il faut ramasser ou livrer. Type object[].
model.shipments[].displayNamepris en chargeNom destiné aux personnes; il n'influe pas sur la résolution. Type string.
model.shipments[].pickupspris en chargeLe ramassage de l'envoi; la V1 en accepte au plus un. Type object[]. Plus de 1 : erreur VALUE_NOT_SUPPORTED_YET, « A shipment with more than one pickup alternative is not supported yet (planned for V2). »
model.shipments[].pickups[].arrivalLocationpris en chargeCoordonnées de l'arrêt de ramassage, en degrés WGS84; envoyez ce champ ou arrivalWaypoint, et aucun des deux quand le modèle a des durationDistanceMatrices. Type object.
model.shipments[].pickups[].arrivalLocation.latitudepris en chargeLatitude en degrés, de -90 à 90. Type number. Valeur par défaut 0.
model.shipments[].pickups[].arrivalLocation.longitudepris en chargeLongitude en degrés, de -180 à 180. Type number. Valeur par défaut 0.
model.shipments[].pickups[].arrivalWaypointpris en chargeL'arrêt de ramassage sous forme de point de passage; envoyez ce champ ou arrivalLocation, pas les deux. Type object.
model.shipments[].pickups[].arrivalWaypoint.locationpris en chargeLa position du point de passage; requise, parce que les identifiants de lieu ne sont pas pris en charge. Type object.
model.shipments[].pickups[].arrivalWaypoint.location.latLngpris en chargeCoordonnées du point de passage, en degrés WGS84. Type object.
model.shipments[].pickups[].arrivalWaypoint.location.latLng.latitudepris en chargeLatitude en degrés, de -90 à 90. Type number. Valeur par défaut 0.
model.shipments[].pickups[].arrivalWaypoint.location.latLng.longitudepris en chargeLongitude en degrés, de -180 à 180. Type number. Valeur par défaut 0.
model.shipments[].pickups[].arrivalWaypoint.location.headingignoréCap du déplacement au point de passage, en degrés. Type int32. Avertissement FIELD_IGNORED quand il est fixé : « location.heading is ignored: Unmap snaps a location to the nearest road whatever the direction of travel. » Ignoré plutôt que refusé : il ne fait qu'affiner la façon dont un véhicule aborde un arrêt, donc les plans restent réalisables et les clients qui le fixent sur chaque point de passage continuent de fonctionner; les temps de trajet peuvent différer légèrement de ceux de Google.
model.shipments[].pickups[].arrivalWaypoint.placeIdrefuséUn identifiant Google Places pour le point de passage. Type string. Erreur PLACE_ID_NOT_SUPPORTED quand il est fixé : « Google place IDs are not supported: Unmap cannot resolve them. » Conseil : Géocodez l'adresse avec /geocode/search d'Unmap et envoyez ses coordonnées dans arrivalWaypoint.location.latLng ou arrivalLocation. Refusé : un identifiant de lieu renvoie à la base de données de Google, et deviner un emplacement pour lui mènerait au mauvais endroit.
model.shipments[].pickups[].arrivalWaypoint.sideOfRoadignoréDemande que le véhicule s'arrête du côté de la rue où se trouve le point de passage. Type boolean. Avertissement FIELD_IGNORED quand il est fixé : « sideOfRoad is ignored: Unmap travel times do not model which side of the road a stop is on. » Ignoré plutôt que refusé : il ne fait qu'affiner la façon dont un véhicule aborde un arrêt, donc les plans restent réalisables et les clients qui le fixent sur chaque point de passage continuent de fonctionner; les temps de trajet peuvent différer légèrement de ceux de Google.
model.shipments[].pickups[].arrivalWaypoint.vehicleStopoverignoréDésigne le point de passage comme un endroit où le véhicule s'arrête pour ramasser ou déposer. Type boolean. Avertissement FIELD_IGNORED quand il est fixé : « vehicleStopover is ignored: Unmap snaps every stop to the nearest road a vehicle can use. » Ignoré plutôt que refusé : chaque arrêt Unmap est déjà traité comme un arrêt sur une route carrossable.
model.shipments[].pickups[].departureLocationprévu (V2)L'endroit d'où le véhicule repart après le ramassage, quand il diffère de celui où il est arrivé. Type object. Erreur FIELD_NOT_SUPPORTED_YET quand il a une valeur autre que celle par défaut : « model.shipments[].pickups[].departureLocation is not supported yet (planned for V2). » Conseil : Retirez le champ ou laissez-le à sa valeur par défaut.
model.shipments[].pickups[].departureWaypointprévu (V2)Le point de passage d'où le véhicule repart après le ramassage, quand il diffère de celui où il est arrivé. Type object. Erreur FIELD_NOT_SUPPORTED_YET quand il a une valeur autre que celle par défaut : « model.shipments[].pickups[].departureWaypoint is not supported yet (planned for V2). » Conseil : Retirez le champ ou laissez-le à sa valeur par défaut.
model.shipments[].pickups[].tagspris en chargeBalises qui placent le ramassage dans les lignes et les colonnes de durationDistanceMatrices; uniques et non vides, et requises quand le modèle a des matrices. Type string[].
model.shipments[].pickups[].timeWindowspris en chargeFenêtres horaires strictes pour le début du ramassage; triées, sans chevauchement et non contiguës. Type object[].
model.shipments[].pickups[].timeWindows[].startTimepris en chargeHeure permise la plus hâtive; model.globalStartTime par défaut. Type timestamp.
model.shipments[].pickups[].timeWindows[].endTimepris en chargeHeure permise la plus tardive; model.globalEndTime par défaut. Type timestamp.
model.shipments[].pickups[].timeWindows[].softStartTimepris en chargeDébut souple : un événement qui a lieu avant est permis et coûte costPerHourBeforeSoftStartTime par heure d'avance. Seulement sur une liste d'une seule fenêtre, à startTime ou après, dans la fenêtre globale. Type timestamp.
model.shipments[].pickups[].timeWindows[].softEndTimepris en chargeFin souple : un événement qui a lieu après est permis et coûte costPerHourAfterSoftEndTime par heure de retard. Seulement sur une liste d'une seule fenêtre, à endTime ou avant, dans la fenêtre globale. Type timestamp.
model.shipments[].pickups[].timeWindows[].costPerHourBeforeSoftStartTimepris en chargeCoût horaire d'un événement avant softStartTime; exige softStartTime. Type number.
model.shipments[].pickups[].timeWindows[].costPerHourAfterSoftEndTimepris en chargeCoût horaire d'un événement après softEndTime; exige softEndTime. Type number.
model.shipments[].pickups[].durationpris en chargeTemps passé à l'arrêt pour effectuer le ramassage. Type duration. Valeur par défaut 0s.
model.shipments[].pickups[].costprévu (V2)Coût supplémentaire pour choisir cette option de ramassage plutôt qu'une autre. Type number. Erreur FIELD_NOT_SUPPORTED_YET quand il a une valeur autre que celle par défaut : « model.shipments[].pickups[].cost is not supported yet (planned for V2). » Conseil : Retirez le champ ou laissez-le à sa valeur par défaut.
model.shipments[].pickups[].loadDemandsprévu (V2)Variations de charge qui s'appliquent seulement quand cette option de ramassage est choisie. Type map<string, object>. Erreur FIELD_NOT_SUPPORTED_YET quand il a une valeur autre que celle par défaut : « model.shipments[].pickups[].loadDemands is not supported yet (planned for V2). » Conseil : Retirez le champ ou laissez-le à sa valeur par défaut.
model.shipments[].pickups[].visitTypesprévu (V2)Types qui ajoutent au ramassage une durée supplémentaire propre au véhicule. Type string[]. Erreur FIELD_NOT_SUPPORTED_YET quand il a une valeur autre que celle par défaut : « model.shipments[].pickups[].visitTypes is not supported yet (planned for V2). » Conseil : Retirez le champ ou laissez-le à sa valeur par défaut.
model.shipments[].pickups[].labelpris en chargeÉtiquette du ramassage fournie par l'appelant, renvoyée comme visitLabel dans la réponse. Type string.
model.shipments[].pickups[].avoidUTurnsprévu (V3)Demande des tournées qui évitent les demi-tours à l'arrêt de ramassage (expérimental dans GMPRO). Type boolean. Erreur FIELD_NOT_SUPPORTED_YET quand il a une valeur autre que celle par défaut : « model.shipments[].pickups[].avoidUTurns is not supported yet (planned for V3). » Conseil : Retirez le champ ou laissez-le à sa valeur par défaut.
model.shipments[].deliveriespris en chargeLa livraison de l'envoi; la V1 en accepte au plus une. Type object[]. Plus de 1 : erreur VALUE_NOT_SUPPORTED_YET, « A shipment with more than one delivery alternative is not supported yet (planned for V2). »
model.shipments[].deliveries[].arrivalLocationpris en chargeCoordonnées de l'arrêt de livraison, en degrés WGS84; envoyez ce champ ou arrivalWaypoint, et aucun des deux quand le modèle a des durationDistanceMatrices. Type object.
model.shipments[].deliveries[].arrivalLocation.latitudepris en chargeLatitude en degrés, de -90 à 90. Type number. Valeur par défaut 0.
model.shipments[].deliveries[].arrivalLocation.longitudepris en chargeLongitude en degrés, de -180 à 180. Type number. Valeur par défaut 0.
model.shipments[].deliveries[].arrivalWaypointpris en chargeL'arrêt de livraison sous forme de point de passage; envoyez ce champ ou arrivalLocation, pas les deux. Type object.
model.shipments[].deliveries[].arrivalWaypoint.locationpris en chargeLa position du point de passage; requise, parce que les identifiants de lieu ne sont pas pris en charge. Type object.
model.shipments[].deliveries[].arrivalWaypoint.location.latLngpris en chargeCoordonnées du point de passage, en degrés WGS84. Type object.
model.shipments[].deliveries[].arrivalWaypoint.location.latLng.latitudepris en chargeLatitude en degrés, de -90 à 90. Type number. Valeur par défaut 0.
model.shipments[].deliveries[].arrivalWaypoint.location.latLng.longitudepris en chargeLongitude en degrés, de -180 à 180. Type number. Valeur par défaut 0.
model.shipments[].deliveries[].arrivalWaypoint.location.headingignoréCap du déplacement au point de passage, en degrés. Type int32. Avertissement FIELD_IGNORED quand il est fixé : « location.heading is ignored: Unmap snaps a location to the nearest road whatever the direction of travel. » Ignoré plutôt que refusé : il ne fait qu'affiner la façon dont un véhicule aborde un arrêt, donc les plans restent réalisables et les clients qui le fixent sur chaque point de passage continuent de fonctionner; les temps de trajet peuvent différer légèrement de ceux de Google.
model.shipments[].deliveries[].arrivalWaypoint.placeIdrefuséUn identifiant Google Places pour le point de passage. Type string. Erreur PLACE_ID_NOT_SUPPORTED quand il est fixé : « Google place IDs are not supported: Unmap cannot resolve them. » Conseil : Géocodez l'adresse avec /geocode/search d'Unmap et envoyez ses coordonnées dans arrivalWaypoint.location.latLng ou arrivalLocation. Refusé : un identifiant de lieu renvoie à la base de données de Google, et deviner un emplacement pour lui mènerait au mauvais endroit.
model.shipments[].deliveries[].arrivalWaypoint.sideOfRoadignoréDemande que le véhicule s'arrête du côté de la rue où se trouve le point de passage. Type boolean. Avertissement FIELD_IGNORED quand il est fixé : « sideOfRoad is ignored: Unmap travel times do not model which side of the road a stop is on. » Ignoré plutôt que refusé : il ne fait qu'affiner la façon dont un véhicule aborde un arrêt, donc les plans restent réalisables et les clients qui le fixent sur chaque point de passage continuent de fonctionner; les temps de trajet peuvent différer légèrement de ceux de Google.
model.shipments[].deliveries[].arrivalWaypoint.vehicleStopoverignoréDésigne le point de passage comme un endroit où le véhicule s'arrête pour ramasser ou déposer. Type boolean. Avertissement FIELD_IGNORED quand il est fixé : « vehicleStopover is ignored: Unmap snaps every stop to the nearest road a vehicle can use. » Ignoré plutôt que refusé : chaque arrêt Unmap est déjà traité comme un arrêt sur une route carrossable.
model.shipments[].deliveries[].departureLocationprévu (V2)L'endroit d'où le véhicule repart après la livraison, quand il diffère de celui où il est arrivé. Type object. Erreur FIELD_NOT_SUPPORTED_YET quand il a une valeur autre que celle par défaut : « model.shipments[].deliveries[].departureLocation is not supported yet (planned for V2). » Conseil : Retirez le champ ou laissez-le à sa valeur par défaut.
model.shipments[].deliveries[].departureWaypointprévu (V2)Le point de passage d'où le véhicule repart après la livraison, quand il diffère de celui où il est arrivé. Type object. Erreur FIELD_NOT_SUPPORTED_YET quand il a une valeur autre que celle par défaut : « model.shipments[].deliveries[].departureWaypoint is not supported yet (planned for V2). » Conseil : Retirez le champ ou laissez-le à sa valeur par défaut.
model.shipments[].deliveries[].tagspris en chargeBalises qui placent la livraison dans les lignes et les colonnes de durationDistanceMatrices; uniques et non vides, et requises quand le modèle a des matrices. Type string[].
model.shipments[].deliveries[].timeWindowspris en chargeFenêtres horaires strictes pour le début de la livraison; triées, sans chevauchement et non contiguës. Type object[].
model.shipments[].deliveries[].timeWindows[].startTimepris en chargeHeure permise la plus hâtive; model.globalStartTime par défaut. Type timestamp.
model.shipments[].deliveries[].timeWindows[].endTimepris en chargeHeure permise la plus tardive; model.globalEndTime par défaut. Type timestamp.
model.shipments[].deliveries[].timeWindows[].softStartTimepris en chargeDébut souple : un événement qui a lieu avant est permis et coûte costPerHourBeforeSoftStartTime par heure d'avance. Seulement sur une liste d'une seule fenêtre, à startTime ou après, dans la fenêtre globale. Type timestamp.
model.shipments[].deliveries[].timeWindows[].softEndTimepris en chargeFin souple : un événement qui a lieu après est permis et coûte costPerHourAfterSoftEndTime par heure de retard. Seulement sur une liste d'une seule fenêtre, à endTime ou avant, dans la fenêtre globale. Type timestamp.
model.shipments[].deliveries[].timeWindows[].costPerHourBeforeSoftStartTimepris en chargeCoût horaire d'un événement avant softStartTime; exige softStartTime. Type number.
model.shipments[].deliveries[].timeWindows[].costPerHourAfterSoftEndTimepris en chargeCoût horaire d'un événement après softEndTime; exige softEndTime. Type number.
model.shipments[].deliveries[].durationpris en chargeTemps passé à l'arrêt pour effectuer la livraison. Type duration. Valeur par défaut 0s.
model.shipments[].deliveries[].costprévu (V2)Coût supplémentaire pour choisir cette option de livraison plutôt qu'une autre. Type number. Erreur FIELD_NOT_SUPPORTED_YET quand il a une valeur autre que celle par défaut : « model.shipments[].deliveries[].cost is not supported yet (planned for V2). » Conseil : Retirez le champ ou laissez-le à sa valeur par défaut.
model.shipments[].deliveries[].loadDemandsprévu (V2)Variations de charge qui s'appliquent seulement quand cette option de livraison est choisie. Type map<string, object>. Erreur FIELD_NOT_SUPPORTED_YET quand il a une valeur autre que celle par défaut : « model.shipments[].deliveries[].loadDemands is not supported yet (planned for V2). » Conseil : Retirez le champ ou laissez-le à sa valeur par défaut.
model.shipments[].deliveries[].visitTypesprévu (V2)Types qui ajoutent à la livraison une durée supplémentaire propre au véhicule. Type string[]. Erreur FIELD_NOT_SUPPORTED_YET quand il a une valeur autre que celle par défaut : « model.shipments[].deliveries[].visitTypes is not supported yet (planned for V2). » Conseil : Retirez le champ ou laissez-le à sa valeur par défaut.
model.shipments[].deliveries[].labelpris en chargeÉtiquette de la livraison fournie par l'appelant, renvoyée comme visitLabel dans la réponse. Type string.
model.shipments[].deliveries[].avoidUTurnsprévu (V3)Demande des tournées qui évitent les demi-tours à l'arrêt de livraison (expérimental dans GMPRO). Type boolean. Erreur FIELD_NOT_SUPPORTED_YET quand il a une valeur autre que celle par défaut : « model.shipments[].deliveries[].avoidUTurns is not supported yet (planned for V3). » Conseil : Retirez le champ ou laissez-le à sa valeur par défaut.
model.shipments[].loadDemandspris en chargeCharge que l'envoi ajoute à son ramassage et retire à sa livraison, par nom de type de charge. Une requête peut utiliser au plus 16 noms de types de charge distincts, tous les dictionnaires loadDemands et loadLimits confondus : erreur OUT_OF_RANGE au-delà. Type map<string, object>.
model.shipments[].loadDemands{}.amountpris en chargeUnités de ce type de charge. Les quantités d'un même type, sur tous les ramassages et toutes les livraisons de la requête, doivent totaliser au plus 2^53 - 1. Type int64. Valeur par défaut 0.
model.shipments[].penaltyCostpris en chargeCoût de ne pas servir l'envoi; absent, l'envoi est obligatoire. Type number.
model.shipments[].allowedVehicleIndicespris en chargeIndices des seuls véhicules qui peuvent servir l'envoi; vide, n'importe lequel le peut. Type int32[].
model.shipments[].costsPerVehicleprévu (V2)Coût supplémentaire quand un véhicule donné sert l'envoi. Type number[]. Erreur FIELD_NOT_SUPPORTED_YET quand il a une valeur autre que celle par défaut : « model.shipments[].costsPerVehicle is not supported yet (planned for V2). » Conseil : Retirez le champ ou laissez-le à sa valeur par défaut.
model.shipments[].costsPerVehicleIndicesprévu (V2)Les véhicules auxquels costsPerVehicle fait référence. Type int32[]. Erreur FIELD_NOT_SUPPORTED_YET quand il a une valeur autre que celle par défaut : « model.shipments[].costsPerVehicleIndices is not supported yet (planned for V2). » Conseil : Retirez le champ ou laissez-le à sa valeur par défaut.
model.shipments[].pickupToDeliveryRelativeDetourLimitprévu (V2)Durée maximale permise entre le ramassage et la livraison, relative au trajet direct. Type number. Erreur FIELD_NOT_SUPPORTED_YET quand il a une valeur autre que celle par défaut : « model.shipments[].pickupToDeliveryRelativeDetourLimit is not supported yet (planned for V2). » Conseil : Retirez le champ ou laissez-le à sa valeur par défaut.
model.shipments[].pickupToDeliveryAbsoluteDetourLimitprévu (V2)Temps supplémentaire maximal permis entre le ramassage et la livraison par rapport au trajet direct. Type duration. Erreur FIELD_NOT_SUPPORTED_YET quand il a une valeur autre que celle par défaut : « model.shipments[].pickupToDeliveryAbsoluteDetourLimit is not supported yet (planned for V2). » Conseil : Retirez le champ ou laissez-le à sa valeur par défaut.
model.shipments[].pickupToDeliveryTimeLimitprévu (V2)Durée maximale permise entre le début du ramassage et le début de la livraison. Type duration. Erreur FIELD_NOT_SUPPORTED_YET quand il a une valeur autre que celle par défaut : « model.shipments[].pickupToDeliveryTimeLimit is not supported yet (planned for V2). » Conseil : Retirez le champ ou laissez-le à sa valeur par défaut.
model.shipments[].shipmentTypeprévu (V2)Nom de type utilisé par les règles d'incompatibilité et d'exigence. Type string. Erreur FIELD_NOT_SUPPORTED_YET quand il a une valeur autre que celle par défaut : « model.shipments[].shipmentType is not supported yet (planned for V2). » Conseil : Retirez le champ ou laissez-le à sa valeur par défaut.
model.shipments[].labelpris en chargeÉtiquette de l'envoi fournie par l'appelant, renvoyée comme shipmentLabel et utilisée pour reconnaître les nouvelles résolutions à la facturation. Type string.
model.shipments[].ignorepris en chargeÀ true, l'envoi est exclu de la résolution, inscrit dans skippedShipments avec la raison SHIPMENT_IGNORED, et n'est pas facturé. Type boolean. Valeur par défaut false.

Champs des véhicules

ChampStatutComportement
model.vehiclespris en chargeLe parc de véhicules qui effectue les envois. Type object[].
model.vehicles[].displayNamepris en chargeNom destiné aux personnes; il n'influe pas sur la résolution. Type string.
model.vehicles[].travelModepris en chargeMode de déplacement du véhicule; la V1 conduit. Type enum. Valeur par défaut DRIVING. Valeurs : TRAVEL_MODE_UNSPECIFIED, DRIVING prises en charge; WALKING refusée, prévue (V2).
model.vehicles[].routeModifiersprévu (V3)Préférences routières, comme éviter les péages, les autoroutes ou les traversiers. Type object. Erreur FIELD_NOT_SUPPORTED_YET quand il a une valeur autre que celle par défaut : « model.vehicles[].routeModifiers is not supported yet (planned for V3). » Conseil : Retirez le champ ou laissez-le à sa valeur par défaut.
model.vehicles[].startLocationpris en chargePoint de départ du véhicule, en degrés WGS84; sans lieu ni point de passage de départ, la tournée commence à son premier arrêt. Interdit quand le modèle a des durationDistanceMatrices. Type object.
model.vehicles[].startLocation.latitudepris en chargeLatitude en degrés, de -90 à 90. Type number. Valeur par défaut 0.
model.vehicles[].startLocation.longitudepris en chargeLongitude en degrés, de -180 à 180. Type number. Valeur par défaut 0.
model.vehicles[].startWaypointpris en chargeLe départ du véhicule sous forme de point de passage; envoyez ce champ ou startLocation, pas les deux. Type object.
model.vehicles[].startWaypoint.locationpris en chargeLa position du point de passage; requise, parce que les identifiants de lieu ne sont pas pris en charge. Type object.
model.vehicles[].startWaypoint.location.latLngpris en chargeCoordonnées du point de passage, en degrés WGS84. Type object.
model.vehicles[].startWaypoint.location.latLng.latitudepris en chargeLatitude en degrés, de -90 à 90. Type number. Valeur par défaut 0.
model.vehicles[].startWaypoint.location.latLng.longitudepris en chargeLongitude en degrés, de -180 à 180. Type number. Valeur par défaut 0.
model.vehicles[].startWaypoint.location.headingignoréCap du déplacement au point de passage, en degrés. Type int32. Avertissement FIELD_IGNORED quand il est fixé : « location.heading is ignored: Unmap snaps a location to the nearest road whatever the direction of travel. » Ignoré plutôt que refusé : il ne fait qu'affiner la façon dont un véhicule aborde un arrêt, donc les plans restent réalisables et les clients qui le fixent sur chaque point de passage continuent de fonctionner; les temps de trajet peuvent différer légèrement de ceux de Google.
model.vehicles[].startWaypoint.placeIdrefuséUn identifiant Google Places pour le point de passage. Type string. Erreur PLACE_ID_NOT_SUPPORTED quand il est fixé : « Google place IDs are not supported: Unmap cannot resolve them. » Conseil : Géocodez l'adresse avec /geocode/search d'Unmap et envoyez ses coordonnées dans startWaypoint.location.latLng ou startLocation. Refusé : un identifiant de lieu renvoie à la base de données de Google, et deviner un emplacement pour lui mènerait au mauvais endroit.
model.vehicles[].startWaypoint.sideOfRoadignoréDemande que le véhicule s'arrête du côté de la rue où se trouve le point de passage. Type boolean. Avertissement FIELD_IGNORED quand il est fixé : « sideOfRoad is ignored: Unmap travel times do not model which side of the road a stop is on. » Ignoré plutôt que refusé : il ne fait qu'affiner la façon dont un véhicule aborde un arrêt, donc les plans restent réalisables et les clients qui le fixent sur chaque point de passage continuent de fonctionner; les temps de trajet peuvent différer légèrement de ceux de Google.
model.vehicles[].startWaypoint.vehicleStopoverignoréDésigne le point de passage comme un endroit où le véhicule s'arrête pour ramasser ou déposer. Type boolean. Avertissement FIELD_IGNORED quand il est fixé : « vehicleStopover is ignored: Unmap snaps every stop to the nearest road a vehicle can use. » Ignoré plutôt que refusé : chaque arrêt Unmap est déjà traité comme un arrêt sur une route carrossable.
model.vehicles[].startTagspris en chargeBalises qui placent le départ du véhicule dans durationDistanceMatrices et choisissent sa matrice par vehicleStartTag; uniques et non vides; sans startTags, la tournée commence à son premier arrêt. Type string[].
model.vehicles[].startTimeWindowspris en chargeFenêtre horaire stricte pour l'heure de départ du véhicule; la V1 en accepte au plus une (GMPRO en permet plusieurs, triées, sans chevauchement et non contiguës). Type object[]. Plus de 1 : erreur VALUE_NOT_SUPPORTED_YET, « A vehicle with more than one startTimeWindows entry is not supported yet (planned for V2). »
model.vehicles[].startTimeWindows[].startTimepris en chargeHeure permise la plus hâtive; model.globalStartTime par défaut. Type timestamp.
model.vehicles[].startTimeWindows[].endTimepris en chargeHeure permise la plus tardive; model.globalEndTime par défaut. Type timestamp.
model.vehicles[].startTimeWindows[].softStartTimepris en chargeDébut souple : un événement qui a lieu avant est permis et coûte costPerHourBeforeSoftStartTime par heure d'avance. Seulement sur une liste d'une seule fenêtre, à startTime ou après, dans la fenêtre globale. Type timestamp.
model.vehicles[].startTimeWindows[].softEndTimepris en chargeFin souple : un événement qui a lieu après est permis et coûte costPerHourAfterSoftEndTime par heure de retard. Seulement sur une liste d'une seule fenêtre, à endTime ou avant, dans la fenêtre globale. Type timestamp.
model.vehicles[].startTimeWindows[].costPerHourBeforeSoftStartTimepris en chargeCoût horaire d'un événement avant softStartTime; exige softStartTime. Type number.
model.vehicles[].startTimeWindows[].costPerHourAfterSoftEndTimepris en chargeCoût horaire d'un événement après softEndTime; exige softEndTime. Type number.
model.vehicles[].endLocationpris en chargePoint d'arrivée du véhicule, en degrés WGS84; sans lieu ni point de passage d'arrivée, la tournée se termine à son dernier arrêt. Interdit quand le modèle a des durationDistanceMatrices. Type object.
model.vehicles[].endLocation.latitudepris en chargeLatitude en degrés, de -90 à 90. Type number. Valeur par défaut 0.
model.vehicles[].endLocation.longitudepris en chargeLongitude en degrés, de -180 à 180. Type number. Valeur par défaut 0.
model.vehicles[].endWaypointpris en chargeL'arrivée du véhicule sous forme de point de passage; envoyez ce champ ou endLocation, pas les deux. Type object.
model.vehicles[].endWaypoint.locationpris en chargeLa position du point de passage; requise, parce que les identifiants de lieu ne sont pas pris en charge. Type object.
model.vehicles[].endWaypoint.location.latLngpris en chargeCoordonnées du point de passage, en degrés WGS84. Type object.
model.vehicles[].endWaypoint.location.latLng.latitudepris en chargeLatitude en degrés, de -90 à 90. Type number. Valeur par défaut 0.
model.vehicles[].endWaypoint.location.latLng.longitudepris en chargeLongitude en degrés, de -180 à 180. Type number. Valeur par défaut 0.
model.vehicles[].endWaypoint.location.headingignoréCap du déplacement au point de passage, en degrés. Type int32. Avertissement FIELD_IGNORED quand il est fixé : « location.heading is ignored: Unmap snaps a location to the nearest road whatever the direction of travel. » Ignoré plutôt que refusé : il ne fait qu'affiner la façon dont un véhicule aborde un arrêt, donc les plans restent réalisables et les clients qui le fixent sur chaque point de passage continuent de fonctionner; les temps de trajet peuvent différer légèrement de ceux de Google.
model.vehicles[].endWaypoint.placeIdrefuséUn identifiant Google Places pour le point de passage. Type string. Erreur PLACE_ID_NOT_SUPPORTED quand il est fixé : « Google place IDs are not supported: Unmap cannot resolve them. » Conseil : Géocodez l'adresse avec /geocode/search d'Unmap et envoyez ses coordonnées dans endWaypoint.location.latLng ou endLocation. Refusé : un identifiant de lieu renvoie à la base de données de Google, et deviner un emplacement pour lui mènerait au mauvais endroit.
model.vehicles[].endWaypoint.sideOfRoadignoréDemande que le véhicule s'arrête du côté de la rue où se trouve le point de passage. Type boolean. Avertissement FIELD_IGNORED quand il est fixé : « sideOfRoad is ignored: Unmap travel times do not model which side of the road a stop is on. » Ignoré plutôt que refusé : il ne fait qu'affiner la façon dont un véhicule aborde un arrêt, donc les plans restent réalisables et les clients qui le fixent sur chaque point de passage continuent de fonctionner; les temps de trajet peuvent différer légèrement de ceux de Google.
model.vehicles[].endWaypoint.vehicleStopoverignoréDésigne le point de passage comme un endroit où le véhicule s'arrête pour ramasser ou déposer. Type boolean. Avertissement FIELD_IGNORED quand il est fixé : « vehicleStopover is ignored: Unmap snaps every stop to the nearest road a vehicle can use. » Ignoré plutôt que refusé : chaque arrêt Unmap est déjà traité comme un arrêt sur une route carrossable.
model.vehicles[].endTagspris en chargeBalises qui placent l'arrivée du véhicule dans durationDistanceMatrices; uniques et non vides; sans endTags, la tournée se termine à son dernier arrêt. Type string[].
model.vehicles[].endTimeWindowspris en chargeFenêtre horaire stricte pour l'heure d'arrivée du véhicule; la V1 en accepte au plus une (GMPRO en permet plusieurs, triées, sans chevauchement et non contiguës). Elle ne doit pas se fermer avant l'ouverture de startTimeWindows. Type object[]. Plus de 1 : erreur VALUE_NOT_SUPPORTED_YET, « A vehicle with more than one endTimeWindows entry is not supported yet (planned for V2). »
model.vehicles[].endTimeWindows[].startTimepris en chargeHeure permise la plus hâtive; model.globalStartTime par défaut. Type timestamp.
model.vehicles[].endTimeWindows[].endTimepris en chargeHeure permise la plus tardive; model.globalEndTime par défaut. Type timestamp.
model.vehicles[].endTimeWindows[].softStartTimepris en chargeDébut souple : un événement qui a lieu avant est permis et coûte costPerHourBeforeSoftStartTime par heure d'avance. Seulement sur une liste d'une seule fenêtre, à startTime ou après, dans la fenêtre globale. Type timestamp.
model.vehicles[].endTimeWindows[].softEndTimepris en chargeFin souple : un événement qui a lieu après est permis et coûte costPerHourAfterSoftEndTime par heure de retard. Seulement sur une liste d'une seule fenêtre, à endTime ou avant, dans la fenêtre globale. Type timestamp.
model.vehicles[].endTimeWindows[].costPerHourBeforeSoftStartTimepris en chargeCoût horaire d'un événement avant softStartTime; exige softStartTime. Type number.
model.vehicles[].endTimeWindows[].costPerHourAfterSoftEndTimepris en chargeCoût horaire d'un événement après softEndTime; exige softEndTime. Type number.
model.vehicles[].unloadingPolicyprévu (V3)Ordre des livraisons : dernier entré, premier sorti, ou premier entré, premier sorti. Type enum. Erreur FIELD_NOT_SUPPORTED_YET quand il a une valeur autre que celle par défaut : « model.vehicles[].unloadingPolicy is not supported yet (planned for V3). » Conseil : Retirez le champ ou laissez-le à sa valeur par défaut.
model.vehicles[].loadLimitspris en chargeCapacité par nom de type de charge. Ses clés comptent parmi les 16 types de charge distincts qu'une requête peut utiliser. Type map<string, object>.
model.vehicles[].loadLimits{}.maxLoadpris en chargeNombre maximal d'unités de ce type de charge que le véhicule peut transporter à la fois; absent, sans limite. Type int64.
model.vehicles[].loadLimits{}.softMaxLoadpris en chargeCharge au-delà de laquelle chaque unité supplémentaire coûte costPerUnitAboveSoftMax; 0 si absente. Ne coûte rien sans un coût supérieur à 0. Type int64.
model.vehicles[].loadLimits{}.costPerUnitAboveSoftMaxpris en chargeCoût par unité de charge maximale au-delà de softMaxLoad (0 si absente). Un coût supérieur à 0 exige un type de charge que seuls les ramassages ou seules les livraisons utilisent. Type number.
model.vehicles[].loadLimits{}.startLoadIntervalprévu (V2)Charge permise au départ de la tournée. Type object. Erreur FIELD_NOT_SUPPORTED_YET quand il a une valeur autre que celle par défaut : « model.vehicles[].loadLimits{}.startLoadInterval is not supported yet (planned for V2). » Conseil : Retirez le champ ou laissez-le à sa valeur par défaut.
model.vehicles[].loadLimits{}.endLoadIntervalprévu (V2)Charge permise à la fin de la tournée. Type object. Erreur FIELD_NOT_SUPPORTED_YET quand il a une valeur autre que celle par défaut : « model.vehicles[].loadLimits{}.endLoadInterval is not supported yet (planned for V2). » Conseil : Retirez le champ ou laissez-le à sa valeur par défaut.
model.vehicles[].loadLimits{}.costPerKilometerprévu (V3)Coût au kilomètre qui dépend de la charge (expérimental dans GMPRO). Type object. Erreur FIELD_NOT_SUPPORTED_YET quand il a une valeur autre que celle par défaut : « model.vehicles[].loadLimits{}.costPerKilometer is not supported yet (planned for V3). » Conseil : Retirez le champ ou laissez-le à sa valeur par défaut.
model.vehicles[].loadLimits{}.costPerTraveledHourprévu (V3)Coût par heure de trajet qui dépend de la charge (expérimental dans GMPRO). Type object. Erreur FIELD_NOT_SUPPORTED_YET quand il a une valeur autre que celle par défaut : « model.vehicles[].loadLimits{}.costPerTraveledHour is not supported yet (planned for V3). » Conseil : Retirez le champ ou laissez-le à sa valeur par défaut.
model.vehicles[].costPerHourpris en chargeCoût horaire de la tournée, du départ à l'arrivée du véhicule. Type number. Valeur par défaut 0.
model.vehicles[].costPerTraveledHourpris en chargeCoût par heure de conduite. Type number. Valeur par défaut 0.
model.vehicles[].costPerKilometerpris en chargeCoût par kilomètre parcouru. Type number. Valeur par défaut 0.
model.vehicles[].fixedCostpris en chargeCoût facturé une seule fois si le véhicule sert au moins un envoi. Type number. Valeur par défaut 0.
model.vehicles[].usedIfRouteIsEmptyprévu (V2)Compte les coûts et la durée d'une tournée vide comme si le véhicule roulait du départ à l'arrivée. Type boolean. Erreur FIELD_NOT_SUPPORTED_YET quand il a une valeur autre que celle par défaut : « model.vehicles[].usedIfRouteIsEmpty is not supported yet (planned for V2). » Conseil : Retirez le champ ou laissez-le à sa valeur par défaut.
model.vehicles[].routeDurationLimitpris en chargeLimites de durée de la tournée, du départ à l'arrivée du véhicule. Type object.
model.vehicles[].routeDurationLimit.maxDurationpris en chargeDurée maximale stricte de la tournée, du départ à l'arrivée du véhicule. Type duration.
model.vehicles[].routeDurationLimit.softMaxDurationpris en chargeDurée maximale souple de la tournée, du départ à l'arrivée du véhicule : la dépasser coûte costPerHourAfterSoftMax par heure; inférieure à maxDuration quand les deux sont fixées. Type duration.
model.vehicles[].routeDurationLimit.quadraticSoftMaxDurationprévu (V3)Durée maximale souple de la tournée, du départ à l'arrivée du véhicule, avec un coût qui croît comme le carré du dépassement. Type duration. Erreur FIELD_NOT_SUPPORTED_YET quand il a une valeur autre que celle par défaut : « model.vehicles[].routeDurationLimit.quadraticSoftMaxDuration is not supported yet (planned for V3). » Conseil : Retirez le champ ou laissez-le à sa valeur par défaut.
model.vehicles[].routeDurationLimit.costPerHourAfterSoftMaxpris en chargeCoût horaire au-delà de softMaxDuration; exige softMaxDuration. Type number.
model.vehicles[].routeDurationLimit.costPerSquareHourAfterQuadraticSoftMaxprévu (V3)Coût par heure au carré au-delà du maximum souple quadratique. Type number. Erreur FIELD_NOT_SUPPORTED_YET quand il a une valeur autre que celle par défaut : « model.vehicles[].routeDurationLimit.costPerSquareHourAfterQuadraticSoftMax is not supported yet (planned for V3). » Conseil : Retirez le champ ou laissez-le à sa valeur par défaut.
model.vehicles[].travelDurationLimitpris en chargeLimites de temps de conduite sur la tournée. Type object.
model.vehicles[].travelDurationLimit.maxDurationpris en chargeTemps de conduite maximal strict sur la tournée. Type duration.
model.vehicles[].travelDurationLimit.softMaxDurationpris en chargeTemps de conduite maximal souple sur la tournée : le dépasser coûte costPerHourAfterSoftMax par heure; inférieur à maxDuration quand les deux sont fixés. Type duration.
model.vehicles[].travelDurationLimit.quadraticSoftMaxDurationprévu (V3)Temps de conduite maximal souple sur la tournée, avec un coût qui croît comme le carré du dépassement. Type duration. Erreur FIELD_NOT_SUPPORTED_YET quand il a une valeur autre que celle par défaut : « model.vehicles[].travelDurationLimit.quadraticSoftMaxDuration is not supported yet (planned for V3). » Conseil : Retirez le champ ou laissez-le à sa valeur par défaut.
model.vehicles[].travelDurationLimit.costPerHourAfterSoftMaxpris en chargeCoût horaire au-delà de softMaxDuration; exige softMaxDuration. Type number.
model.vehicles[].travelDurationLimit.costPerSquareHourAfterQuadraticSoftMaxprévu (V3)Coût par heure au carré au-delà du maximum souple quadratique. Type number. Erreur FIELD_NOT_SUPPORTED_YET quand il a une valeur autre que celle par défaut : « model.vehicles[].travelDurationLimit.costPerSquareHourAfterQuadraticSoftMax is not supported yet (planned for V3). » Conseil : Retirez le champ ou laissez-le à sa valeur par défaut.
model.vehicles[].routeDistanceLimitpris en chargeLimites de la distance parcourue sur la tournée. Type object.
model.vehicles[].routeDistanceLimit.maxMeterspris en chargeDistance maximale stricte, en mètres, au plus 1 000 000 000 (la valeur d'inaccessibilité du solveur). Type int64.
model.vehicles[].routeDistanceLimit.softMaxMeterspris en chargeDistance maximale souple, en mètres : la dépasser coûte costPerKilometerAboveSoftMax par kilomètre; inférieure à maxMeters quand les deux sont fixées. Type int64.
model.vehicles[].routeDistanceLimit.costPerKilometerBelowSoftMaxrefuséCoût au kilomètre jusqu'au maximum souple. Type number. Erreur INVALID_VALUE quand il est fixé : « routeDistanceLimit.costPerKilometerBelowSoftMax is not supported: GMPRO does not support it in route_distance_limit either. » Conseil : Retirez le champ; costPerKilometer facture chaque kilomètre parcouru. Refusé : le proto de GMPRO lui-même indique que ce coût n'est pas pris en charge dans route_distance_limit, alors aucune requête GMPRO ne peut en dépendre.
model.vehicles[].routeDistanceLimit.costPerKilometerAboveSoftMaxpris en chargeCoût au kilomètre au-delà de softMaxMeters; exige softMaxMeters. Type number.
model.vehicles[].extraVisitDurationForVisitTypeprévu (V2)Temps supplémentaire que ce véhicule passe aux visites d'un type donné. Type map<string, duration>. Erreur FIELD_NOT_SUPPORTED_YET quand il a une valeur autre que celle par défaut : « model.vehicles[].extraVisitDurationForVisitType is not supported yet (planned for V2). » Conseil : Retirez le champ ou laissez-le à sa valeur par défaut.
model.vehicles[].breakRulepris en chargePauses que le chauffeur doit prendre. Type object.
model.vehicles[].breakRule.breakRequestspris en chargePauses, dans l'ordre où elles doivent avoir lieu. Type object[].
model.vehicles[].breakRule.breakRequests[].earliestStartTimepris en chargeHeure la plus hâtive à laquelle la pause peut commencer. Type timestamp. Requis.
model.vehicles[].breakRule.breakRequests[].latestStartTimepris en chargeHeure la plus tardive à laquelle la pause peut commencer. Type timestamp. Requis.
model.vehicles[].breakRule.breakRequests[].minDurationpris en chargeDurée minimale permise de la pause; doit être positive. Type duration. Requis.
model.vehicles[].breakRule.frequencyConstraintsprévu (V3)Règles de fréquence des pauses, à la manière des règles sur les heures de service. Type object[]. Erreur FIELD_NOT_SUPPORTED_YET quand il a une valeur autre que celle par défaut : « model.vehicles[].breakRule.frequencyConstraints is not supported yet (planned for V3). » Conseil : Retirez le champ ou laissez-le à sa valeur par défaut.
model.vehicles[].labelpris en chargeÉtiquette du véhicule fournie par l'appelant, renvoyée comme vehicleLabel dans la réponse. Type string.
model.vehicles[].ignoreprévu (V2)Exclut le véhicule du plan. Type boolean. Erreur FIELD_NOT_SUPPORTED_YET quand il a une valeur autre que celle par défaut : « model.vehicles[].ignore is not supported yet (planned for V2). » Conseil : Retirez le champ ou laissez-le à sa valeur par défaut.
model.vehicles[].travelDurationMultipleprévu (V2)Multiplie chaque durée de trajet de ce véhicule, pour les véhicules plus lents ou plus rapides. Type number. Valeur par défaut 1. Erreur FIELD_NOT_SUPPORTED_YET quand il a une valeur autre que celle par défaut : « model.vehicles[].travelDurationMultiple is not supported yet (planned for V2). » Conseil : Retirez le champ ou laissez-le à sa valeur par défaut.
model.vehicles[].unmapProfilepris en chargeExtension Unmap : le profil du réseau routier d'où viennent les temps de trajet du véhicule. Type enum. Valeur par défaut auto. Valeurs : auto prise en charge; truck, pedestrian refusées, prévues (V2).

Prochaines étapes