API Dispatch (Optimización de Rutas)

Use Dispatch para optimizar rutas con múltiples vehículos y muchas paradas. Dispatch devuelve una ruta ordenada por vehículo con datos de tiempo, distancia y asignación para reparto, servicio de campo, operaciones de mensajería y planificación de flotas.

Resumen de la API Dispatch de TrackRoad que muestra vehículos y paradas transformándose en rutas optimizadas
Dispatch asigna paradas entre varios vehículos y devuelve rutas optimizadas con orden de parada, ETA, distancia y duración para cada vehículo.

¿Necesita el contrato completo?

Use Swagger para los modelos REST y WSDL para los detalles de integración SOAP.

Ver Swagger UI Ver SOAP WSDL Resumen de la referencia de API

Tabla de contenidos

  1. Qué hace Dispatch
  2. Modo Optima, Time Window y TimeWindowDepot
  3. Múltiples recogidas y entregas
  4. Endpoints y URLs base
  5. Autenticación
  6. Esquema de solicitud
  7. Esquema de respuesta
  8. Errores comunes
  9. Mejores prácticas
  10. Endpoints relacionados
  11. Preguntas frecuentes

Qué hace Dispatch#

Dispatch resuelve un problema de enrutamiento multivehículo. Asigna paradas a vehículos y ordena cada ruta usando restricciones como ventanas de tiempo, capacidad, prioridad y ubicaciones de inicio o fin.

Se prefiere LatLong. Cada parada debe incluir LatLong siempre que sea posible. Si no se proporciona LatLong, debe proporcionar Address para que el servicio pueda geocodificar la parada.

El método Dispatch acepta una lista de vehículos y una lista de ubicaciones de parada. Cada vehículo puede incluir una ubicación de inicio y una ubicación final opcional. Cada ubicación puede contener un nombre, campos de dirección y latitud y longitud.

Si la latitud y la longitud están presentes, TrackRoad las usa directamente. De lo contrario, el servicio geocodifica la dirección para obtener coordenadas.

Dispatch devuelve elementos de vehículo. Cada elemento de vehículo contiene la ruta asignada como una lista ordenada de paradas, optimizada por ubicación, capacidad, tiempo y otros factores de enrutamiento.

Cuando solo hay un vehículo disponible, Dispatch realiza únicamente optimización de ruta. Los modos de dispatch importan principalmente cuando hay múltiples vehículos disponibles.

Si no está seguro de qué modo de dispatch usar, comience con Auto. Para una optimización muy precisa con un solo vehículo, use Optima.

Modo Optima, Time Window y TimeWindowDepot#

En algunos lenguajes puede que no sea posible pasar un datetime nulo. En ese caso, use 0001-01-01T00:00:00. Las fechas anteriores al umbral del sistema se tratan como valores nulos.

Para obtener los mejores resultados, use DispatchMode Optima.

Tres variables afectan el comportamiento del dispatch con ventanas de tiempo:

  • CanArriveEarly
  • TimeConstraintArrival
  • TimeConstraintDeparture

Opción 1: CanArriveEarly = true

Cuando CanArriveEarly es true, la ventana de tiempo comienza al inicio del día. Si TimeConstraintArrival es null, la parada puede visitarse en cualquier momento del día. Si TimeConstraintArrival está establecido, define la hora máxima aceptable de llegada. La hora de salida se ignora.

Opción 2: CanArriveEarly = false

Cuando CanArriveEarly es false, la llegada y la salida definen la ventana de tiempo permitida. Si la llegada está definida y la salida es null, la parada se trata como una cita precisa. Si ambas están definidas, TrackRoad intenta visitar la parada dentro de ese rango horario.

Opción 3: Dos ventanas de tiempo

También puede especificar una segunda ventana de tiempo usando TimeConstraintArrival2 y TimeConstraintDeparture2. Esto resulta útil cuando una parada solo puede visitarse durante dos periodos distintos, como horarios restringidos de reparto en centros urbanos. TimeWindowDepot sigue la misma lógica, pero asume que los vehículos empiezan y terminan en un depósito común.

Las pausas pueden modelarse con LocationType = Break. Las cadenas de múltiples recogidas y entregas admiten solo una ventana de tiempo de entrega a nivel de entrega, y esa restricción temporal hija no puede ser más estricta que la restricción padre.

Múltiples recogidas y entregas#

Dispatch admite encadenamiento de recogidas y entregas. Esto es útil para operaciones de mensajería y flujos de trabajo en los que una parada debe visitarse antes que otra.

