Obtener Token de Autenticación (login API)
Creación de una carga (shipment API)
Introducción
El sistema dispone de un webservice específico para poder generar cargas automáticamente en nuestro sistema para un cliente específico, lo que facilita la integración con otros sistemas y automatización de procesos.
El proceso se divide en dos fases:
- Pruebas en entorno de testing: el equipo de IT proporcionará credenciales para el entorno de test.
- Implementación en producción: Una vez completadas las pruebas con éxito, se proporcionarán las credenciales finales para el entorno de producción.
Cada fase se divide en dos pasos:
- Obtención del token de autenticación (tiene una duración de 24h)
- Creación de la carga
Obtener Token de Autenticación (login API)
Para interactuar con las APIs, es necesario obtener un token de autenticación mediante la API de login.
La autenticación se lleva a cabo mediante la verificación de email y contraseña, que serán proporcionadas por el departamento de sistemas. A través de la autenticación el usuario obtendrá un token que será válido durante 24h. Se debe almacenar este token y sólo generar uno nuevo cuando se retorne un error de token expirado.
Descripción método /login
Request
- Tipo de petición: POST
- Parameter content type: application/json
- Body attributes
{
"email": "string", //Obligatorio
"force": true, //Obligatorio, valor constante por defecto a true
"password": "string", //Obligatorio
"role": "API_SHIPMENT" //Obligatorio, deberá tomar el valor "API_SHIPMENT"
}Response
{
"expire": 0,
"token": "string",
"user": {
"active": true,
"first_name": "string",
"id": 0,
"image_profile_url": "string",
"last_name": "string",
"mobile_number": "string",
"nick_name": "string",
"player_id": "string",
"roles": [
{
"description": "string",
"name": "string"
}
]
}
}Ejemplo
REQUEST
POST: https://qa.fr8.app/v1/login
Payload del Body (JSON):
{
"email": "peter@fr8app.com",
"force": true,
"password": " Password789#",
"role": "API_SHIPMENT"
}RESPONSE
{
"exp": 1729727977,
"token": "eyJhbGciOiJIUzUxMiIsInR5cCI6IkpXVCJ9.eyJhdWQiOiJmcjhodWJfd2ViIiwiZXhwIjoxNzI5NzI3OTc3LCJpYXQiOjE3MTUyMTI3NzcsImlzcyI6ImZyOGh1Yl93ZWIiLCJqdGkiOiI5NzYxZDc3Yy01NGIyLTRiNTUtOTFhNS1iMjlkFGFhY2YwY2QiLCJuYmYiOjE3MTUyMTI3NzYsInN1YiI6IjEwNCIsInR5cCI6ImFjY2VzcyJ9.m73ADrBaxu_b-1GsZLYhbSu_X3p_7ekHMZVarhmTLygVn7yIRsMGUGMQmFFRrq3Z22dZ35kJZ9P5CnFM_xVn0g",
"user": {
"active": true,
"email": "peter@fr8app.com",
"first_name": "peter",
"id": 110,
"image_profile_url": null,
"last_name": "test",
"mobile_number": "5200000000",
"nick_name": null,
"player_id": null,
"roles": [
{
"description": "API shipment role in Fr8hub",
"name": "API_SHIPMENT" } ] }
}
Webservice login QA
- API: https://qa.fr8.app/v1/login
- Credenciales: Proporcionadas por el equipo de IT
Webservice login Prod
- API: https://my.fr8.app/v1/login
- Credenciales: Se proporcionarán tras la validación en entorno de pruebas
Creación de una carga (shipment API)
Consideraciones previas
- Para la creación de un shipment en el sistema de Fr8App, será necesario utilizar un Bearer Token obtenido previamente por el método login y proporcionar todos los campos requeridos por el método.
- Para completar la información tanto para la dirección de pickup como la de dropoff (shipment_lane) existen tres posibles opciones, las cuales tienen un orden de prioridades y son excluyentes, es decir, si la información de la primera opción es correcta, no se tendrán en cuenta las demás:
- facility id: identificador de facility del sistema
- Longitud y latitud
- Dirección: address, country, city, state (address es opcional)
Descripción método /shipment
Request
- Tipo de petición: POST
- Tipo de autorización: Bearer Token
- Parameter content type: application/json
- Body attributes
{
"after_hours_follow_up": boolean, //No obligatorio
"bol_number": "string", //No obligatorio
"copies": integer, //Obligatorio, valor por defecto ‘1’. Número de cargas a crear en el sistema
"currency_code": "string", //Obligatorio, valor por defecto “mxn”, podría tomar “usd”
"expected_segments": integer, //No obligatorio
"hot": boolean, //No obligatorio
"invoicing_entity": "string", //No obligatorio, posibles valores: fr8hub_mex, fr8hub_usa. Por defecto se toma del shipper
"invoicing_reference": "string", //No obligatorio
"max_price": numeric, //No obligatorio, por defecto toma 0 si no viene relleno en el payload
"pickup_number": "string", //No obligatorio
"post_to_marketplace": boolean, //No obligatorio si lo genera cuenta de cliente (si ("shipment_type": "spot" o "primary") y
“max_price” ‘0’, entonces true, sino false)
"purchase_order_number": "string", //No obligatorio
"seal_number": "string", //No obligatorio
"shipment_details": {
"additional_equip_dry_van": boolean, //No obligatorio
"additional_equip_flatbed": boolean, //No obligatorio
"additional_equip_reefer": boolean, //No obligatorio
"additional_equip_rabon": boolean, //No obligatorio
"additional_equip_torton": boolean, //No obligatorio
"air_ride": boolean, //No obligatorio
"category": "string", //Obligatorio, subcategoría en función del trailer_type:
Si trailer_type = dry_van = “ft48” o “ft53”
Si trailer_type = flatbed = “legal” o “step_deck” o “legal_double” o “lowboy”
Si trailer_type = reefer = “fresh” o “frozen” o “controlled”
"description": "string", //No obligatorio
"door_type": "string", //No obligatorio
"e_track": boolean, //No obligatorio
"food_grade": boolean, //No obligatorio
"hazmat_class": "string", //No obligatorio
"heated": boolean, //No obligatorio
"height": numeric, //No obligatorio, si va vacío tomará el valor por defecto para la categoría del tráiler
"length": numeric, //No obligatorio, si va vacío tomará el valor por defecto para la categoría del tráiler
"lift_gates": boolean, //No obligatorio
"load_value": numeric, //No obligatorio
"note": "string", //No obligatorio
"other_requirements": "string", //No obligatorio
"pallets": integer, //No obligatorio
"panels_material": "string", //No obligatorio
"plate_trailer": boolean, //No obligatorio
"roof_type": "string", //No obligatorio
"screw_in_wood_floors": boolean, //No obligatorio
"trailer_type": "string", //Obligatorio, posibles valores "dry_van", “flatbed” o “refeer”
"tandem": boolean, //No obligatorio
"vented": boolean, //No obligatorio
"weight": numeric, //No obligatorio, si va vacío tomará el valor por defecto para la categoría del tráiler
"width": numeric //No obligatorio, si va vacío tomará el valor por defecto para la categoría del tráiler
},
"shipment_lane": {
"border_id": integer, //Obligatorio si MX-US, US-MX, CA-US o US-CA, según catálogo proporcionado por IT
"border_id_2": integer, //Obligatorio si MX-CA o CA-MX, según catálogo proporcionado por IT
"dropoff_address": "string", //No obligatorio, dirección completa en el destino
"dropoff_city": "string", //No obligatorio, ciudad en el destino
"dropoff_consignee": "string", //No obligatorio, consignee en el destino
"dropoff_country": "string", //No obligatorio, país en el destino, posibles valores: “MX” o “US” o “CA”
"dropoff_postal_code": "string", //No obligatorio, código postal en el destino
"dropoff_state": "string", //No obligatorio, estado en el destino
"dropoff_instructions": "string", //No obligatorio
"dropoff_lat": numeric, //No obligatorio, latitud en el destino
"dropoff_long": numeric, //No obligatorio, longitud en el destino
"dropoff_schedule": "string", //No obligatorio
"dropoff_time_from_naive": "string", //No obligatorio, fecha y hora de entrega en uso horario del destino (inicio de cita, debe ser mayor que la fecha de fin de cita en recolección)
"dropoff_time_to_naive": "string", //No obligatorio, fecha y hora de entrega en uso horario del destino (fin de cita, debe ser mayor o igual a inicio de cita)
"dropoff_facility_id": integer, //No obligatorio
"pickup_facility_id": integer, //No obligatorio
"pickup_address": "string", //No obligatorio, dirección completa en el origen
"pickup_city": "string", //No obligatorio, ciudad en el origen
"pickup_consignor": "string", //No obligatorio
"pickup_country": "string", //No obligatorio, país en el origen, posibles valores: “MX”o “US” o “CA”
"pickup_postal_code": "string", //No obligatorio, código postal en el origen
"pickup_state": "string", //No obligatorio, estado en el origen
"pickup_instructions": "string", //No obligatorio
"pickup_lat": numeric, //No obligatorio, latitud en el origen
"pickup_long": numeric, //No obligatorio, longitud en el origen
"pickup_schedule": "string", //No obligatorio
"pickup_time_from_naive": "string", //Obligatorio, fecha y hora de recolección en uso horario del origen (inicio de cita, debe ser mayor a la fecha actual de ejecución del proceso)
"pickup_time_to_naive": "string", //Obligatorio, fecha y hora de recolección en uso horario del origen (fin de cita, debe ser mayor o igual a inicio de cita)
},
"shipment_type": "string", //Obligatorio
"shipper_id": numeric, //No obligatorio si lo genera cuenta de cliente
"code_xml": "string",//No obligatorio, sólo para cliente amazon. Ver posibles valores
"visible_to_shipper": boolean, //No obligatorio por defecto true
"marketplace_commission": numeric //No obligatorio, tomará el valor del tanto por ciento
}
- En el caso de que sea cliente Amazon configurado propiamente en el sistema se incluye el parámetro code_xml que sólo podrá tomar los siguientes valores:
OutboundAirShuttle
TransfersEmptyBags
OutboundReturns
TransfersReturns
TransfersMissorts
WELLDEX/NAFN (TransfersReactive)
OutboundAMZLMM
OutboundExternalFulfillment
OutboundVendorFlex
OutboundAMZL
TransfersInventoryCorrection
TransfersReactive
TransfersToteInjection
Inbound/Milkrun/WePay
LTL Vendors
V Returns
Ejemplo
REQUEST
Auth: Bearer Token - eyJhbGciOiJIUzUxMiIsInR5cCI6IkpXVCJ9.eyJhdWQiOiJmcjhodWJfd2ViIiwiZXhwIjoxNzU2NDI0MzM5LCJpYXQiOjE3NDE5MDkxMzksImlzcyI6ImZyOGh1Yl93ZWIiLiOiIxOGRkNzhmNC1mMzY4LTQ3MGQtOWNhMS0xYmYyYmE0MDM0YzUiLCJuYmYiOjE3NDE5MDkxMzgsInN1YiI6IjMzNzIiLCJ0eXAiOiJhY2Nlc3MifQ.1k9IZ5s-T0OCYH2Q974st_3GRA-HlwSiKqoDOPc1-d7qYKzwImp3eTkFLoP18h4gKOV_nHVhxyRy45AHr2DDeg
POST: https://qa.fr8.app/v1/shipment
Payload del Body (JSON)
{
"after_hours_follow_up": true,
"bol_number": "789789",
"copies": 3,
"currency_code": "usd",
"expected_segments": 1,
"hot": true,
"invoicing_entity": "fr8hub_mex",
"invoicing_reference": "789789",
"max_price": 1500,
"pickup_number": "3333",
"post_to_marketplace": true,
"purchase_order_number": "44444",
"seal_number": "5555",
"shipment_details": {
"additional_equip_dry_van": true,
"additional_equip_flatbed": true,
"additional_equip_reefer": true,
"additional_equip_rabon": true,
"additional_equip_torton": true,
"air_ride": true,
"category": "ft48",
"description": "testing",
"door_type": "any",
"e_track": true,
"food_grade": true,
"hazmat_class": "true",
"heated": true,
"height": 12.50,
"length": 47.00,
"lift_gates": true,
"load_value": 100001,
"note": "NA",
"other_requirements": "NA",
"pallets": 15,
"panels_material": "metal",
"plate_trailer": true,
"roof_type": "metal",
"screw_in_wood_floors": true,
"trailer_type": "dry_van",
"tandem": true,
"vented": true,
"weight": 99.00,
"width": 16.80
},
"shipment_lane": {
"dropoff_address": "Emperador 8-4, Villa Satelite, 83200",
"dropoff_city": "hermosillo",
"dropoff_consignee": "Inc",
"dropoff_country": "MX",
"dropoff_postal_code": "",
"dropoff_lat": 29.088072368216896,
"dropoff_long": -110.98103746469556,
"dropoff_state": "sonora",
"dropoff_instructions": "Center AXL",
"dropoff_time_from_naive": "2025-03-28 01:44:00",
"dropoff_time_to_naive": "2025-03-28 01:44:00",
"pickup_facility_id": 1661,
"pickup_consignor": "Tech",
"pickup_instructions": "Distribution",
"pickup_time_from_naive": "2025-03-15 01:44:00",
"pickup_time_to_naive": "2025-03-15 07:44:00"
},
"shipment_type": "spot",
"shipper_id": 234,
"visible_to_shipper": true,
"marketplace_commission": 0
}
RESPONSE
{
"ids": [
58219,
58220,
58221
]
}Webservice shipment QA
- API: https://qa.fr8.app/v1/shipment
- Token: Se debe incluir el token obtenido en el login.
Webservice shipment PROD
- API: https://my.fr8.app/v1/shipment
- Token: Se debe incluir el token obtenido en el login.