Skip to main content
Use la API de licitaciones para enviar cargas desde su sistema a un transportista que opera en Alvys. Usted envía cada carga como una licitación en JSON. El transportista acepta la licitación, Alvys crea una carga a partir de ella y usted sigue esa carga con webhooks. No necesita una red EDI ni una identidad X12. Si ya intercambia EDI 204, los mismos endpoints transportan los mismos datos como JSON. Esta guía tiene dos lectores:
  • Socio: el TMS, corredor o sistema de remitente que envía las licitaciones.
  • Administrador del transportista: la persona que configura la conexión en la cuenta de Alvys del transportista.
Cada sección indica a qué lector está dirigida.
Obtener acceso a la API
  • Los clientes existentes de Alvys pueden conseguir acceso a la API contactando a su representante de cuenta.
  • Los proveedores independientes de software (ISV) deben ponerse en contacto con el equipo de asociación de Alvys.

Lo que necesita

Para el socio y el administrador del transportista. El plan del transportista debe incluir acceso a la API pública. Si no lo incluye, todas las llamadas devuelven 402.

Alcances

La credencial determina los alcances. El campo scope de la solicitud de token no puede reducirlos. Pida al administrador del transportista que asigne estos alcances:
Actualizar y cancelar una licitación requiere tender:create, no tender:update.
Todas las rutas siguientes son relativas a la URL base https://integrations.alvys.com. Los endpoints de licitaciones, webhooks, ubicaciones y subsidiarias usan v1.0. Los endpoints de cargas usan v2.0. Consulte Versionado.

Enrutamiento de transportista y cliente

Para el socio y el administrador del transportista. Cada licitación lleva seis ID de enrutamiento. Indican a Alvys a qué conexión de transportista pertenece la licitación y, a través de esa conexión, para cuál de los clientes del transportista es la carga. El transportista almacena esos mismos seis valores en una conexión en Alvys. Alvys los compara como cadenas exactas. Cuentan las mayúsculas, los espacios y el relleno. ZZ y zz son valores distintos. Una conexión es de uno de dos tipos:
  • Conexión por cliente. La conexión nombra a un cliente. Toda licitación que coincida con sus seis ID se asigna a ese cliente.
  • Conexión general (catch-all). Una sola conexión recibe licitaciones de cualquier remitente. Alvys asigna cada licitación al cliente cuyo Company Number sea igual al SenderGsId de la licitación. Exactamente un cliente debe tener ese Company Number.
Alvys busca una conexión en este orden:
  1. Una conexión cuyos seis ID sean todos iguales a los seis ID de la licitación.
  2. Si no existe, la conexión general del transportista.
  3. Si tampoco existe, la solicitud falla con Integration is missing.
Otros identificadores:
  • ShipmentId es su identificador de la licitación. Alvys lo usa para encontrar la licitación cuando usted envía una actualización o una cancelación. Se convierte en el número de orden de la carga.
  • SCAC se almacena en la licitación. No enruta la licitación.
  • Los valores IdCode de las paradas no seleccionan una ubicación. Alvys hace coincidir las ubicaciones de las paradas por dirección y nombre.

Sin EDI: elija los ID de enrutamiento

Para el socio y el administrador del transportista. No necesita una identidad X12. Acuerde seis valores con el transportista y el transportista los ingresa en la conexión. Use el calificador ZZ (definido mutuamente) y ID cortos, en mayúsculas y sin espacios.
Si el transportista usa una conexión general, SenderGsId debe ser igual al Company Number del cliente en Alvys. Si ningún cliente tiene ese Company Number, o si lo tiene más de uno, la licitación se rechaza.

Con EDI: reutilice sus ID X12

Para socios que ya intercambian EDI 204. Envíe sus ISA ID y GS ID reales y sus calificadores. Los endpoints JSON se corresponden con los códigos de propósito del 204: Diferencias con el X12 clásico sobre VAN o AS2:
Alvys encuentra la conexión solo por los seis ID de enrutamiento. No revisa el transporte de la conexión. Si sus ID coinciden con una conexión que usa un transporte EDI, como AS2, SFTP o una VAN, Alvys envía respuestas EDI, como los 990, por esa conexión, igual que para una licitación EDI. Pida al transportista que configure una conexión separada con el transporte Public API para su tráfico de API, con ID de enrutamiento que ninguna conexión EDI use.

Lista de verificación de configuración del transportista

Para el administrador del transportista.
  1. Cree las credenciales de cliente de la API para el socio en Admin → API Access y asigne los alcances indicados arriba.
  2. Cree el cliente para el que son las cargas. Si usa una conexión general, establezca el Company Number del cliente con el SenderGsId acordado.
  3. Vaya a Manage → EDI & Visibility y agregue una conexión para el socio:
    • Establezca el transporte en Public API.
    • Ingrese los seis ID de enrutamiento.
    • Elija el cliente, o conviértala en una conexión general.
    • Elija la subsidiaria a la que pertenecen las cargas.
  4. Decida cómo se aceptan las licitaciones. Para aceptarlas automáticamente, active Auto-Accept EDI Tenders en el cliente. Si usa flotas, establezca también la flota predeterminada del cliente.
  5. Envíe al socio los seis ID de enrutamiento y su SCAC.