Use Midway para la primera parada de una cadena y Delivery para especificar la siguiente ubicación relacionada. Use DeliveryNonStop para determinar si la siguiente entrega vinculada debe realizarse inmediatamente o puede ocurrir más tarde en la misma ruta.

Por ejemplo, si se recoge un paquete en la ubicación B y se entrega en la ubicación M, TrackRoad conserva la relación requerida entre la recogida y la entrega mientras sigue optimizando la ruta alrededor de las demás paradas.

DeliveryNonStop = true

Cuando DeliveryNonStop es true, la parada de entrega vinculada debe visitarse inmediatamente después de la parada de recogida.

DeliveryNonStop = false

Cuando DeliveryNonStop es false, la entrega vinculada debe seguir realizándose después de la recogida, pero no tiene que ocurrir inmediatamente.

Puede encadenar múltiples entregas, como B → M → N, configurando Delivery y KeepSameOrder en cada parada vinculada.

Para trabajos de ida y vuelta, defina ubicaciones de recogida, entrega y retorno como una cadena. Una recomendación común es DeliveryNonStop = false y KeepSameOrder = true para una optimización más flexible sin perder el orden del negocio.

Ejemplo de paradas de ida y vuelta de la API de TrackRoad
Ejemplo: paradas de ida y vuelta.
Ejemplo de ruta de ida y vuelta de la API de TrackRoad
Ejemplo: ruta de ida y vuelta.

Endpoints y URLs base#

REST

Elemento Valor
URL base https://trackservice.trackroad.com
Endpoint POST /rest/dispatch
URL completa https://trackservice.trackroad.com/rest/dispatch
Content-Type application/json

SOAP

Elemento Valor
Endpoint https://trackservice.trackroad.com/TrackService.asmx
WSDL https://trackservice.trackroad.com/TrackService.asmx?WSDL
Método Dispatch
SOAPAction http://trackservice.trackroad.com/Dispatch

SOAP usa los mismos modelos DispatchSpecification y DispatchResult. La principal diferencia es el sobre SOAP y la autenticación basada en encabezados.

Autenticación#

Autenticación REST (X-API-Key)

Incluya su TrackServiceKey en el encabezado X-API-Key en cada solicitud. Genere la clave en su cuenta de TrackRoad en Autenticación de API .

curl -X POST "https://trackservice.trackroad.com/rest/dispatch" \
  -H "Content-Type: application/json" \
  -H "X-API-Key: YOUR_TRACKSERVICEKEY" \
  -d '{ "RoutingService": 0, "DistanceUnit": 0, "RouteOptimize": 0, "Vehicles": [], "Locations": [] }'

Mantenga las claves API en el servidor. No incruste claves en código del navegador ni de clientes móviles.

Autenticación SOAP (SessionIDHeader)

Para solicitudes SOAP, envíe su TrackServiceKey en SessionIDHeader como SessionID. Los antiguos Login y Logout no son necesarios cuando usa autenticación con TrackServiceKey.

<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
               xmlns:xsd="http://www.w3.org/2001/XMLSchema"
               xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
  <soap:Header>
    <SessionIDHeader xmlns="http://trackservice.trackroad.com/">
      <SessionID>YOUR_TRACKSERVICEKEY</SessionID>
    </SessionIDHeader>
  </soap:Header>
  <soap:Body>
    <Dispatch xmlns="http://trackservice.trackroad.com/">
      <specification>
        <RoutingService>0</RoutingService>
        <DistanceUnit>0</DistanceUnit>
        <RouteOptimize>0</RouteOptimize>
        <Vehicles />
        <Locations />
      </specification>
    </Dispatch>
  </soap:Body>
</soap:Envelope>

Los namespaces y prefijos SOAP pueden variar según su herramienta. Un cliente generado desde WSDL suele ser la opción más sencilla.

Esquema de solicitud#

El cuerpo de la solicitud es un solo objeto: DispatchSpecification. Como mínimo, proporcione vehículos y ubicaciones.

DispatchSpecification

Propiedad Tipo Obligatorio Descripción
RoutingServiceint (enum)NoMotor de enrutamiento. 0 = NetRoad, 1 = TrackRoad, 2 = Bing. Recomendado: 0 = NetRoad.
IsNeedMatchCodeboolNoSi es true, incluye códigos de calidad de coincidencia de geocodificación cuando corresponda.
CurrentTimestring (date-time)NoReferencia de hora actual utilizada para restricciones temporales en formato ISO 8601.
DispatchModeint (enum)NoEstrategia de optimización. Para recomendaciones de modos, consulte Modos de Dispatch.
MinimumOptimizationintNoUmbral de intensidad de optimización. Rango típico: 1 a 10.
DistanceUnitint (enum)No0 = Milla, 1 = Kilómetro.
RouteOptimizeint (enum)No0 = MinimizeTime, 1 = MinimizeDistance. Recomendado: 0 = MinimizeTime.
VehiclesVehicle[]NoVehículos disponibles para el dispatch.
LocationsLocation[]Paradas que deben asignarse y ordenarse.

