servicios ## Sections • [Descripción general](https://app.theneo.io/pinittms/servicios/trueaddress-ai/descripcion-general.md): El servicio TrueAddress AI permite procesar direcciones escritas en texto libre para limpiarlas, descomponerlas en componentes estructurados y, de forma opcional, validarlas y geocodificarlas. Utiliza inteligencia artificial para mejorar la precisión en la estandarización de direcciones y facilita su uso en sistemas logísticos y de análisis geoespacial. • [Flujo básico de uso](https://app.theneo.io/pinittms/servicios/trueaddress-ai/flujo-basico-de-uso.md): 1 Paso 1: Prepara la dirección Ingresa la dirección en texto libre tal como la tengas en tu sistema, incluyendo país, estado y ciudad cuando sea posible. 2 Paso 2: Envía la solicitud Realiza un POST al endpoint /true-address-ai con los parámetros deseados. 3 Paso 3: Revisa tu respuesta Analiza el campo clean_address y, si habilitaste geocoding puedes verificar las coordenadas y el score de precisión. 4 Paso 4: Integra tu resultado Utiliza los datos limpios y/o geocodificados en tus procesos logísticos, de análisis o almacenamiento. • [POST /true-address-ai](https://app.theneo.io/pinittms/servicios/trueaddress-ai/new-section.md): POST https://services.pinittms.com/true-address-ai Este endpoint permite procesar una dirección escrita en texto libre para: Limpiarla y estandarizarla. Validar los componentes administrativos (estado, municipio y colonia). Obtener coordenadas geográficas (geocodificación). Cada funcionalidad es opcional y puede activarse con los parámetros del cuerpo de la solicitud. • [Respuesta](https://app.theneo.io/pinittms/servicios/trueaddress-ai/ejemplo-de-respuesta.md): La respuesta del servicio siempre devuelve un objeto JSON. • [Estatus de respuesta](https://app.theneo.io/pinittms/servicios/trueaddress-ai/estatus-de-respuesta.md): A continuación se detallan los principales códigos HTTP que puede devolver el servicio, junto con ejemplos de las respuestas más comunes. 200 OK La solicitud se procesó correctamente. Existen dos variantes: Sin geocodificación: Cuando geocoding: false o no se solicita geocodificación, solo se devuelve la dirección limpia. JSON { "clean_address": { "country": "México", "state": "Ciudad de México", "county": "Cuauhtémoc", "city": "Ciudad de México", "district": "Centro", "street": "Tacuba", "houseNumber": "17", "postalCode": "06000", "references": "" }, "geocoding": false } Con geocodificación habilitada: Cuando geocoding: true , la respuesta incluye además las coordenadas y su nivel de confianza ( score ). JSON { "clean_address": { "country": "México", "state": "Ciudad de México", "county": "Cuauhtémoc", "city": "Ciudad de México", "district": "Centro", "street": "Tacuba", "houseNumber": "17", "postalCode": "06000", "references": "" }, "geocoding": { "latitude": 19.43568, "longitude": -99.13823, "score": 1 } } 400 Bad Request La solicitud no cumple con los requisitos de formato o parámetros obligatorios. JSON { "message": "Bad request", "errors": [ { "type": "missing", "field": "address", "msg": "Field required" } ] } 500 Internal Server Error Este código indica que se produjo un error inesperado en el servidor al procesar la solicitud. Puede deberse a fallos temporales, problemas de infraestructura o errores internos de la aplicación. Acción recomendada: reintentar la llamada después de unos segundos. Si el problema persiste, verifica los parámetros enviados y, de ser necesario, contacta al equipo de soporte técnico de Pinit proporcionando el requestId o los detalles de tu solicitud para facilitar la investigación. • [Consideraciones adicionales](https://app.theneo.io/pinittms/servicios/trueaddress-ai/consideraciones-adicionales.md): Es importante saber que: El servicio está diseñado principalmente para direcciones en México y Colombia . Si tu caso de uso involucra otro país, nuestro equipo puede revisar la viabilidad técnica y trabajar contigo en una solución personalizada. Contáctanos para más información. El parámetro enable_validation usa un catálogo interno de códigos postales . La geocodificación puede usar distintos proveedores según umbral de confianza. El campo score indica la confianza del resultado (entre 0 y 1). Si enable_validation es true , la validación se usa internamente pero no aparece en la respuesta . Para soporte o autenticación, contacta al equipo técnico de Pinit . • [Preguntas frecuentes](https://app.theneo.io/pinittms/servicios/trueaddress-ai/preguntas-frecuentes.md): En esta sección encontrarás respuestas a las dudas más comunes sobre el uso de TrueAddress AI . ¿Qué tan limpia debe estar la dirección que envío? No es necesario que esté perfectamente escrita. El modelo está diseñado para trabajar con direcciones en texto libre, incluyendo errores comunes, abreviaciones y formatos mixtos. Sin embargo, se recomienda incluir al menos calle, número y colonia/ciudad para mejores resultados. ¿Qué hace exactamente el parámetro enable_validation ? Cuando se activa ( true ), el servicio utiliza un catálogo interno de códigos postales (solo en México) para validar y corregir de forma más precisa los componentes administrativos: estado, municipio y colonia. Esta validación es interna y no aparece explícitamente en la respuesta, pero mejora la calidad del resultado. ¿Qué proveedores se usan para la geocodificación? El servicio puede usar múltiples APIs externas. Se selecciona automáticamente el proveedor con mejor resultado según un umbral interno. ¿Qué representa el campo score en la respuesta de geocoding? El campo score es un valor entre 0 y 1 que indica el nivel de confianza de la geocodificación. Un score de 1.0 representa una alta precisión (por ejemplo, número exterior exacto). ¿Cómo obtengo mi token de autenticación? Debes contactar al equipo técnico de Pinit para obtener tus credenciales de acceso. El token es obligatorio y debe incluirse en cada solicitud HTTP en el header Authorization . ¿Qué países están soportados? El servicio está optimizado para direcciones en México y Colombia . Si deseas trabajar con otros países, contáctanos para analizar la viabilidad y configuración necesaria. ¿Qué pasa si la dirección no puede geocodificarse? En ese caso, el campo geocoding será igual a false o nulo. Aún así, recibirás una dirección limpia y estructurada. Puedes revisar el campo score si la geocodificación es baja o inconsistente. • [Descripción general](https://app.theneo.io/pinittms/servicios/clusters-inteligentes/descripcion-general.md): El servicio Clusters Inteligentes permite agrupar un conjunto de puntos geográficos (latitud/longitud) en clusters optimizados para operaciones logísticas. Utiliza algoritmos de machine learning para analizar la distribución espacial de los datos, aplicar filtros opcionales que eliminan outliers y generar agrupaciones que cumplen con restricciones operativas definidas por el usuario. Objetivo Su objetivo es facilitar la segmentación geográfica de grandes volúmenes de puntos para mejorar la planificación logística, simplificar el análisis operativo y reducir la complejidad de implementación. Casos de uso Preparar insumos para sistemas de ruteo y optimización de entregas. Identificar zonas de alta concentración de puntos para análisis operativo o comercial. Generar visualizaciones geográficas (CSV, KMZ) para herramientas GIS o reportes ejecutivos. • [Autenticación](https://app.theneo.io/pinittms/servicios/clusters-inteligentes/autenticacion.md): Este servicio requiere autenticación mediante Bearer Token en todas las solicitudes. El token es proporcionado por el equipo de soporte de Pinit y debe incluirse en el encabezado Authorization de cada petición HTTP. Ecabezado requerido HTTP Authorization: Bearer <token> Consideraciones El token es obligatorio en todas las solicitudes. El token es único por cliente y debe mantenerse confidencial. Un token inválido, expirado o ausente resultará en una respuesta 401 Unauthorized . • [POST /clusters](https://app.theneo.io/pinittms/servicios/clusters-inteligentes/endpoint.md): POST https://services.pinittms.com/clusters Registra un nuevo proceso de clustering de puntos geográficos. Este endpoint recibe un listado de coordenadas (latitud y longitud) y parámetros de configuración para generar clusters optimizados para logística. La respuesta de la petición POST /clusters no incluye los archivos ni los resultados completos del clustering, ya que el proceso se ejecuta de forma asincrónica. Para consultar el estado y obtener los archivos generados, es necesario utilizar el endpoint GET /clusters/{uuid} con el identificador id ( UUID ) recibido en la respuesta del POST. • [GET /clusters/{uuid}](https://app.theneo.io/pinittms/servicios/clusters-inteligentes/get-clusters.md): GET https://services.pinittms.com/clusters/{uuid} Consulta el estado y resultados de un proceso de clustering previamente registrado. Este endpoint permite obtener tanto los archivos generados como datos de los clusters, usando el identificador único id ( UUID ) devuelto al momento de enviar la solicitud POST /clusters . Las URLs de los archivos generados tienen una vigencia temporal de 24 horas por motivos de seguridad. Si necesitas acceder a los archivos después de ese periodo, deberás realizar nuevamente la petición GET /clusters/{uuid} para obtener enlaces actualizados de descarga. • [Recomendaciones para configurar el clustering](https://app.theneo.io/pinittms/servicios/clusters-inteligentes/parametros-de-entrada-post-clusters.md): A continuación se presentan algunas recomendaciones para configurar correctamente la solicitud POST /clusters . points: Asegúrate de enviar al menos 100 coordenadas en formato CSV con encabezado válido. Si el archivo contiene puntos con valores nulos o fuera de rango, serán descartados automáticamente. remove_outliers + outlier_filter_level: Activa remove_outliers = true si existe la posibilidad de que el dataset contenga errores de captura o puntos muy alejados del resto. Usa "moderate" como valor por defecto: equilibra limpieza y retención de datos. "strict" puede eliminar más de lo necesario; "relaxed" solo excluye casos extremos. min_packages_per_cluster + max_cluster_percentage: Estas restricciones deben ser coherentes entre sí. Por ejemplo: si tienes 120 puntos y defines min_packages_per_cluster = 40 , entonces max_cluster_percentage no debe ser menor a 34%, ya que un parámetro representa el límite inferior y el otro el límite superior de paquetes por cluster. Validaciones cruzadas: La API validará condiciones como: No incluir outlier_filter_level si remove_outliers = false . Definir min_packages_per_cluster solo si min_packages_per_cluster_enabled = true . • [Archivos generados](https://app.theneo.io/pinittms/servicios/clusters-inteligentes/archivos-generados.md): Al finalizar exitosamente el proceso de clustering ( status = completed ), el servicio pone a disposición varios archivos descargables. Estos archivos permiten visualizar y analizar los resultados del clustering de manera práctica. Campo de respuesta Formato Descripción points_file_url csv Contiene los puntos originales enviados en la solicitud. Este archivo está disponible desde el momento en que el proceso se registra. clusters_file_url csv Incluye información detallada de cada cluster, como su identificador, coordenadas del centroide y radio estimado. points_processed_file_url csv Muestra todos los puntos procesados con su cluster asignado o identificados como outliers. También incluye los centroides. kmz_file_url kmz Archivo en formato geoespacial que permite representar los clusters y puntos procesados como capas visuales. Compatible con múltiples herramientas SIG ( Sistemas de Información Geográfica ), incluyendo Google Earth. Notas: Los campos clusters_file_url , points_processed_file_url y kmz_file_url solo estarán disponibles cuando el proceso esté completado. Todos los archivos son generados en tiempo real y accesibles mediante URL firmadas desde un bucket de almacenamiento seguro. Las URLs de los archivos generados tienen una vigencia temporal de 24 horas por motivos de seguridad. Si necesitas acceder a los archivos después de ese periodo, deberás realizar nuevamente la petición GET /clusters/{uuid} para obtener enlaces actualizados de descarga. • [Ejemplo de petición POST /clusters](https://app.theneo.io/pinittms/servicios/clusters-inteligentes/ejemplo-de-peticion-post-clusters.md): En el siguiente ejemplo se envía un archivo CSV con 644 coordenadas geográficas , distribuidas en distintas regiones. El objetivo es generar clusters balanceados para uso logístico, aplicando filtros para eliminar puntos atípicos y controlar el tamaño relativo de cada agrupación. 📍 En la imagen se muestra la distribución espacial de los puntos utilizados y los clusters creados por el servicio. 📄 En la caja de abajo están los 644 puntos del archivo CSV trabajado en este ejemplo. Plain text latitude,longitude 19.43374,-99.13902 22.10534,-103.25224 19.43374,-99.13902 25.8098,-109.01839 22.11374,-103.27151 19.43374,-99.13902 22.10441,-103.2522 19.43374,-99.13902 22.75368,-102.5862 22.75652,-102.47849 21.72784202,-102.2976438 21.84976711,-102.2987625 23.32077,-103.01271 22.7322,-102.52715 21.84661,-102.31397 21.89928366,-102.3009471 21.90502,-102.3051 21.85986,-102.25589 21.93899,-102.32333 21.92513962,-102.239772 21.82519587,-102.2790002 22.94855,-102.70253 22.82699,-102.61298 21.87299,-102.27934 21.85652,-102.24266 22.28154548,-102.0678792 22.75298,-102.47887 21.87293,-102.32988 21.95983,-102.29991 21.87967,-102.22528 23.18051,-102.86365 21.82712,-102.26661 23.16325,-102.83462 21.83886628,-102.246204 21.95542,-102.27885 22.76536,-102.58351 21.81802803,-102.1939795 22.43688,-102.24979 21.99392847,-101.893714 21.8696,-102.23889 21.81091,-102.27244 22.05767,-101.9277 21.84019746,-102.2948448 21.87204,-102.31285 21.90204,-102.41527 22.77115,-102.5746 21.93156,-102.2804 21.87357,-102.23425 21.94031,-102.25758 23.19573,-102.85534 21.88887,-102.24105 21.8783741,-102.2382485 21.85251,-102.32289 21.89554,-102.29608 22.22962,-102.25073 21.90803,-102.25132 21.91540047,-102.2653138 21.93577427,-102.266736 21.88101,-102.23035 23.23145,-102.84447 21.9281,-102.25934 21.78428852,-102.2451277 21.8783741,-102.2382485 21.82191776,-102.2647307 22.76862,-102.57448 23.16968,-102.84712 21.67385,-102.29117 21.88948,-102.27019 21.8390928,-102.3030701 21.95641,-102.33669 21.82519587,-102.2790002 21.82321,-102.27552 21.86527,-102.30704 22.77391,-102.57186 22.65446,-103.00603 21.87161,-102.27425 21.95413,-102.31639 21.93021,-102.31366 22.95342,-102.71085 21.87465,-102.28385 21.90893814,-102.2382976 22.75427,-102.60442 21.91767,-102.30709 21.88393,-102.31555 21.96259,-102.30011 21.83886628,-102.246204 21.88068663,-102.2712709 21.85463,-102.2769 22.06483,-102.26442 22.6575,-103.00144 21.85891,-102.33177 21.92945769,-102.3028687 21.67596288,-102.3014376 21.83913,-102.31894 22.95961,-102.70586 21.86248,-102.25257 21.88331798,-102.314712 21.95158662,-102.3074395 21.89928366,-102.3009471 21.84293,-102.24818 21.97017441,-102.2982768 21.95158662,-102.3074395 21.90643,-102.28954 21.91981,-102.33539 21.8342069,-102.3172722 21.91494,-102.25787 23.19891,-102.88112 22.7554,-102.53748 21.84846,-102.25923 21.92092045,-102.3392969 21.86395,-102.30191 21.99392847,-101.893714 21.95158662,-102.3074395 22.73296,-102.511 21.95297,-102.31109 21.8783741,-102.2382485 21.88031,-102.28138 21.92377,-102.33483 21.93643,-102.30538 21.82191776,-102.2647307 22.22992174,-102.3208294 21.90742,-102.27828 22.76867,-102.61146 21.8908,-102.26436 21.86352,-102.30779 21.90976709,-102.3134162 21.85125,-102.31329 23.17853,-102.87272 21.93528,-102.30458 21.82304,-102.27614 21.91931,-102.30875 21.96503797,-102.2603314 21.8458,-102.25731 21.88799,-102.24237 21.86324,-102.27996 21.8783741,-102.2382485 22.94934,-102.7099 21.90976709,-102.3134162 21.85584,-102.26031 21.88477,-102.2293 21.89509,-102.26795 23.16821,-102.88264 21.92909765,-102.2145437 21.89329,-102.25788 21.84999,-102.3152 21.87390673,-102.2876037 21.90163439,-102.2605424 21.91595,-102.26071 21.85958,-102.26476 21.92092045,-102.3392969 21.93577427,-102.266736 21.91741,-102.25992 21.87634,-102.31225 22.70036,-102.73831 21.91540047,-102.2653138 21.86396,-102.33991 21.90965,-102.24371 23.19924,-102.85382 21.85354,-102.25485 21.88291,-102.3055 21.84341,-102.30538 21.82191776,-102.2647307 22.63792,-102.9894 21.89322,-102.25638 22.13317,-102.20481 22.75474,-102.47687 22.73068,-102.51323 22.0629,-102.26282 21.90532392,-102.2816575 22.74531,-102.52125 22.14768,-102.27729 21.88322,-102.31697 21.92524,-102.33473 21.89486174,-102.2569628 22.95961,-102.70586 21.89049,-102.30842 22.74882,-102.61749 21.85995,-102.24874 21.88386022,-102.2933833 21.95223,-102.31298 23.17936,-102.88932 21.89004,-102.26144 21.95786,-102.3128 21.91282,-102.2361 21.85317,-102.28424 21.88451,-102.23219 21.85932,-102.31283 21.87377,-102.31112 21.92513962,-102.239772 21.93209,-102.25287 21.87586,-102.29005 21.8390928,-102.3030701 22.06747,-102.265 21.93475,-102.28655 21.85958,-102.2648 21.9942,-102.29281 21.85642,-102.318 22.75825,-102.54465 21.88262,-102.26437 21.84869,-102.31919 21.83886628,-102.246204 21.69993972,-102.3161075 21.89356,-102.24639 21.83886628,-102.246204 21.85975,-102.25551 21.95158662,-102.3074395 21.88357,-102.23785 22.77236,-102.51419 21.86785,-102.25323 21.86493,-102.22902 22.75824,-102.49667 21.8231,-102.27603 21.87238,-102.31361 21.86851,-102.2505 21.93412,-102.25425 21.90081,-102.30382 22.75826,-102.53518 21.88091,-102.28171 21.93916,-102.25577 22.75456,-102.47818 21.83886628,-102.246204 21.96032,-102.31071 21.91244,-102.25398 21.89995,-102.3064 21.95542,-102.30989 21.91349,-102.28059 21.84987,-102.24245 21.89928366,-102.3009471 21.98315,-102.29057 23.18994,-102.87583 21.90335,-102.29817 21.95158662,-102.3074395 21.92702,-102.30165 21.89612,-102.2577 21.89858,-102.32026 22.76086,-102.54014 21.85093,-102.26258 21.9592,-102.3375 21.92072,-102.24477 23.16745,-102.83936 21.86496,-102.29836 21.89885,-102.25846 21.83688,-102.31968 21.93577427,-102.266736 21.89247,-102.29528 21.89125747,-102.2982436 22.0929,-102.07172 21.8899816,-102.3124954 23.22539,-102.84143 21.93577427,-102.266736 21.89862,-102.27174 21.9237,-102.33138 21.94453,-102.3507 21.85973,-102.26926 21.90893814,-102.2382976 21.90755,-102.29702 21.89771,-102.2977 22.76693,-102.5926 21.83315,-102.29792 21.85377,-102.30937 22.76483,-102.5023 21.95186,-102.33498 21.94455,-102.34177 21.89731,-102.32007 22.22548,-102.32578 21.92408018,-102.0021814 21.9118,-102.27805 21.87603,-102.28847 21.91509,-102.27836 22.75304,-102.66296 21.87651,-102.2516 21.84939,-102.29867 21.89774,-102.26315 21.89353308,-102.3422819 21.86206,-102.25676 21.88386022,-102.2933833 22.72847,-102.517 22.03537763,-102.2799705 21.93316,-102.261 22.00005,-102.19768 21.82191776,-102.2647307 21.93728844,-102.3029133 23.32331,-103.0129 21.84003677,-102.3506877 21.78146,-102.46474 21.82529,-102.27456 21.8957,-102.23914 21.87309,-102.27052 21.89486174,-102.2569628 21.88867,-102.24784 21.75092555,-102.3154954 21.82795,-102.26486 21.83886628,-102.246204 21.91244,-102.25398 22.78029,-102.58202 21.92414,-102.32488 21.89003,-102.25658 21.89779,-102.32042 22.1443992,-102.2701144 21.96583,-102.33042 21.89502,-102.24272 23.19388,-102.85266 21.85363,-102.25709 23.34388,-102.9912 21.88909,-102.31236 21.89626717,-102.2902932 23.1929,-102.8655 21.88237,-102.29719 21.84325,-102.26329 21.90314,-102.24648 21.84147,-102.31618 21.83886628,-102.246204 22.32234,-102.2909 21.8475,-102.29444 21.86557,-102.23613 21.82191776,-102.2647307 21.86511,-102.25281 21.93528,-102.30458 21.93021,-102.31366 21.88393,-102.31555 21.89353308,-102.3422819 21.86413,-102.25639 21.92175855,-102.3063974 21.88105,-102.26517 22.64602,-102.99298 21.94218,-102.3249 22.75782,-102.47765 21.92821,-102.30435 21.83293,-102.25196 21.87278,-102.26508 22.63282,-102.99233 21.88386022,-102.2933833 21.85642,-102.318 21.89418,-101.99488 21.99392847,-101.893714 21.8957,-102.32341 21.918,-101.95898 21.82759,-102.28692 21.8298,-102.26393 23.16995,-102.87316 22.04922092,-102.2524859 21.67387,-102.29382 21.85217,-102.2717 22.78242,-102.4217 23.17568,-102.88133 21.87983,-102.28462 21.89819,-102.24865 21.93899,-102.32333 21.9013,-102.24501 22.68639,-102.23951 21.93313,-102.32599 21.83886628,-102.246204 23.18455,-102.89663 21.84516,-102.32225 21.81239698,-102.3042127 21.85958,-102.26392 21.92175855,-102.3063974 21.92442,-102.32319 21.83886628,-102.246204 21.97284,-102.35255 21.84003677,-102.3506877 21.95719,-102.3166 21.86576,-102.25313 21.85958,-102.26405 22.93994,-102.71341 21.90628,-102.25077 21.84954,-102.30271 21.8783741,-102.2382485 21.86333211,-102.2741287 21.96845,-102.35788 22.75778,-102.59817 22.22786,-102.32347 21.84996,-102.29971 21.85995,-102.2488 21.87774,-102.67564 21.9013,-102.25577 21.92354,-102.33729 21.85132,-102.30326 21.92947,-102.28327 21.84747,-102.35483 22.13817,-102.20662 21.93653,-102.25828 22.7554,-102.53748 23.18124,-102.868 21.95782,-102.31477 21.87603,-102.28847 22.64505,-103.00203 21.92012,-102.30176 21.89486174,-102.2569628 21.8602,-102.26627 21.91414,-102.23451 21.91684,-102.29958 21.88475,-102.22938 21.93256,-102.31024 21.87612,-102.24626 21.85499,-102.28068 21.88695,-102.27423 21.89559,-102.28829 21.89027,-102.25713 21.96259,-102.30011 21.89835,-102.32142 23.05551,-102.68606 21.90744,-102.29947 22.77308,-102.57171 21.85729,-102.3407 21.90836,-102.28 23.17209,-102.84932 21.87786,-102.24333 21.91078,-102.30531 21.89275,-102.29556 21.84685,-102.24723 22.75174,-102.52795 21.85975,-102.25551 21.85706,-102.26099 21.85277,-102.31211 21.97017441,-102.2982768 22.22186,-102.32768 21.8626,-102.34225 21.89769,-102.32173 21.90123,-102.25604 22.75388,-102.52354 21.8783741,-102.2382485 23.1829,-102.89377 22.65047,-102.97627 22.76193,-102.50261 21.83886628,-102.246204 21.8783741,-102.2382485 22.7552,-102.52697 22.7839,-102.56707 22.22992174,-102.3208294 21.85664,-102.27429 21.85457,-102.2962 21.87243,-102.29113 21.87524648,-102.3137989 22.02472,-102.30579 21.91455,-102.23523 21.92513962,-102.239772 22.73802,-102.51437 21.88204,-102.29741 21.87471,-102.31917 21.82629,-102.26571 23.1787,-102.86352 23.3659,-103.0758 23.16769,-102.87482 21.90395,-102.30367 21.86226,-102.25771 21.90323,-102.2788 22.02276,-102.27343 21.96268,-102.30066 21.84475,-102.31074 21.91684,-102.29958 21.89506,-102.25768 21.84698,-102.71641 23.16315,-102.83477 21.95058,-102.31371 21.90532392,-102.2816575 21.85008,-102.24396 22.77571,-102.56972 21.95158662,-102.3074395 22.7908,-102.63197 23.19408,-102.89465 21.67596288,-102.3014376 21.92787,-102.25585 22.73946,-102.51581 22.26673,-102.03327 21.86330856,-102.2628965 21.93577427,-102.266736 21.88268,-102.3277 22.75804,-102.48209 21.91769,-102.30903 22.64505,-103.00203 21.88589,-102.26035 21.85672,-102.27813 23.17802,-102.86403 21.88077,-102.22705 23.16899,-102.83993 21.88386022,-102.2933833 21.86201,-102.31079 21.8961,-102.2976 21.8390928,-102.3030701 21.87129,-102.26375 21.85284,-102.34586 21.8842,-102.2314 21.91365,-102.3125 21.83258,-102.28407 21.96089,-102.30036 21.93403,-102.25431 22.95652,-102.72387 22.22981,-102.32334 22.73952,-102.51574 22.23529107,-102.3320726 21.84558444,-102.7042695 21.95158662,-102.3074395 22.76027,-102.53928 22.7655,-102.56934 21.90093,-102.25722 21.92749,-102.24537 21.84003677,-102.3506877 21.8808,-102.27662 21.85327,-102.29553 21.91724,-102.28661 21.94001,-102.24586 21.85953,-102.34035 22.76263,-102.50446 21.8196,-102.26898 22.23648,-102.09173 21.91783,-102.33427 21.87078,-102.25883 21.89096,-102.2515 23.16968,-102.84712 21.92772,-102.26441 22.76086,-102.54014 21.88645,-102.30242 21.93552,-102.32382 22.81967,-102.22617 21.87228,-102.26087 22.75786,-102.52439 21.93577427,-102.266736 21.8342069,-102.3172722 21.88463,-102.26313 21.85383,-102.31324 21.96813,-102.3535 21.96316,-102.30099 22.7556,-102.49899 21.95537676,-102.2233645 21.85355,-102.3345 21.85188,-102.2722 21.91477122,-102.3004881 21.86982291,-102.2771493 22.74722,-102.58457 21.85075,-102.24842 21.92936,-102.25811 22.76108,-102.54234 21.87425,-102.29212 21.86734,-102.2749 21.84003677,-102.3506877 22.22271,-102.32991 21.96528902,-102.3330171 21.90893814,-102.2382976 21.90956,-102.25892 21.8783741,-102.2382485 22.93403,-102.70351 23.22885,-102.8384 21.84261,-102.26032 21.93577427,-102.266736 22.76375,-102.5668 22.76164,-102.50372 21.72784202,-102.2976438 21.88216,-102.30908 21.85975,-102.25551 21.72784202,-102.2976438 22.75507,-102.49885 21.95324,-102.34542 23.19978,-102.85549 21.90532392,-102.2816575 22.77239,-102.58525 21.9409,-102.24354 21.84003677,-102.3506877 21.83886628,-102.246204 21.83886628,-102.246204 21.89928366,-102.3009471 22.65501,-102.99416 22.26355,-102.03167 22.75598,-102.49418 21.89926,-102.31295 21.8783741,-102.2382485 21.96704,-102.29077 21.84388,-102.25166 21.84484,-102.28963 22.75895,-102.56354 21.84007,-102.30077 21.87368,-102.33283 21.83987,-102.32119 21.8777,-102.27804 21.85869,-102.3117 21.86901,-102.27819 21.92406,-102.33738 21.89353308,-102.3422819 22.95009,-102.7034 21.8757,-102.24512 21.87535,-102.31715 21.85872,-102.27533 23.16851,-102.85349 22.65004,-102.98421 21.83886628,-102.246204 21.97606954,-102.3307443 23.17802,-102.86403 23.15917,-102.87034 21.91540047,-102.2653138 21.97468576,-102.3623676 21.92421005,-102.3543742 21.86038666,-102.2871665 21.95158662,-102.3074395 21.82191776,-102.2647307 23.18906,-102.87007 21.90956,-102.25892 23.22591,-102.83567 22.75875,-102.56873 21.95847,-102.31664 21.83777,-102.25126 21.89928366,-102.3009471 21.93577427,-102.266736 21.84676,-102.30812 21.88872,-102.29136 21.89582,-102.31026 21.90169,-102.28921 21.93021,-102.31366 21.85125,-102.31329 21.9276,-102.32124 21.88094,-102.22617 22.7554,-102.53748 21.89353308,-102.3422819 22.77102,-102.4859 21.86876,-102.31299 21.89486,-102.32012 23.17008,-102.8694 21.87826953,-102.2826954 21.85105,-102.29849 22.76344,-102.58451 21.97094,-102.35043 21.87292,-102.32988 22.95094,-102.69622 22.21788832,-102.3451984 22.75822,-102.52218 21.82232,-102.27472 22.66174,-102.99695 21.89096,-102.2515 21.89199,-102.50651 21.82644,-102.26567 21.8532,-102.31384 21.85464,-102.72079 22.77236,-102.51419 21.8783741,-102.2382485 21.86208,-102.25535 22.75766,-102.51928 21.84431,-102.33046 21.87727,-102.27208 21.85559,-102.28004 21.85125,-102.31329 21.8739,-102.26635 21.82191776,-102.2647307 21.913,-102.28226 21.8273,-102.2667 21.8783741,-102.2382485 Parámetros de la petición Parámetros aplicados en este ejemplo: points : latitude,longitude\n19.43374,-99.13902\n22.10534,-103.25224\n19.43374,-99.13902\n25.8098,-109.01839\n22.11374,-103.27151… Contiene el listado de 644 coordenadas en formato CSV con encabezado "latitude,longitude". Estos puntos representan ubicaciones geográficas de interés. remove_outliers : true Se activó la detección y eliminación de outliers para excluir puntos que se encuentren significativamente alejados de los grupos principales, evitando que interfieran en la formación de clusters. outlier_filter_level : "moderate" Se eligió un nivel de sensibilidad intermedio para eliminar solo los puntos que están claramente alejados del resto. min_packages_per_cluster_enabled : true Se activó la restricción de tamaño mínimo por cluster para asegurar que cada agrupación sea lo suficientemente grande, según los criterios operativos de la empresa. min_packages_per_cluster : 40 Cada cluster debe contener al menos 40 puntos, lo que evita la generación de agrupaciones pequeñas que podrían ser ineficientes para la operación. max_cluster_percentage : 30 Se limitó el porcentaje máximo de puntos por cluster al 30% del total (en este ejemplo, aproximadamente 193 puntos como máximo por cluster). Esto fomenta una distribución más equilibrada entre todas las agrupaciones. Resultados del ejemplo Una vez procesada la solicitud, el servicio devolvió los siguientes archivos y resultados clave: Title Description Archivo generado Contenido points_file_url Los 644 puntos originales enviados. points_processed_file_url 639 puntos fueron asignados a clusters. 5 fueron identificados como outliers y excluidos del agrupamiento. clusters_file_url Se generaron 8 clusters, cada uno con al menos 40 puntos y ninguno con más del 30% del total, cumpliendo con las restricciones establecidas. kmz_file_url Archivo geoespacial de los clusters generados, útil para análisis logístico o representación en mapas. En este ejemplo, la combinación de parámetros permitió: Eliminar outliers moderados , manteniendo la mayoría de las variaciones naturales de la distribución. Controlar el tamaño mínimo y máximo de los clusters, promoviendo una segmentación operativa y equilibrada. Visualizar fácilmente los resultados mediante los archivos descargables. • [Preguntas frecuentes](https://app.theneo.io/pinittms/servicios/clusters-inteligentes/preguntas-frecuentes.md): En esta sección encontrarás respuestas a las dudas más comunes sobre el uso de Clusters Inteligentes. ¿Cuál es el formato correcto para enviar los puntos? Debe ser un string con formato CSV, incluyendo encabezado "latitude,longitude" o "id,latitude,longitude" y al menos 100 puntos. ¿Qué pasa si envío menos de 100 puntos? La solicitud será rechazada con error 400. El servicio requiere al menos 100 puntos para garantizar resultados significativos. ¿Qué significa remove_outliers ? Si se activa ( true ), el servicio eliminará puntos atípicos (outliers) antes de formar los clusters, según el nivel de sensibilidad indicado en outlier_filter_level . ¿Cómo elijo el nivel correcto de outlier_filter_level ? strict : elimina cualquier punto ligeramente alejado. moderate : (recomendado): elimina solo los claramente fuera de rango. relaxed : elimina solo los muy alejados del centro. ¿Puedo limitar el tamaño de los clusters? Sí, Usa max_cluster_percentage para limitar el % máximo de puntos por cluster. Usa min_packages_per_cluster_enabled y min_packages_per_cluster para exigir un tamaño mínimo por cluster. ¿Qué hago después de enviar el POST? El POST te devuelve un id . Usa ese id en el endpoint GET /clusters/{uuid} para consultar el estado y descargar los resultados cuando el procesamiento haya terminado. ¿Por qué en la respuesta del POST no veo las URLs de los archivos? Porque el proceso es asíncrono. Las URLs estarán disponibles únicamente cuando el procesamiento haya finalizado, consultando vía GET. ¿Cuánto tiempo duran activas las URLs de los archivos generados? Las URLs son temporales y expiran después de 24 horas. Si necesitas los archivos nuevamente, consulta otra vez con el GET /clusters/{uuid} . ¿Qué contiene cada archivo generado? points_file_url : puntos originales enviados. kmz_file_url : clusters en formato geoespacial para visualizar. clusters_file_url : detalle de cada cluster. points_processed_file_url : puntos finales + centroides. • [Descripción general](https://app.theneo.io/pinittms/servicios/routing/descripcion-general.md): El servicio Route Solver resuelve el Problema del Viajero ( TSP por sus siglas en inglés) para un conjunto de coordenadas geográficas. Su objetivo es encontrar el orden óptimo en que deben recorrerse los puntos para minimizar el tiempo de viaje o la distancia total. El servicio utiliza datos reales de carreteras cuando están disponibles y, en caso contrario, aplica un cálculo estimado de distancia para garantizar siempre una solución. Principales características Optimización de rutas basada en tiempo real de viaje o distancia total . Soporte para rutas cerradas (regresando al punto inicial) y abiertas (terminando en un punto distinto). Manejo automático de coordenadas duplicadas. Validación de coordenadas y límites de uso (mínimo 2 y máximo 500 puntos). Uso automático de distancias estimadas cuando no hay datos de carreteras. Nota: si se requiere procesar más de 500 puntos en una sola petición, por favor contáctenos para una solución personalizada. • [Autenticación](https://app.theneo.io/pinittms/servicios/routing/autenticacion.md): Para usar el servicio Route Solver es necesario contar con un token de acceso válido. El token se envía en el encabezado Authorization en cada solicitud, utilizando el formato: HTTP Authorization: Bearer <tu-token> Consideraciones El token es obligatorio en todas las solicitudes. El token es único por cliente y debe mantenerse confidencial. Un token inválido, expirado o ausente resultará en una respuesta 401 Unauthorized . • [POST /route-solver](https://app.theneo.io/pinittms/servicios/routing/post-route-solver.md): POST https://services.pinittms.com/route-solver El servicio Route Solver se accede mediante un único endpoint tipo POST . A través de este endpoint, el usuario envía un conjunto de coordenadas y parámetros opcionales para definir la optimización deseada. El cuerpo de la solicitud se construye en formato JSON , mientras que los encabezados aseguran que la comunicación sea válida y autorizada. Este endpoint está diseñado para ser simple y flexible : basta con proporcionar las coordenadas mínimas necesarias, pero también se puede personalizar la optimización con parámetros como la métrica a optimizar, el tipo de ruta (cerrada o abierta) y la posibilidad de utilizar distancias estimadas cuando no haya información de carreteras. • [Recomendaciones y buenas prácticas](https://app.theneo.io/pinittms/servicios/routing/recomendaciones-y-buenas-practicas.md): Para aprovechar al máximo el servicio Route Solver , considerar lo siguiente: Límites de puntos Cada petición debe incluir entre 2 y 500 puntos . Si necesitas procesar más puntos en una sola ruta, contáctanos para una solución personalizada. Uso de allow_estimated_distance Valor por defecto: true . Con true , el servicio utiliza distancias estimadas (fórmula haversine) cuando no hay datos de carreteras. Con false , si faltan datos de carreteras, la petición devolverá un error . Manejo de rutas abiertas y cerradas Si no se envía el parámetro closed , el servicio detecta automáticamente: Ruta cerrada si la primera y última coordenada son iguales. Ruta abierta si son diferentes. Si se envía explícitamente el parámetro closed , el valor indicado tiene prioridad sobre las coordenadas: closed = true → la ruta será cerrada aunque la primera y última coordenada no coincidan. closed = false → la ruta será abierta aunque la primera y última coordenada sean iguales. Para rutas cerradas, el servicio agrega automáticamente el retorno al punto inicial. En las rutas abiertas, el primer punto de la lista de coordenadas siempre se considera como el punto de origen , y el optimizador determina el punto final más conveniente según la métrica seleccionada. Consideraciones de performance Mientras más puntos incluyas, mayor será el tiempo de procesamiento. Evita enviar puntos irrelevantes o duplicados: aunque se manejan de forma automática, pueden aumentar innecesariamente el tiempo de cálculo. Errores comunes coordinates faltante: campo requerido, debe contener entre 2 y 500 puntos. Coordenadas fuera de rango: latitud debe estar entre -90 y 90, longitud entre -180 y 180. Formato inválido: cada coordenada debe ser un par [latitud, longitud]. metric inválido: debe ser "duration" o "distance". Token de autorización inválido o expirado. Rate limiting excedido, se bloquean solicitudes cuando se supera el límite permitido. • [Ejemplos de peticiones POST /route-solver](https://app.theneo.io/pinittms/servicios/routing/ejemplos-de-peticiones-post.md): A continuación se presentan dos ejemplos prácticos de uso del servicio. En ambos casos se utilizan las mismas coordenadas distribuidas en distintas ciudades de México, pero con una variación en el parámetro closed . El primer ejemplo muestra una ruta cerrada , en la que el recorrido inicia y termina en el mismo punto. El segundo ejemplo corresponde a una ruta abierta , donde el recorrido inicia en el primer punto enviado y finaliza en el destino más eficiente identificado por el optimizador. De esta forma se ilustra claramente la diferencia entre ambos escenarios y cómo realizar la petición en cada caso. Ejemplo 1: ruta cerrada En el mapa se muestran todas las coordenadas enviadas en la petición, marcadas con su índice original. Las flechas indican el orden óptimo en que deben visitarse los puntos según el resultado del servicio. Parámetros de la petición Los parámetros de la petición son: "metric": "duration" : la optimización se realiza en función del tiempo de viaje. "closed": true : indica que la ruta debe regresar al punto inicial, cerrando el recorrido completo. En este caso, dado que el primer y último punto de la lista son iguales, la ruta se considera cerrada de cualquier forma, aun si no se especificara el parámetro. "allow_estimated_distance": true : en caso de que no existan datos de carreteras para algún tramo, el servicio podrá calcular distancias estimadas. 📄 El siguiente bloque muestra un ejemplo de la petición en Python. Python import requests import json url = "https://services.pinittms.com/route-solver" payload = json.dumps({ "coordinates": [ (19.3835064,-99.0443364), (25.44948,-101.01945), (32.52049,-116.84827), (14.91526,-92.24863), (20.75269,-103.40456), (28.66836,-106.07899), (29.04818,-110.94401), (19.40653,-99.00272), (25.75556,-100.4039), (20.50349,-103.21653), (19.70689,-101.24434), (20.663,-87.08055), (20.38164,-101.20835), (20.77104,-100.44001), (19.3835064,-99.0443364) ], "metric": "duration", "closed": True, "allow_estimated_distance": True }) headers = { 'Content-Type': 'application/json', 'Authorization': 'Bearer ' + mi_token } response = requests.request("POST", url, headers=headers, data=payload) print(response.text) Respuesta del servicio La respuesta del servicio muestra el orden óptimo en que deben recorrerse los puntos ( points_order ), expresado como los índices de la lista de coordenadas enviada. Además, incluye el tiempo total estimado del recorrido en segundos ( time ), la distancia total en metros ( distance ) y el motor de cálculo utilizado ( engine ), que en este caso es OSRM , indicando que se usaron datos reales de carreteras. Además, el campo instructions detalla cada tramo de la ruta: para cada par de puntos consecutivos se especifica la distancia, el tiempo y los índices de inicio y fin dentro de points_order . Esto permite desglosar el recorrido total en segmentos más pequeños y analizar cada paso por separado. 📄 El siguiente bloque muestra un ejemplo del JSON de respuesta que devuelve el servicio. JSON { "info": { "copyrights": [ "Pinittms", "OpenStreetMap contributors" ] }, "paths": [ { "points_order": [ 0, 3, 11, 8, 1, 5, 2, 13, 6, 4, 9, 10, 12, 14, 7, 15 ], "distance": 9912281.0, "time": 458379.1, "engine": "OSRM", "instructions": [ { "distance": 1067389, "interval": [ 0, 3 ], "time": 47393.6 }, { "distance": 1398425.2, "interval": [ 3, 11 ], "time": 63355.1 }, { "distance": 2247076.2, "interval": [ 11, 8 ], "time": 99832.2 }, { "distance": 82470.9, "interval": [ 8, 1 ], "time": 3916.1 }, { "distance": 721001.2, "interval": [ 1, 5 ], "time": 34198.2 }, { "distance": 1393445.4, "interval": [ 5, 2 ], "time": 71472.2 }, { "distance": 0, "interval": [ 2, 13 ], "time": 0 }, { "distance": 856263.1, "interval": [ 13, 6 ], "time": 42094.7 }, { "distance": 1347449.2, "interval": [ 6, 4 ], "time": 57817.2 }, { "distance": 41886, "interval": [ 4, 9 ], "time": 2679.8 }, { "distance": 285871.4, "interval": [ 9, 10 ], "time": 12524.1 }, { "distance": 95836.5, "interval": [ 10, 12 ], "time": 4833.1 }, { "distance": 132218, "interval": [ 12, 14 ], "time": 6399.7 }, { "distance": 235893.5, "interval": [ 14, 7 ], "time": 11302.1 }, { "distance": 7055.4, "interval": [ 7, 15 ], "time": 561 } ] } ] } Ejemplo 2: ruta abierta En el mapa se muestran todas las coordenadas enviadas en la petición, marcadas con su índice original. Las flechas indican el orden óptimo en que deben visitarse los puntos según el resultado del servicio. Parámetros de la petición Los parámetros de la petición son: "metric": "duration" : la optimización se realiza en función del tiempo de viaje. "closed": false : indica que la ruta no debe regresar al punto inicial . En este caso, el primer punto de la lista es siempre el origen y el optimizador selecciona el destino final más eficiente. "allow_estimated_distance": true : en caso de que no existan datos de carreteras para algún tramo, el servicio podrá calcular distancias estimadas. 📄 El siguiente bloque muestra un ejemplo de la petición en Python. Python url = "https://services.pinittms.com/route-solver" payload = json.dumps({ "coordinates": [ (19.3835064,-99.0443364), (25.44948,-101.01945), (32.52049,-116.84827), (14.91526,-92.24863), (20.75269,-103.40456), (28.66836,-106.07899), (29.04818,-110.94401), (19.40653,-99.00272), (25.75556,-100.4039), (20.50349,-103.21653), (19.70689,-101.24434), (20.663,-87.08055), (20.38164,-101.20835), (20.77104,-100.44001), (19.3835064,-99.0443364) ], "metric": "duration", "closed": False, "allow_estimated_distance": True }) headers = { 'Content-Type': 'application/json', 'Authorization': 'Bearer ' + mi_token } response = requests.request("POST", url, headers=headers, data=payload) print(response.text) Respuesta del servicio La respuesta del servicio muestra el orden óptimo en que deben recorrerse los puntos ( points_order ), expresado como los índices de la lista de coordenadas enviada. En una ruta abierta, el primer punto corresponde siempre al origen , mientras que el optimizador selecciona el punto final más conveniente para cerrar el recorrido. La respuesta incluye el tiempo total estimado del recorrido en segundos ( time ), la distancia total en metros ( distance ) y el motor de cálculo utilizado ( engine ), que en este caso es OSRM , lo que indica que se usaron datos reales de carreteras. Además, el campo instructions detalla cada tramo de la ruta: para cada par de puntos consecutivos se especifica la distancia, el tiempo y los índices de inicio y fin dentro de points_order . Esto permite desglosar el recorrido total en segmentos más pequeños y analizar cada paso por separado. 📄 El siguiente bloque muestra un ejemplo del JSON de respuesta que devuelve el servicio. JSON { "paths": [ { "points_order": [0, 7, 3, 11, 13, 12, 10, 4, 9, 8, 1, 5, 6, 2], "time": 369067.3, "distance": 7982649.600000001, "engine": "osrm" } ] } • [Preguntas frecuentes](https://app.theneo.io/pinittms/servicios/routing/preguntas-frecuentes.md): En esta sección encontrarás respuestas a las dudas más comunes sobre el uso de Route Solver. ¿Cuál es el máximo de puntos que puedo enviar en una sola petición? Puedes enviar entre 2 y 500 puntos. Si necesitas más, contáctanos para una solución personalizada. ¿Qué diferencia hay entre una ruta cerrada y una abierta? Ruta cerrada: la solución siempre regresa al punto inicial, cerrando el ciclo completo. Ruta abierta: la solución termina en el punto que resulta más óptimo según la optimización, no necesariamente en el último punto enviado. El recorrido siempre comienza en el primer punto que envíes en la lista de coordenadas. ¿Qué pasa si envío coordenadas duplicadas? El servicio las procesa automáticamente, sin afectar la optimización ni generar errores. ¿Por qué a veces el tiempo ( time ) no aparece en la respuesta? El campo time solo está disponible cuando se usan datos de carreteras ( engine = "osrm" ). Si no hay información vial y se usan distancias estimadas, solo se devuelve la distancia. ¿Qué significa el campo engine en la respuesta? Indica el motor utilizado para construir la matriz y calcular la ruta: "osrm" : se usaron datos reales de carreteras (OSRM). "alternative" : se estimó la distancia geodésica (haversine) cuando no hubo datos viales. Notas: Cuando engine = "osrm" , el campo time normalmente está disponible (segundos). Cuando engine = "alternative" , time puede no estar disponible y devolverse null . ¿Qué ocurre si allow_estimated_distance está en false y no hay datos de carreteras? La petición devolverá un error, ya que no se permiten cálculos estimados. ¿Qué formato deben tener las coordenadas? Cada punto debe ser un par [latitud, longitud] con valores dentro del rango: latitud entre -90 y 90, longitud entre -180 y 180. ¿El servicio garantiza siempre la ruta más rápida? El servicio calcula una solución optimizada, pero en rutas con muchos puntos (cercanas al límite) el tiempo de cómputo puede influir en la exactitud. • [Descripción general](https://app.theneo.io/pinittms/servicios/multi-route-solver/descripcion-general.md): El Multi-Vehicle Route Solver es un servicio que optimiza la planificación de rutas para múltiples vehículos , resolviendo el Problema de Enrutamiento de Vehículos con Capacidad (CVRP por sus siglas en inglés). ¿Para qué sirve? Ideal para operaciones logísticas donde necesitas: Distribuir entregas entre múltiples vehículos Minimizar tiempos de operación Respetar restricciones de capacidad, horarios y duración de rutas Principales funcionalidades Optimiza rutas para varios vehículos de forma simultánea Asigna entregas respetando capacidades del vehículo (una o múltiples dimensiones) Considera ventanas de tiempo de operación por vehículo (permite definir horarios de inicio/fin para cada vehículo) Aplica límites máximos de duración por ruta Controla el número máximo de servicios por vehículo Soporta rutas abiertas o cerradas (con o sin retorno al depósito) Permite descansos de conductor con ventana de tiempo Prioriza servicios (alta, media, baja) Identifica servicios no asignados , explicando el motivo • [Autenticación](https://app.theneo.io/pinittms/servicios/multi-route-solver/autenticacion.md): Para usar el servicio POST /multi-route-solver es necesario contar con un token de acceso válido. El token se envía en el encabezado Authorization en cada solicitud, utilizando el formato: HTTP Authorization: Bearer <tu-token> Consideraciones El token es obligatorio en todas las solicitudes. El token es único por cliente y debe mantenerse confidencial. Un token inválido, expirado o ausente resultará en una respuesta 401 Unauthorized . • [POST /multi-route-solver](https://app.theneo.io/pinittms/servicios/multi-route-solver/post-multi-vehicle-route-solver-service.md): POST https://services.pinittms.com/multi-route-solver Este endpoint recibe la lista de servicios (entregas a realizar), la flota de vehículos disponibles y sus tipos/capacidades , y regresa una solución de ruteo donde se indica qué entregas hace cada vehículo y en qué orden. Si alguna entrega no puede asignarse por restricciones (capacidad, horarios, límites por ruta, etc.), el servicio la reporta como no asignada e incluye el motivo. Body El cuerpo de la petición es un objeto JSON con la siguiente estructura: JSON { "services": [...], "vehicles": [...], "vehicle_types": [...], "objectives": [...], "configuration": {...} } services (array, requerido): Servicios o entregas a realizar. vehicles (array, requerido): Vehículos disponibles para asignar. vehicle_types (array, requerido): Tipos de vehículo con sus capacidades. objectives (array, opcional): Objetivos de optimización. configuration (object, opcional): Configuración adicional del servicio. Comentarios sobre algunos parámetros del body latest_end debe ser mayor que earliest_start . Si se define break en vehicles , latest debe ser mayor que earliest y debe existir tiempo suficiente dentro de la ventana para duration . Si de define vehicle_types[].capacity , entonces todos los services[] deben incluir size . size debe tener la misma longitud que capacity . No se permite mezclar: o todos los vehicle_types tienen capacity , o ninguno. La capacidad vehicle_types[].capacity es genérica: puede representar peso, volumen o cualquier otra restricción cuantitativa, sin nombres fijos. Comportamiento entre return_to_depot y end_address Cuando end_address está definido, siempre se usa como punto final de la ruta, independientemente del valor de return_to_depot . end_address no definido + return_to_depot: true (default): Ruta cerrada al origen, regresa a start_address . end_address definido + return_to_depot: true : Ruta termina en end_address . end_address definido + return_to_depot: false : Ruta termina en end_address. end_address no definido + return_to_depot: false : Ruta abierta, termina en el último servicio atendido. • [Recomendaciones y buenas prácticas](https://app.theneo.io/pinittms/servicios/multi-route-solver/recomendaciones-y-buenas-practicas.md): Validación de datos IDs únicos: Asegúrate de que services[].id , vehicles[].vehicle_id y vehicle_types[].type_id no se repitan dentro de la misma petición. Coordenadas válidas: Verifica que las latitudes estén entre -90 y 90, y las longitudes entre -180 y 180. Capacidades y tamaños Si usas capacidad ( vehicle_types[].capacity ), entonces: 1) Todos los servicios deben incluir services[].size , y 2) size debe tener la misma cantidad de dimensiones que capacity . Mantén un orden fijo de dimensiones (por ejemplo [peso, volumen] ) en toda la petición. Usa unidades consistentes en todos los datos (ej. kg y litros, o kg y cm³). No mezcles escalas. Define las dimensiones que necesites: Puedes usar una o varias dimensiones simultáneas (peso, volumen, cantidad de paquetes, etc.). Ejemplo: capacity: [100, 200] → [peso_kg, volumen_litros] . Ventanas de tiempo Usa timestamps Unix en segundos: Tanto earliest_start , latest_end como los campos de break esperan timestamps Unix. Deja margen suficiente: Si usas break , asegúrate de que exista tiempo suficiente para: Traslados + servicios + descanso dentro de earliest_start → latest_end . Evita ventanas demasiado estrechas si esperas alta factibilidad. Configuración de vehículos max_jobs realista: Define un límite acorde a la operación real del vehículo. Ayuda a balancear carga y a evitar rutas demasiado largas por un solo vehículo. Manejo de servicios no asignados Revisa siempre no_unassigned : Si es mayor a 0, consulta el objeto unassigned.services para revisar servicios no asignados. Causas comunes: Capacidad insuficiente, ventana de tiempo muy estrecha, límite de max_jobs alcanzado. • [Ejemplo de petición POST /multi-route-solver](https://app.theneo.io/pinittms/servicios/multi-route-solver/ejemplos-de-peticiones-post-multi-vehicle-route-solver-service.md): El siguiente ejemplo muestra un escenario típico de operación con múltiples vehículos , dos almacenes y restricciones de capacidad , utilizando el endpoint POST /multi-vehicle-route-solver-service . Este ejemplo ilustra cómo el servicio: Distribuye entregas entre varios vehículos. Maneja múltiples almacenes. Distingue entre rutas abiertas y cerradas. Respeta capacidades. Reporta servicios no asignados cuando no cumplen las restricciones. Escenario 15 servicios distribuidos en Ciudad de México. 3 vehículos con capacidad [50, 60] (peso, volumen). 2 almacenes: Almacén A (norte) y Almacén B (sur). 1 servicio no asignable: PKG-015 con size: [60, 80] excede la capacidad de cualquier vehículo. Máximo 5 servicios por vehículo. Configuración de vehículos VEHICULO-01: Inicia en Almacén A, return_to_depot: true → Ruta cerrada , regresa al origen. VEHICULO-02: Inicia en Almacén A, termina en Almacén B → Ruta entre almacenes . VEHICULO-03: Inicia en Almacén B, return_to_depot: false → Ruta abierta , termina en el último servicio atendido. En el mapa se muestra la solución. Cada color representa una ruta distinta, los números en cada nodo representan el orden de visita y en gris se muestra el servicio no asignado. 📄 El siguiente bloque muestra un ejemplo de la petición en Python. Python import requests import json url = "https://services.pinittms.com/multi-route-solver" payload = json.dumps( { "services": [ { "id": "PKG-001", "name": "Entrega Centro Histórico", "address": { "lat": 19.432608, "lon": -99.133209, "location_id": "PKG-001", "street_hint": "Av. 5 de Mayo 123, Centro Histórico" }, "duration": 300, "size": [5, 8], "priority": 1 }, { "id": "PKG-002", "name": "Entrega Polanco", "address": { "lat": 19.433716, "lon": -99.194183, "location_id": "PKG-002", "street_hint": "Av. Presidente Masaryk 456, Polanco" }, "duration": 300, "size": [8, 10], "priority": 1 }, { "id": "PKG-003", "name": "Entrega Roma Norte", "address": { "lat": 19.419444, "lon": -99.162222, "location_id": "PKG-003", "street_hint": "Calle Orizaba 78, Roma Norte" }, "duration": 300, "size": [4, 6], "priority": 1 }, { "id": "PKG-004", "name": "Entrega Condesa", "address": { "lat": 19.411389, "lon": -99.174722, "location_id": "PKG-004", "street_hint": "Av. Tamaulipas 90, Condesa" }, "duration": 300, "size": [6, 8], "priority": 1 }, { "id": "PKG-005", "name": "Entrega Santa Fe", "address": { "lat": 19.359167, "lon": -99.274722, "location_id": "PKG-005", "street_hint": "Centro Comercial Santa Fe, Local 201" }, "duration": 300, "size": [7, 9], "priority": 1 }, { "id": "PKG-006", "name": "Entrega Coyoacán", "address": { "lat": 19.350278, "lon": -99.162222, "location_id": "PKG-006", "street_hint": "Av. Universidad 1500, Coyoacán" }, "duration": 300, "size": [5, 7], "priority": 1 }, { "id": "PKG-007", "name": "Entrega Del Valle", "address": { "lat": 19.391667, "lon": -99.177778, "location_id": "PKG-007", "street_hint": "Av. Insurgentes Sur 800, Del Valle" }, "duration": 300, "size": [4, 5], "priority": 1 }, { "id": "PKG-008", "name": "Entrega Narvarte", "address": { "lat": 19.399722, "lon": -99.154444, "location_id": "PKG-008", "street_hint": "Calzada de Tlalpan 320, Narvarte" }, "duration": 300, "size": [6, 8], "priority": 1 }, { "id": "PKG-009", "name": "Entrega Tlatelolco", "address": { "lat": 19.451944, "lon": -99.137222, "location_id": "PKG-009", "street_hint": "Eje Central 450, Tlatelolco" }, "duration": 300, "size": [5, 6], "priority": 1 }, { "id": "PKG-010", "name": "Entrega Reforma", "address": { "lat": 19.426944, "lon": -99.167778, "location_id": "PKG-010", "street_hint": "Paseo de la Reforma 222, Juárez" }, "duration": 300, "size": [7, 10], "priority": 1 }, { "id": "PKG-011", "name": "Entrega Xochimilco", "address": { "lat": 19.261389, "lon": -99.104167, "location_id": "PKG-011", "street_hint": "Embarcadero Nativitas, Xochimilco" }, "duration": 300, "size": [5, 7], "priority": 1 }, { "id": "PKG-012", "name": "Entrega Pedregal", "address": { "lat": 19.311389, "lon": -99.195833, "location_id": "PKG-012", "street_hint": "Av. de las Fuentes 300, Pedregal" }, "duration": 300, "size": [6, 8], "priority": 1 }, { "id": "PKG-013", "name": "Entrega Lindavista", "address": { "lat": 19.493056, "lon": -99.128333, "location_id": "PKG-013", "street_hint": "Av. Montevideo 500, Lindavista" }, "duration": 300, "size": [4, 5], "priority": 1 }, { "id": "PKG-014", "name": "Entrega Azcapotzalco", "address": { "lat": 19.486944, "lon": -99.183611, "location_id": "PKG-014", "street_hint": "Calz. Camarones 800, Azcapotzalco" }, "duration": 300, "size": [5, 6], "priority": 1 }, { "id": "PKG-015", "name": "Entrega Especial Iztapalapa", "address": { "lat": 19.358056, "lon": -99.058333, "location_id": "PKG-015", "street_hint": "Central de Abasto, Nave A" }, "duration": 300, "size": [60, 80], "priority": 1 } ], "vehicles": [ { "vehicle_id": "VEHICULO-01", "type_id": "camioneta", "start_address": { "lat": 19.487222, "lon": -99.147778, "location_id": "ALMACEN-A", "street_hint": "Almacén Norte, Av. Insurgentes Norte 1500" }, "return_to_depot": True, "earliest_start": 1735689600, "latest_end": 1735718400, "max_jobs": 5 }, { "vehicle_id": "VEHICULO-02", "type_id": "camioneta", "start_address": { "lat": 19.487222, "lon": -99.147778, "location_id": "ALMACEN-A", "street_hint": "Almacén Norte, Av. Insurgentes Norte 1500" }, "end_address": { "lat": 19.303889, "lon": -99.152778, "location_id": "ALMACEN-B", "street_hint": "Almacén Sur, Calz. del Hueso 500" }, "return_to_depot": False, "earliest_start": 1735689600, "latest_end": 1735718400, "max_jobs": 5 }, { "vehicle_id": "VEHICULO-03", "type_id": "camioneta", "start_address": { "lat": 19.303889, "lon": -99.152778, "location_id": "ALMACEN-B", "street_hint": "Almacén Sur, Calz. del Hueso 500" }, "return_to_depot": False, "earliest_start": 1735689600, "latest_end": 1735718400, "max_jobs": 5 } ], "vehicle_types": [ { "type_id": "camioneta", "profile": "car", "capacity": [50, 60] } ], "objectives": [ { "type": "min", "value": "completion_time" } ], "configuration": { "routing": { "fail_fast": True, "consider_traffic": False } } } ) headers = { 'Content-Type': 'application/json', 'Authorization': "Bearer " + mi_token } response = requests.request("POST", url, headers=headers, data=payload) print(response.text) print(response.status_code) Respuesta del servicio La respuesta del servicio muestra la distribución óptima de los servicios en los vehículos, respetando ventanas de tiempo, capacidades, almacenes de origen y destino: 14 servicios asignados entre los 3 vehículos. 1 servicio no asignado (PKG-015) en el objeto unassigned por exceder la capacidad. VEHICULO-01: Su última actividad será tipo end en Almacén A. VEHICULO-02: Su última actividad será tipo end en Almacén B VEHICULO-03: Su última actividad será tipo service (el último servicio atendido, sin retorno) 📄 El siguiente bloque muestra un ejemplo del JSON de respuesta que devuelve el servicio. JSON { "copyrights": [ "Pinittms", "OpenStreetMap contributors" ], "job_id": "job-id-pinit", "status": "finished", "waiting_time_in_queue": 0, "processing_time": 0, "solution": { "costs": 14153, "time": 14153, "distance": 117805, "transport_time": 10253, "service_duration": 3900, "completion_time": 14153, "max_operation_time": 5157, "waiting_time": 0, "preparation_time": 0, "no_vehicles": 3, "no_unassigned": 1, "routes": [ { "vehicle_id": "VEHICULO-01", "shift_id": "default-shift", "distance": 31214, "transport_time": 2763, "completion_time": 4263, "waiting_time": 0, "service_duration": 1500, "preparation_time": 0, "activities": [ { "type": "start", "location_id": "ALMACEN-A", "address": { "lat": 19.487222, "lon": -99.147778, "location_id": "ALMACEN-A", "street_hint": "Almac\u00e9n Norte, Av. Insurgentes Norte 1500" }, "arr_time": 1735689600, "end_time": 1735689600, "arr_date_time": "2025-01-01T00:00:00+00:00", "end_date_time": "2025-01-01T00:00:00+00:00", "waiting_time": 0, "distance": 0, "driving_time": 0, "preparation_time": 0, "load_after": [ 30, 40 ] }, { "type": "service", "id": "PKG-004", "location_id": "PKG-004", "address": { "lat": 19.411389, "lon": -99.174722, "location_id": "PKG-004", "street_hint": "Av. Tamaulipas 90, Condesa" }, "arr_time": 1735690472, "end_time": 1735690772, "arr_date_time": "2025-01-01T00:14:32+00:00", "end_date_time": "2025-01-01T00:19:32+00:00", "waiting_time": 0, "distance": 12230, "driving_time": 872, "preparation_time": 0, "load_before": [ 30, 40 ], "load_after": [ 24, 32 ] }, { "type": "service", "id": "PKG-003", "location_id": "PKG-003", "address": { "lat": 19.419444, "lon": -99.162222, "location_id": "PKG-003", "street_hint": "Calle Orizaba 78, Roma Norte" }, "arr_time": 1735690967, "end_time": 1735691267, "arr_date_time": "2025-01-01T00:22:47+00:00", "end_date_time": "2025-01-01T00:27:47+00:00", "waiting_time": 0, "distance": 13974, "driving_time": 1067, "preparation_time": 0, "load_before": [ 24, 32 ], "load_after": [ 20, 26 ] }, { "type": "service", "id": "PKG-010", "location_id": "PKG-010", "address": { "lat": 19.426944, "lon": -99.167778, "location_id": "PKG-010", "street_hint": "Paseo de la Reforma 222, Ju\u00e1rez" }, "arr_time": 1735691462, "end_time": 1735691762, "arr_date_time": "2025-01-01T00:31:02+00:00", "end_date_time": "2025-01-01T00:36:02+00:00", "waiting_time": 0, "distance": 15328, "driving_time": 1262, "preparation_time": 0, "load_before": [ 20, 26 ], "load_after": [ 13, 16 ] }, { "type": "service", "id": "PKG-002", "location_id": "PKG-002", "address": { "lat": 19.433716, "lon": -99.194183, "location_id": "PKG-002", "street_hint": "Av. Presidente Masaryk 456, Polanco" }, "arr_time": 1735692117, "end_time": 1735692417, "arr_date_time": "2025-01-01T00:41:57+00:00", "end_date_time": "2025-01-01T00:46:57+00:00", "waiting_time": 0, "distance": 19095, "driving_time": 1617, "preparation_time": 0, "load_before": [ 13, 16 ], "load_after": [ 5, 6 ] }, { "type": "service", "id": "PKG-014", "location_id": "PKG-014", "address": { "lat": 19.486944, "lon": -99.183611, "location_id": "PKG-014", "street_hint": "Calz. Camarones 800, Azcapotzalco" }, "arr_time": 1735693122, "end_time": 1735693422, "arr_date_time": "2025-01-01T00:58:42+00:00", "end_date_time": "2025-01-01T01:03:42+00:00", "waiting_time": 0, "distance": 26889, "driving_time": 2322, "preparation_time": 0, "load_before": [ 5, 6 ], "load_after": [ 0, 0 ] }, { "type": "end", "location_id": "ALMACEN-A", "address": { "location_id": "ALMACEN-A", "lat": 19.487222, "lon": -99.147778 }, "arr_time": 1735693863, "end_time": 1735693863, "arr_date_time": "2025-01-01T01:11:03+00:00", "end_date_time": "2025-01-01T01:11:03+00:00", "waiting_time": 0, "distance": 31214, "driving_time": 2763, "preparation_time": 0, "load_before": [ 0, 0 ] } ] }, { "vehicle_id": "VEHICULO-02", "shift_id": "default-shift", "distance": 34514, "transport_time": 3657, "completion_time": 5157, "waiting_time": 0, "service_duration": 1500, "preparation_time": 0, "activities": [ { "type": "start", "location_id": "ALMACEN-A", "address": { "lat": 19.487222, "lon": -99.147778, "location_id": "ALMACEN-A", "street_hint": "Almac\u00e9n Norte, Av. Insurgentes Norte 1500" }, "arr_time": 1735689600, "end_time": 1735689600, "arr_date_time": "2025-01-01T00:00:00+00:00", "end_date_time": "2025-01-01T00:00:00+00:00", "waiting_time": 0, "distance": 0, "driving_time": 0, "preparation_time": 0, "load_after": [ 25, 34 ] }, { "type": "service", "id": "PKG-013", "location_id": "PKG-013", "address": { "lat": 19.493056, "lon": -99.128333, "location_id": "PKG-013", "street_hint": "Av. Montevideo 500, Lindavista" }, "arr_time": 1735689987, "end_time": 1735690287, "arr_date_time": "2025-01-01T00:06:27+00:00", "end_date_time": "2025-01-01T00:11:27+00:00", "waiting_time": 0, "distance": 3450, "driving_time": 387, "preparation_time": 0, "load_before": [ 25, 34 ], "load_after": [ 21, 29 ] }, { "type": "service", "id": "PKG-009", "location_id": "PKG-009", "address": { "lat": 19.451944, "lon": -99.137222, "location_id": "PKG-009", "street_hint": "Eje Central 450, Tlatelolco" }, "arr_time": 1735690927, "end_time": 1735691227, "arr_date_time": "2025-01-01T00:22:07+00:00", "end_date_time": "2025-01-01T00:27:07+00:00", "waiting_time": 0, "distance": 10744, "driving_time": 1027, "preparation_time": 0, "load_before": [ 21, 29 ], "load_after": [ 16, 23 ] }, { "type": "service", "id": "PKG-001", "location_id": "PKG-001", "address": { "lat": 19.432608, "lon": -99.133209, "location_id": "PKG-001", "street_hint": "Av. 5 de Mayo 123, Centro Hist\u00f3rico" }, "arr_time": 1735691750, "end_time": 1735692050, "arr_date_time": "2025-01-01T00:35:50+00:00", "end_date_time": "2025-01-01T00:40:50+00:00", "waiting_time": 0, "distance": 15118, "driving_time": 1550, "preparation_time": 0, "load_before": [ 16, 23 ], "load_after": [ 11, 15 ] }, { "type": "service", "id": "PKG-008", "location_id": "PKG-008", "address": { "lat": 19.399722, "lon": -99.154444, "location_id": "PKG-008", "street_hint": "Calzada de Tlalpan 320, Narvarte" }, "arr_time": 1735692655, "end_time": 1735692955, "arr_date_time": "2025-01-01T00:50:55+00:00", "end_date_time": "2025-01-01T00:55:55+00:00", "waiting_time": 0, "distance": 20548, "driving_time": 2155, "preparation_time": 0, "load_before": [ 11, 15 ], "load_after": [ 5, 7 ] }, { "type": "service", "id": "PKG-006", "location_id": "PKG-006", "address": { "lat": 19.350278, "lon": -99.162222, "location_id": "PKG-006", "street_hint": "Av. Universidad 1500, Coyoac\u00e1n" }, "arr_time": 1735693664, "end_time": 1735693964, "arr_date_time": "2025-01-01T01:07:44+00:00", "end_date_time": "2025-01-01T01:12:44+00:00", "waiting_time": 0, "distance": 27382, "driving_time": 2864, "preparation_time": 0, "load_before": [ 5, 7 ], "load_after": [ 0, 0 ] }, { "type": "end", "location_id": "ALMACEN-B", "address": { "lat": 19.303889, "lon": -99.152778, "location_id": "ALMACEN-B", "street_hint": "Almac\u00e9n Sur, Calz. del Hueso 500" }, "arr_time": 1735694757, "end_time": 1735694757, "arr_date_time": "2025-01-01T01:25:57+00:00", "end_date_time": "2025-01-01T01:25:57+00:00", "waiting_time": 0, "distance": 34514, "driving_time": 3657, "preparation_time": 0, "load_before": [ 0, 0 ] } ] }, { "vehicle_id": "VEHICULO-03", "shift_id": "default-shift", "distance": 52077, "transport_time": 3833, "completion_time": 4733, "waiting_time": 0, "service_duration": 900, "preparation_time": 0, "activities": [ { "type": "start", "location_id": "ALMACEN-B", "address": { "lat": 19.303889, "lon": -99.152778, "location_id": "ALMACEN-B", "street_hint": "Almac\u00e9n Sur, Calz. del Hueso 500" }, "arr_time": 1735689600, "end_time": 1735689600, "arr_date_time": "2025-01-01T00:00:00+00:00", "end_date_time": "2025-01-01T00:00:00+00:00", "waiting_time": 0, "distance": 0, "driving_time": 0, "preparation_time": 0, "load_after": [ 22, 29 ] }, { "type": "service", "id": "PKG-011", "location_id": "PKG-011", "address": { "lat": 19.261389, "lon": -99.104167, "location_id": "PKG-011", "street_hint": "Embarcadero Nativitas, Xochimilco" }, "arr_time": 1735690418, "end_time": 1735690718, "arr_date_time": "2025-01-01T00:13:38+00:00", "end_date_time": "2025-01-01T00:18:38+00:00", "waiting_time": 0, "distance": 9716, "driving_time": 818, "preparation_time": 0, "load_before": [ 22, 29 ], "load_after": [ 17, 22 ] }, { "type": "service", "id": "PKG-012", "location_id": "PKG-012", "address": { "lat": 19.311389, "lon": -99.195833, "location_id": "PKG-012", "street_hint": "Av. de las Fuentes 300, Pedregal" }, "arr_time": 1735691817, "end_time": 1735692117, "arr_date_time": "2025-01-01T00:36:57+00:00", "end_date_time": "2025-01-01T00:41:57+00:00", "waiting_time": 0, "distance": 23117, "driving_time": 1917, "preparation_time": 0, "load_before": [ 17, 22 ], "load_after": [ 11, 14 ] }, { "type": "service", "id": "PKG-007", "location_id": "PKG-007", "address": { "lat": 19.391667, "lon": -99.177778, "location_id": "PKG-007", "street_hint": "Av. Insurgentes Sur 800, Del Valle" }, "arr_time": 1735693114, "end_time": 1735693414, "arr_date_time": "2025-01-01T00:58:34+00:00", "end_date_time": "2025-01-01T01:03:34+00:00", "waiting_time": 0, "distance": 38905, "driving_time": 2914, "preparation_time": 0, "load_before": [ 11, 14 ], "load_after": [ 7, 9 ] }, { "type": "end", "id": "PKG-005", "location_id": "PKG-005", "address": { "lat": 19.359167, "lon": -99.274722, "location_id": "PKG-005", "street_hint": "Centro Comercial Santa Fe, Local 201" }, "arr_time": 1735694333, "end_time": 1735694633, "arr_date_time": "2025-01-01T01:18:53+00:00", "end_date_time": "2025-01-01T01:23:53+00:00", "waiting_time": 0, "distance": 52077, "driving_time": 3833, "preparation_time": 0, "load_before": [ 7, 9 ], "load_after": [ 0, 0 ] } ] } ], "unassigned": { "services": [ "PKG-015" ], "shipments": [], "breaks": [], "details": [ { "id": "PKG-015", "code": 2, "reason": "could not be assigned" } ] } } } • [Preguntas frecuentes](https://app.theneo.io/pinittms/servicios/multi-route-solver/preguntas-frecuentes.md): En esta sección encontrarás respuestas a las dudas más comunes sobre el uso de Route Solver. ¿Por qué un servicio aparece en unassigned ? Un servicio puede quedar sin asignar por varias razones: Su size excede la capacity de todos los vehículos. No cabe en la ventana de tiempo disponible. Todos los vehículos ya alcanzaron su límite de max_jobs . Revisa el objeto unassigned.details para ver el motivo específico. ¿Qué formato deben tener los timestamps? Todos los timestamps ( earliest_start , latest_end , earliest , latest en breaks) deben ser Unix timestamps en segundos , no milisegundos. ¿Qué pasa si no defino capacity en vehicle_types ? Si no defines capacity , no es necesario incluir size en los servicios. ¿Puedo usar diferentes capacidades para cada vehículo? Sí. Define múltiples entradas en vehicle_types con diferentes capacity y asigna el type_id correspondiente a cada vehículo. ¿Cuál es la diferencia entre return_to_depot y end_address ? return_to_depot: true (sin end_address diferente): El vehículo regresa a start_address . end_address definido: El vehículo termina en esa dirección, independientemente de return_to_depot . return_to_depot: false (sin end_address ): Ruta abierta, termina en el último servicio. ¿Cómo afecta la prioridad a la optimización? Los servicios con prioridad 1 (alta) tienen mayor penalización si quedan sin asignar. El optimizador intentará asignarlos primero. Usa prioridad 2 o 3 para entregas menos críticas. ¿En qué unidades están la distancia y el tiempo? Distancia: metros Tiempo: segundos ¿Puedo tener vehículos que inicien en diferentes almacenes? Sí. Cada vehículo tiene su propio start_address y end_address , por lo que puedes configurar flotas distribuidas en múltiples ubicaciones. ¿Qué representan load_before y load_after en la respuesta? Indican la carga del vehículo: load_before : carga antes de atender el servicio. load_after : carga después de atender el servicio. Se reportan usando el mismo orden de dimensiones definido en la capacidad. ¿Cuál es el tamaño máximo recomendado para una petición? Para mantener tiempos de respuesta estables: Usa decenas o centenas de servicios , no miles, en una sola petición. Si tu operación es muy grande, divide el problema en varias ejecuciones. • [Descripción general](https://app.theneo.io/pinittms/servicios/blur-it/descripcion-general.md): Blur It es un servicio de anonimización de rostros en imágenes. Detecta caras automáticamente y les aplica un efecto de blur para proteger la identidad de las personas. ¿Para qué sirve? El servicio recibe una imagen, detecta los rostros presentes y devuelve una nueva imagen con las caras difuminadas. Es útil en escenarios donde se necesita proteger la privacidad de las personas, como evidencias fotográficas de entregas logísticas. Características principales Detección automática de rostros: No necesitas indicar dónde estan las caras. El servicio las encuentra por ti. Tres tipos de blur disponibles: Gaussian (difuminado suave), Pixelate (efecto mosaico) y Solid (bloqueo solido). Puedes elegir el que mejor se ajuste a tu caso de uso. Consulta la seccion Tipos de blur para ver ejemplos visuales y detalles de cada uno. Deteccion multi-rotacion: El servicio analiza la imagen en distintas orientaciones (0, 90, 180, 270 grados). Esto permite detectar rostros incluso en fotos giradas, como las tomadas con celular en distintas posiciones. Dos formas de enviar la imagen: Puedes enviar la imagen como URL o codificada en base64. Dos formas de recibir el resultado: La imagen procesada puede devolverse como URL temporal (disponible durante 24 horas) o en base64. • [Autenticación](https://app.theneo.io/pinittms/servicios/blur-it/autenticacion.md): Todas las peticiones al servicio requieren autenticacion mediante un token Bearer. ¿Cómo obtener tu token? Para obtener tus credenciales de acceso, contacta al equipo de ventas de Pinit. Ellos te proporcionaran el token necesario para consumir el servicio. ¿Cómo usarlo? Incluye el token en el header Authorization de cada peticion: HTTP Authorization: Bearer <tu-token> Consideraciones El token es obligatorio en todas las solicitudes. El token es único por cliente y debe mantenerse confidencial. Un token inválido, expirado o ausente resultará en una respuesta 401 Unauthorized . • [POST /blur-it](https://app.theneo.io/pinittms/servicios/blur-it/post-blur-it.md): POST https://services.pinittms.com/blur-it Este es el endpoint principal del servicio. Recibe una imagen, detecta los rostros y devuelve la imagen con las caras difuminadas. Antes de empezar Algunos puntos clave sobre el servicio: Imagen de entrada Se debe enviar image_url o image_base64 , pero no ambos. Uno de los dos es obligatorio. La imagen no debe exceder 4096x4096 pixeles. Si supera ese limite, el servicio respondera con el error IMAGE_TOO_LARGE . El campo image_base64 no debe superar los 10 MB. Tipos de blur El servicio ofrece tres tipos de blur: gaussian , pixelate y solid . Consulta la seccion Tipos de blur para ver ejemplos visuales y detalles de cada uno. Campos especificos en la respuesta kernel_size : Aparece en las detecciones solo cuando se usa blur gaussiano. Indica el tamaño del kernel usado para el difuminado. Se calcula automáticamente según el tamaño del rostro. block_size : Aparece en las detecciones solo cuando se usa blur pixelate. Indica el tamano del bloque en pixeles usado para el efecto mosaico. Manejo de errores El servicio puede responder con status HTTP 200 incluso cuando ocurre un error. Siempre valida el campo success en el body para confirmar si la peticion se proceso correctamente. IMAGE_TOO_LARGE : La imagen excede las dimensiones máximas permitidas (4096x4096 pixeles). IMAGE_LOAD_ERROR : No se pudo cargar la imagen. La URL puede ser invalida, inaccesible o no apuntar a una imagen. • [Tipos de blur](https://app.theneo.io/pinittms/servicios/blur-it/tipos-de-blur.md): El servicio ofrece tres opciones de blur . Cada una produce un resultado visual diferente. Elige la que mejor se adapte a tu caso de uso. Gaussian Aplica un difuminado suave sobre el rostro usando una distribucion gaussiana. El resultado es natural y profesional. Es la opcino por defecto. Valor en el request: "blur_type": "gaussian" Pixelate Aplica un efecto de mosaico sobre el rostro. Los bloques de pixeles ocultan los rasgos faciales. Valor en el request: "blur_type": "pixelate" Solid Cubre el rostro con un rectangulo negro solido. Es la opcion con mayor nivel de anonimización, ya que no deja visible nada. Valor en el request: "blur_type": "solid" Ejemplos adicionales El servicio detecta rostros en distintas condiciones: multiples personas en una misma imagen, rostros parcialmente cubiertos (como con cubrebocas) y rostros en angulo o inclinados. Imagen origial Blur “pixelate” Imagen original Blur “gaussian” • [Recomendaciones y buenas prácticas](https://app.theneo.io/pinittms/servicios/blur-it/-4.md): Valida siempre el campo success El servicio puede responder con HTTP 200 incluso cuando hay un error. Antes de usar la imagen resultante, verifica que success sea true . Verifica las dimensiones antes de enviar La imagen no debe superar 4096x4096 pixeles. Si trabajas con fotos de alta resolución, redimensiona la imagen antes de enviarla para evitar errores innecesarios. Si requieres que el servicio soporte imágenes más grandes, contacta el equipo de Pinit. Usa image_url cuando sea posible Si tu imagen ya esta disponible en una URL pública, enviarla como image_url es más eficiente que convertirla a base64. Reduces el tamaño del request y el tiempo de transferencia. Descarga la imagen resultante pronto Cuando usas response_image_type: "url" , la URL generada es temporal y expira en 24 horas . Descarga o almacena la imagen en tu propio sistema antes de que expire. Elige el tipo de blur según tu necesidad No todos los escenarios requieren el mismo nivel de anonimización. Usa gaussian para un resultado natural, pixelate para un estilo editorial, y solid cuando necesites la máxima protección de identidad. • [Preguntas frecuentes](https://app.theneo.io/pinittms/servicios/blur-it/preguntas-frecuentes.md): En esta sección encontrarás respuestas a las dudas más comunes sobre el uso de Blur it. ¿Qué pasa si la imagen no tiene ningún rostro? El servicio responde con success: true , pero el arreglo detections estará vacio y summary.faces_detected sera 0. La imagen devuelta sera identica a la original, sin modificaciones. ¿Puedo enviar image_url y image_base64 al mismo tiempo? No. Debes enviar uno de los dos, pero no ambos. Si necesitas cambiar de metodo entre peticiones, simplemente usa el campo correspondiente en cada request. ¿Cuánto tarda el servicio en procesar una imagen? Depende del tamaño de la imagen y la cantidad de rostros. En general, el tiempo de procesamiento es de unos cientos de milisegundos. Puedes consultar el valor exacto en summary.processing_time_ms de cada respuesta. ¿Detecta rostros con cubrebocas, lentes o parcialmente cubiertos? Si. El servicio puede detectar rostros parcialmente cubiertos, aunque el nivel de confianza (confidence) puede ser menor en estos casos. ¿Detecta rostros en imagenes giradas? Si. Por defecto, el servicio analiza la imagen en cuatro orientaciones (0, 90, 180 y 270 grados). Esto permite detectar rostros en fotos tomadas con el celular en distintas posiciones. ¿La URL de la imagen procesada es permanente? No. Las URLs generadas cuando usas response_image_type: "url" expiran en 24 horas. Descarga la imagen antes de que expire. ¿El servicio almacena mis imagenes? No. El servicio no almacena las imagenes de forma permanente. Las URLs temporales se generan para la entrega del resultado y expiran en 24 horas. ¿Qué formatos de imagen soporta? El servicio acepta los formatos de imagen mas comunes como JPEG, PNG y WebP. ¿Puedo usar el servicio para video? No. El servicio procesa imagenes individuales. Para video, tendrias que extraer los frames, procesarlos uno por uno y reconstruir el video por tu cuenta.