Una conexión con el transporte Public API no envía nada de vuelta por EDI. El socio recibe cada resultado mediante webhooks o consultando la API.

Flujo de trabajo

Para el socio. Una licitación pasa por estos estados:

1. Obtenga un token

Solicite un token con el flujo de credenciales de cliente y envíelo como Authorization: Bearer <token> en cada llamada. Guarde el token en caché hasta que expire. Consulte Autenticarse con la API pública de Alvys.

2. Suscríbase a los eventos de licitaciones y cargas

Cree la suscripción antes de enviar la primera licitación, para no perder tender.created.
  • Liste cada evento por su nombre exacto. No hay comodines.
  • Envíe exactamente uno de SubsidiaryIds o AllSubsidiaries. SubsidiaryId está obsoleto. Obtenga los id de subsidiaria en List subsidiaries.
  • Una suscripción puede contener hasta 50 eventos.
La respuesta 201 incluye Secret. Guárdelo. Las llamadas de obtención y listado lo devuelven enmascarado. Úselo para verificar las firmas.
La respuesta anterior está abreviada. Consulte Create webhook subscription para ver todos los campos.

3. Cree una licitación

POST /api/p/v1.0/tenders crea una licitación en la cuenta del transportista. La licitación válida más pequeña tiene los ID de enrutamiento, SCAC, ShipmentId y dos paradas:
Una llamada exitosa devuelve 201 Created con un cuerpo vacío. El encabezado Location apunta a la nueva licitación:
Una licitación más completa agrega equipo, peso, tarifa, referencias y notas:
Los códigos de calificador y de unidad de este ejemplo (L, TV, BM, PU, DO) son valores X12 comunes. Alvys no los valida. Reglas para el cuerpo de la licitación:
  • Envíe al menos dos paradas. El Type de cada parada es Pickup o Delivery.
  • Incluya al menos una recogida y una entrega cuyo Entity tenga ciudad y estado. Si no, Alvys igualmente devuelve 201, pero la licitación no se puede aceptar hasta que el transportista la corrija en Alvys.
  • Establezca Type en cada referencia con el nombre de referencia que usa el transportista, por ejemplo BOL Number. El nombre se convierte en el nombre de la referencia en la carga. Una referencia sin Type puede descartarse.
  • Rate se convierte en la tarifa de línea y de facturación de la carga. No puede enviar recargo por combustible ni cargos accesorios en una licitación.
  • La respuesta no incluye la licitación. Léala en el paso siguiente.
Consulte Create tender para ver todos los campos.

Fechas y zonas horarias

Envíe cada fecha como la hora local de reloj en la parada o en el cliente. Alvys conserva la hora de reloj que usted envía y aplica la zona horaria que resuelve para la licitación. Por lo tanto, una marca de tiempo UTC, como una que termina en Z, puede desplazarse varias horas. Alvys ignora el desfase de sus marcas de tiempo. El -06:00 de los ejemplos de esta página no tiene efecto. Si Alvys no puede resolver una zona horaria para la licitación, descarta ExpirationDate, y la licitación no muestra un plazo de respuesta.

4. Encuentre el id de su licitación

Necesita el id de la licitación para leerla y para aceptarla o rechazarla. Obténgalo de una de tres maneras:
  • El encabezado Location de la respuesta de creación.
  • data.tenderId en el webhook tender.created.
  • Una búsqueda por ShipmentId:
La respuesta es una página con Items, Total, Page y PageSize. Cada elemento es una licitación con su Id, Status, ShipmentId y paradas.
El id de la licitación normalmente no cambia. Puede cambiar si Alvys vincula la licitación a una carga existente. Tome el id del webhook más reciente, o busque por ShipmentId, antes de actuar sobre una licitación.

5. Acepte la licitación

Una licitación se acepta de una de tres maneras. El transportista elige cuál. Cuando Alvys crea una carga a partir de la licitación, envía tender.accepted con el loadId y el loadNumber de la nueva carga. La nueva carga recibe el id de la licitación, por lo que loadId es igual a tenderId:
La instantánea data.tender anterior está abreviada. Tiene los mismos campos que Get tender, en camelCase. Consulte Tender events.
Si el transportista ya tiene una carga cuyo número de orden es igual a su ShipmentId, Alvys vincula la licitación a esa carga y no crea una carga nueva. La licitación toma el id de esa carga. Luego Alvys envía tender.created para el nuevo id de la licitación, con data.tender.status igual a Accepted, y no envía tender.accepted. Trate un tender.created con estado Accepted como una aceptación, y asócielo con su licitación por shipmentId.
Si la aceptación automática falla, por ejemplo porque no se puede hacer coincidir la ubicación de una parada o porque el cliente no tiene flota predeterminada, la licitación permanece en New. El motivo se muestra al transportista en Alvys. No aparece en la respuesta de la API.