DispatchMode

Propiedad Tipo Valor Descripción
Autoint0Selecciona automáticamente una estrategia de dispatch adecuada. Mejor punto de partida predeterminado.
EqualStopint1Intenta distribuir un número igual de paradas entre los vehículos.
SingleRegionint2Útil cuando los vehículos están geográficamente dispersos pero atienden paradas en áreas similares.
MultipleRegionint3Útil para vehículos que operan en diferentes ciudades o regiones distantes y para dispatch de campo en tiempo real.
EqualHourint4Intenta dividir el trabajo en rutas con un tiempo total similar.
EqualDistanceint5Intenta dividir el trabajo en rutas con una distancia total similar.
TimeWindowint6Prioriza citas y ventanas de entrega. La optimización puede reducirse para cumplir con las restricciones de tiempo.
TimeWindowDepotint7Modo de ventana de tiempo que asume un depósito central compartido por los vehículos.
Optimaint8Modo de alta precisión para un solo vehículo, con o sin ventanas de tiempo.
BalanceLocationint9Equilibra el número de paradas asignadas entre múltiples conductores.
BalanceTimeint10Equilibra el tiempo de ruta entre múltiples conductores.
MinimumVehiclesint11Selecciona el número mínimo de vehículos necesarios para atender todas las paradas, teniendo en cuenta los factores de enrutamiento.

Vehicle

Propiedad Tipo Obligatorio Descripción
NamestringRecomendadoIdentificador del vehículo mostrado en los resultados.
EmailstringNoContacto opcional del conductor o vehículo.
GroupstringNoCampo opcional de agrupación, como equipo, depósito o región.
SpeedintNoVelocidad opcional sobrescrita. Si se establece en 0, se usa la velocidad predeterminada de la vía.
MaxStopsintNoNúmero máximo de paradas por ruta para el vehículo.
MaxWeightdoubleNoCapacidad máxima de peso del vehículo.
MaxSkidsintNoCapacidad máxima de skids del vehículo.
MaxVolumedoubleNoCapacidad máxima de volumen del vehículo.
MaxMinutesintNoDuración máxima de la ruta del vehículo.
FuelCostdoubleNoParámetro de costo opcional utilizado por algunos modos de optimización.
OnTheRoadboolNoSi es true, una ruta de varios días puede continuar desde la ubicación final del día anterior en lugar de regresar al punto de inicio original.
Tinstring (date-time)NoMarca de tiempo desde la que el vehículo está disponible.
Toutstring (date-time)NoMarca de tiempo hasta la que el vehículo está disponible.
StartLocationLocationNoDepósito inicial o posición inicial opcional del vehículo.
FinishLocationLocationNoDepósito final o posición final opcional del vehículo.
RolesstringNoCadena de roles opcional que puede coincidir con condiciones de las paradas.
TransportTypeint (enum)NoModo de transporte, como coche, camión, autobús, motocicleta, peatón, scooter o bicicleta.
ExcludeTollsboolNoEspecifica si deben evitarse las carreteras con peaje.
ExcludeHighwaysboolNoEspecifica si deben evitarse las autopistas.
UseTruckRouteboolNoEspecifica si las rutas para camiones deben preferirse o permitirse.
WidthfloatNoAncho del vehículo en metros.
HeightfloatNoAltura del vehículo en metros.
LengthfloatNoLongitud del vehículo en metros.
AxleLoadfloatNoCarga por eje del vehículo en toneladas métricas.
AxleCountintNoNúmero de ejes.
Ejemplo de la función OnTheRoad del vehículo en la API de TrackRoad
Ejemplo: comportamiento de ruta diaria con OnTheRoad activado frente a desactivado.

Location

Cada ubicación debe incluir LatLong siempre que sea posible. Si faltan las coordenadas, se requiere Address para que TrackRoad pueda geocodificar la parada.

Propiedad Tipo Obligatorio Descripción
MatchCodeint (enum)NoCódigo de calidad de coincidencia de geocodificación.
NamestringNoEtiqueta de parada mostrada en los resultados.
DeliverystringNoNombre de ubicación de entrega vinculada o etiqueta de cliente.
DeliveryNonStopboolNoDetermina si la entrega vinculada debe realizarse inmediatamente después de la parada actual.
KeepSameOrderboolNoSi es true, conserva el orden relativo definido en la solicitud.
VehiclestringNoPreasignación opcional a un vehículo específico por nombre.
DescriptionstringNoNotas o descripción opcionales.
PhonestringNoNúmero de teléfono de contacto opcional.
LatLongLatLongCondicionalEntrada de coordenadas preferida. Obligatoria si no se proporciona Address.
AddressAddressCondicionalDirección utilizada para geocodificación cuando no se proporciona LatLong.
PriorityintNoPista de prioridad para la optimización.
WaitintNoTiempo de servicio o espera en la parada.
VolumedoubleNoDemanda de volumen consumida de la capacidad del vehículo.
WeightdoubleNoDemanda de peso consumida de la capacidad del vehículo.
SkidsintNoDemanda de skids consumida de la capacidad del vehículo.
TimeConstraintArrivalstring (date-time)NoValor principal de llegada de la ventana de tiempo.
TimeConstraintDeparturestring (date-time)NoValor principal de salida de la ventana de tiempo.
TimeConstraintArrival2string (date-time)NoValor opcional de llegada de la segunda ventana de tiempo.
TimeConstraintDeparture2string (date-time)NoValor opcional de salida de la segunda ventana de tiempo.
LocationTypeint (enum)No0 = Midway, 1 = Start, 2 = Finish, 3 = Delivery, 4 = MidwayDrop, 5 = Break.
CanArriveEarlyboolNoSi es false, no se permite llegar antes de la ventana de tiempo permitida.
ConditionsstringNoRegla de negocio o condición de coincidencia de rol opcional.

LatLong

Propiedad Tipo Obligatorio Descripción
LatitudedoubleLatitud en grados (-90 a 90).
LongitudedoubleLongitud en grados (-180 a 180).

Address

Propiedad Tipo Obligatorio Descripción
StreetstringRecomendadoDirección de la calle.
CitystringRecomendadoCiudad.
StatestringNoEstado o región.
PostalCodestringNoCódigo postal.
CountrystringRecomendadoPaís.

Esquema de respuesta#

Una respuesta correcta devuelve DispatchResult con elementos de ruta por vehículo y errores o advertencias opcionales.

DispatchResult

Propiedad Tipo Descripción
ItemsVehicleItem[]Elementos de resultado por vehículo que contienen la ruta asignada.
ErrorsError[]Errores o advertencias opcionales.
Statusint (enum)Estado de la operación: 0 = None, 1 = Success, 2 = Failed, 3 = SuccessWithErrors.

VehicleItem

Propiedad Tipo Descripción
VehicleVehicleEl vehículo asociado con esta ruta.
LocationsLocation[]Ubicaciones ordenadas asignadas a ese vehículo.

Error

Propiedad Tipo Descripción
MessagestringMensaje de error o advertencia legible por humanos.

Ejemplos#

Los bloques de código de ejemplo de solicitud y respuesta pueden permanecer sin cambios y no necesitan localización.

{
  "RoutingService": 0,
  "DistanceUnit": 0,
  "RouteOptimize": 0,
  "DispatchMode": 0,
  "Vehicles": [
    {
      "Name": "Truck 1",
      "StartLocation": { "LatLong": { "Latitude": 37.7946, "Longitude": -122.3950 }, "LocationType": 1 },
      "FinishLocation": { "LatLong": { "Latitude": 37.7946, "Longitude": -122.3950 }, "LocationType": 2 }
    }
  ],
  "Locations": [
    { "Name": "Stop A", "LatLong": { "Latitude": 37.7897, "Longitude": -122.4011 }, "LocationType": 0 },
    { "Name": "Stop B", "LatLong": { "Latitude": 37.7810, "Longitude": -122.4110 }, "LocationType": 0 }
  ]
}

REST request examples (multiple languages)#

curl -X POST "https://trackservice.trackroad.com/rest/dispatch" \
  -H "Content-Type: application/json" \
  -H "X-API-Key: YOUR_TRACKSERVICEKEY" \
  -d '{
    "RoutingService": 0,
    "DistanceUnit": 0,
    "RouteOptimize": 0,
    "DispatchMode": 0,
    "Vehicles": [
      {
        "Name": "Truck 1",
        "StartLocation": { "LatLong": { "Latitude": 37.7946, "Longitude": -122.3950 }, "LocationType": 1 },
        "FinishLocation": { "LatLong": { "Latitude": 37.7946, "Longitude": -122.3950 }, "LocationType": 2 }
      }
    ],
    "Locations": [
      { "Name": "Stop A", "LatLong": { "Latitude": 37.7897, "Longitude": -122.4011 }, "LocationType": 0 },
      { "Name": "Stop B", "LatLong": { "Latitude": 37.7810, "Longitude": -122.4110 }, "LocationType": 0 }
    ]
  }'