Aceptar a través de la API

  1. Obtenga la licitación y lea el StopId de cada parada:
  2. Encuentre el id de ubicación de Alvys de cada parada con Get location o Search locations. La ubicación ya debe existir. Aceptar a través de la API no crea ubicaciones.
  3. Acepte con un vínculo para cada parada de la licitación. FleetId es opcional.
La respuesta es 200 con la licitación. Status es Accepted y LoadNumber está establecido. Si acepta una licitación que ya está aceptada, Alvys la devuelve sin cambios.

6. Lea la carga

Después de la aceptación, la licitación tiene una carga. Obtenga la carga por su número de orden, que es su ShipmentId, o por el loadNumber de tender.accepted. Envíe exactamente un parámetro de consulta.
La respuesta anterior está abreviada. Consulte Get load para ver todos los campos.

7. Envíe cambios y cancelaciones

Envíe un cambio a POST /api/p/v1.0/tenders/update y una cancelación a POST /api/p/v1.0/tenders/cancel.
  • Envíe el cuerpo completo de la licitación cada vez, con los mismos ID de enrutamiento y ShipmentId, y la lista completa de paradas. Para una cancelación, envíe el cuerpo de la última licitación que envió.
  • Ambos devuelven 201 con un cuerpo vacío, igual que la creación.
  • Si no existe una licitación para el ShipmentId, o la última licitación fue cancelada, una actualización crea una licitación nueva.
  • Si no existe una licitación para el ShipmentId, una cancelación crea una licitación y la cancela, para que el transportista vea la cancelación en Alvys.
  • Si vuelve a enviar una creación para un ShipmentId cuya última licitación no está cancelada ni rechazada, Alvys la trata como una actualización. Esto incluye una licitación que ya fue aceptada. Si la última licitación fue cancelada o rechazada, o su carga fue cancelada, Alvys crea una licitación nueva.
Qué sucede a continuación:
  • Actualización. Alvys envía tender.change.created. Si queuedForReview es true, el transportista revisa el cambio en Alvys y usted recibe tender.change.accepted cuando se aplica. Si es false, el cambio se aplicó directamente.
  • Cancelación, licitación aún no aceptada. La licitación se cancela. Usted recibe tender.cancelled.
  • Cancelación, licitación aceptada. De forma predeterminada, el transportista confirma la cancelación y luego la carga se cancela. Algunas conexiones cancelan la carga de inmediato, sin la confirmación del transportista. Usted recibe tender.cancelled.
  • Cancelación, sin licitación para el ShipmentId. Alvys crea una licitación y la cancela. Usted recibe tender.created y luego tender.cancelled.
Use un ShipmentId que sea único dentro de la cuenta del transportista, por ejemplo con un prefijo para su sistema. Alvys encuentra la licitación que se va a actualizar o cancelar por ShipmentId.

8. Rechace una licitación

Para el transportista, o un socio que actúa en nombre del transportista. POST /api/p/v1.0/tenders/{tenderId}/reject rechaza una licitación. Establezca CancelLinkedLoad en true para cancelar también una carga que ya se haya creado a partir de ella.
Los códigos de motivo son texto libre. Los valores comunes son A13 (otros motivos), EQU (sin equipo disponible), CPU (capacidad acordada excedida), LL1 (la carga no nos pertenece) y LL2 (no se puede completar la carga). El socio recibe tender.rejected.

9. Siga el estado y los documentos

  • Estado. load.status.changed incluye previousStatus, status y la carga. Consulte Load events.
  • Actualizaciones de parada. tender.stop.arrived, tender.stop.departed y tender.stop.eta_updated informan el progreso de las paradas respecto a la licitación. Consulte Tender events.
  • Documentos. load.document.uploaded incluye el número de carga y un document con un downloadUrl. El enlace es válido por 10 minutos. Para obtener un enlace nuevo, llame a GET /api/p/v2.0/loads/{loadNumber}/documents. Consulte Document events.
  • Cargar documentos. POST /api/p/v2.0/loads/{loadNumber}/document carga un archivo a la carga. Consulte Upload load document.
Los webhooks pueden llegar más de una vez y fuera de orden. Use X-Alvys-Event-Id para ignorar duplicados. Para recuperar eventos perdidos, consulte periódicamente Get load y la lista de documentos. Consulte Event delivery reliability.
La API REST usa nombres de propiedad en PascalCase, por ejemplo LoadNumber. Los payloads de webhook usan camelCase, por ejemplo loadNumber, y omiten las propiedades que no tienen valor.

Errores comunes

Los errores se listan con los más frecuentes primero. Los errores de “conflicto” devuelven 400, no 409. Algunos errores devuelven una cadena JSON simple en lugar de un objeto de problema. Si ninguno coincide, contacte a support@alvys.com con el ShipmentId, la hora de la llamada y el cuerpo de la respuesta.

Recursos relacionados