SOAP request examples (multiple languages)#

SOAP uses the same DispatchSpecification model, but it’s wrapped in a SOAP envelope and authenticated via SessionIDHeader (SessionID = TrackServiceKey).

curl -X POST "https://trackservice.trackroad.com/TrackService.asmx" \
  -H "Content-Type: text/xml; charset=utf-8" \
  -H "SOAPAction: http://trackservice.trackroad.com/Dispatch" \
  -d @dispatch-soap.xml

SOAP: Raw request (Envelope + SessionIDHeader)#

<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
               xmlns:xsd="http://www.w3.org/2001/XMLSchema"
               xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
  <soap:Header>
    <SessionIDHeader xmlns="http://trackservice.trackroad.com/">
      <SessionID>YOUR_TRACKSERVICEKEY</SessionID>
    </SessionIDHeader>
  </soap:Header>
  <soap:Body>
    <Dispatch xmlns="http://trackservice.trackroad.com/">
      <specification>
        <RoutingService>0</RoutingService>
        <DistanceUnit>0</DistanceUnit>
        <RouteOptimize>0</RouteOptimize>
        <DispatchMode>0</DispatchMode>
        <Vehicles></Vehicles>
        <Locations></Locations>
      </specification>
    </Dispatch>
  </soap:Body>
</soap:Envelope>

JSON: Response example#

{
  "Items": [
    {
      "Vehicle": { "Name": "Truck 1" },
      "Locations": [
        { "Name": "Stop A", "LatLong": { "Latitude": 37.7897, "Longitude": -122.4011 } },
        { "Name": "Stop B", "LatLong": { "Latitude": 37.7810, "Longitude": -122.4110 } }
      ]
    }
  ],
  "Errors": [],
  "Status": 1
}

SOAP: Response example#

<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
  <soap:Body>
    <DispatchResponse xmlns="http://trackservice.trackroad.com/">
      <DispatchResult>
        <Status>1</Status>
        <Errors />

        <Items>
          <VehicleItem>
            <Vehicle>
              <Name>Truck 1</Name>
            </Vehicle>

            <Locations>
              <Location>
                <Name>Stop A</Name>
                <LocationType>0</LocationType>
                <LatLong>
                  <Latitude>37.7897</Latitude>
                  <Longitude>-122.4011</Longitude>
                </LatLong>
              </Location>

              <Location>
                <Name>Stop B</Name>
                <LocationType>0</LocationType>
                <LatLong>
                  <Latitude>37.7810</Latitude>
                  <Longitude>-122.4110</Longitude>
                </LatLong>
              </Location>
            </Locations>
          </VehicleItem>
        </Items>

      </DispatchResult>
    </DispatchResponse>
  </soap:Body>
</soap:Envelope>

Errores comunes#

  • REST 401 / Unauthorized: X-API-Key ausente o no válido.
  • REST 403 / Forbidden: La clave es válida, pero está bloqueada, caducada o sin crédito.
  • Errores de validación: A una parada le faltan tanto LatLong como Address, o las coordenadas no son válidas.
  • Errores de autenticación SOAP: SessionIDHeader ausente/no válido o SessionID vacío.

Mejores prácticas

  • Prefiera LatLong para evitar ambigüedades de geocodificación y mejorar la consistencia del enrutamiento.
  • Use StartLocation y FinishLocation para enrutamiento basado en depósito y ETAs más precisas.
  • Agregue restricciones de capacidad como peso, volumen y skids para obtener asignaciones de ruta más realistas.
  • Use ventanas de tiempo cuando las paradas deban visitarse dentro de horarios de clientes u operaciones.
  • Para SOAP, use TrackServiceKey en SessionIDHeader. El flujo antiguo de login no es necesario.

Preguntas frecuentes#

¿Qué hace la API Dispatch?
Dispatch optimiza paradas entre varios vehículos y devuelve rutas ordenadas por vehículo con resultados de tiempo y distancia.
¿Cómo me autentico en Dispatch REST y SOAP?
REST usa su TrackServiceKey en el encabezado X-API-Key. SOAP usa el mismo TrackServiceKey en SessionIDHeader como SessionID.
¿Necesito LatLong o Address para las paradas?
Se prefiere LatLong. Si no se proporciona LatLong, se requiere Address para que TrackRoad pueda geocodificar la parada.

¿Listo para optimizar rutas?

Genere su clave API y luego comience a integrar Dispatch para optimización de rutas multivehículo mediante REST o SOAP.

Obtener clave API SOAP WSDL Swagger UI