Bienvenido a la API de RODAR. Este documento te ayudará a comprender el flujo básico para crear, administrar y monitorear viajes dentro del sistema. A continuación encontrarás el orden recomendado de uso de los principales métodos de la API.
El primer paso es obtener un token de acceso utilizando el endpoint de Autenticación.
Este token se debe incluir en el encabezado de todas las solicitudes como un Bearer
Token.
Una vez autenticado, se crea un Grupo de viajes mediante el endpoint Crear grupo de viajes. Este grupo agrupa varios viajes individuales con características comunes como origen, destino, carga y tipo de vehículo.
Puedes consultar o actualizar la información del grupo utilizando los métodos:
Una vez creado el Grupo de viajes, el sistema genera automáticamente uno o varios viajes individuales. Cada uno de estos representa un trayecto con trazabilidad y estado propio. En esta sección se describe cómo gestionar el ciclo completo de un viaje: desde su consulta hasta su cierre.
💡 Tip: Todos los endpoints de esta sección requieren incluir el
Bearer Token obtenido durante la autenticación en el encabezado de la
solicitud.
Utiliza el endpoint Obtener viaje para consultar los detalles de un viaje específico, incluyendo su estado actual, fechas, conductor, vehículo y carga.
Una vez verificado que el viaje está listo para ejecutarse, se puede iniciar el despacho mediante el endpoint Iniciar despacho. Este cambio marca el comienzo del recorrido.
Durante el recorrido, puedes actualizar el estado del viaje (por ejemplo, “En tránsito”, “Entregado” o “Completado”) mediante el endpoint Cambiar estado de viaje. Para saber qué estados son válidos, consulta la lista de Estados del viaje.
Puedes adjuntar documentos asociados al viaje (como manifiestos, remisiones o soportes de entrega) mediante el endpoint Subir documentos.
Si ocurre una incidencia durante la operación, el viaje puede:
En caso de que un viaje no deba ejecutarse o haya sido creado por error, puedes eliminarlo con el endpoint Eliminar viaje.
✅ Resumen:
1️⃣ Obtener viaje → 2️⃣ Iniciar despacho → 3️⃣ Cambiar estado →
4️⃣ Subir documentos → 5️⃣ Cancelar/Suspender si aplica → 6️⃣ Eliminar (opcional).
Con estos pasos completas el ciclo de vida de un viaje individual dentro de RODAR.
Puedes obtener la lista de estados disponibles en el sistema mediante el endpoint Listar los estados del viaje. Esto es útil para validar qué valores son válidos al cambiar el estado de un viaje.
En caso de que trabajes con grupos empresariales, puedes consultar las compañías registradas en el sistema utilizando Listar grupos de empresas especiales.
RODAR permite recibir notificaciones en tiempo real sobre los cambios de estado de los viajes o eventos relevantes a través de los Webhooks. Puedes administrarlos usando los métodos:
Te recomendamos seguir este flujo de manera ordenada para comprender cómo las entidades se relacionan entre sí y garantizar un proceso de integración exitoso.
Además, cada sección de esta documentación incluye información detallada sobre los parámetros necesarios, junto con ejemplos de uso y las posibles respuestas HTTP que podrías recibir, tanto en casos exitosos como en situaciones de error, tal como se ilustra acontinuación:
| Nombre | Descripción | Tipo de dato | Requerido |
|---|---|---|---|
| Correo electrónico del usuario registrado | string | Sí | |
| password | Contraseña asociada al usuario | string | Sí |
{
"token": "1|MTIzNDU2..."
}
{
"error": "Unauthorized"
}
Nota importante: Actualmente nos encontramos en un proceso de actualización constante tanto de métodos como de documentación. Esto con el fin de mantener el sistema sincronizado con los ambientes de prueba y producción, adaptándonos a las necesidades reales de nuestros usuarios. Te recomendamos revisar periódicamente la documentación para estar al día con los últimos cambios.
La API de RODAR utiliza tokens para autenticar y validar cada solicitud que realices. Para
ello, deberás obtener un token válido mediante el endpoint de inicio de sesión y enviarlo en el encabezado de
tus peticiones como un Bearer Token.
A continuación, encontrarás ejemplos de cómo realizar la solicitud de autenticación en diferentes lenguajes. Puedes cambiar entre las opciones curl, python y nodejs para ver el ejemplo correspondiente y copiar el código fácilmente.
curl -X POST https://api-dev.rodar.co/api/login \
-H "Content-Type: application/json" \
-d '{
"email": "usuario@ejemplo.com",
"password": "tu_contraseña"
}'
import requests
response = requests.post(
'https://api-dev.rodar.co/api/login',
json={
'email': 'usuario@ejemplo.com',
'password': 'tu_contraseña'
}
)
print(response.json())
const response = await fetch('https://api-dev.rodar.co/api/login', {
method: 'POST',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify({
email: 'usuario@ejemplo.com',
password: 'tu_contraseña'
})
});
const data = await response.json();
| Nombre | Descripción | Tipo de dato | Requerido |
|---|---|---|---|
| Correo electrónico del usuario registrado | string | Sí | |
| password | Contraseña asociada al usuario | string | Sí |
{
"token": "1|MTIzNDU2..."
}
{
"message": "Invalid credentials"
}
{
"message": "string",
"errors": {}
}
{
"success": false,
"message": "Error al autenticarse"
}
Nota importante: Asegúrate de manejar el token de forma segura, ya que es la llave para acceder a los recursos protegidos de la API. En caso de que el token expire o sea inválido, deberás realizar un nuevo inicio de sesión para obtener uno nuevo.
Recomendación: Para pruebas rápidas, utiliza nuestro ambiente de pruebas con Swagger, donde podrás autenticarte y probar los endpoints sin afectar datos reales.
URL: /api/customer/create-update. Este endpoint permite crear un nuevo cliente o actualizar uno existente a través de una solicitud POST, basándose en el NIT o NAME proporcionado.
curl -X POST https://api-dev.rodar.co/api/customer/create-update \\ -H "Authorization: Bearer" \ -H "Content-Type: application/json" \ -d '{ "name": "EMPRESA 123", "nit": "13690-1", "verificationDigit": 8 }
import requests
response = requests.post(
'https://api-dev.rodar.co/api/customer/create-update',
headers={
'Authorization': 'Bearer ',
'Content-Type': 'application/json'
},
json={
'name': 'EMPRESA 123',
'nit': '13690',
'verificationDigit': 8
}
)
print(response.json())
const response = await fetch('https://api-dev.rodar.co/api/customer/create-update', {
method: 'POST',
headers: {
'Authorization': 'Bearer ',
'Content-Type': 'application/json'
},
body: JSON.stringify({
name: 'EMPRESA 123',
nit: '13690',
verificationDigit: 8
})
});
const data = await response.json();
| Nombre | Descripción | Tipo | Requerido |
|---|---|---|---|
| name | Nombre del cliente | string | Sí |
| nit | NIT del cliente | string | Sí |
| verificationDigit | Dígito de verificación del nit | integer | No |
{
"success": true,
"message": "Cliente creado o actualizado exitosamente",
"data": [
{
"id": 1,
"name": "EMPRESA 123",
"nit": "13690",
"verification_digit": 8,
}
]
}
{
"message": "El nit es obligatorio."
}
{
"message": "Error al crear o actualizar el cliente: {error_message}"
}
URL: /api/driver/create. Este endpoint permite crear un conductor mediante una solicitud POST.
curl -X POST https://api-dev.rodar.co/api/driver/create \ -H "Authorization: Bearer" \ -H "Content-Type: application/json" \ -d '{ "document": "1234756789", "name": "Juan", "last_name": "Pérez", "phone": "3001234567", "status": true, "driver_category_id": 1, "vehicle_type_id": 2, "trailer_type_id": 3, "vehicle_plate": "ABC123" }'
import requests
response = requests.post(
'https://api-dev.rodar.co/api/driver/create',
headers={
'Authorization': 'Bearer ',
'Content-Type': 'application/json'
},
json={
'document': '1234756789',
'name': 'Juan',
'last_name': 'Pérez',
'phone': '3001234567',
'status': True,
'driver_category_id': 1,
'vehicle_type_id': 2,
'trailer_type_id': 3,
'vehicle_plate': 'ABC123'
}
)
print(response.json())
const response = await fetch('https://api-dev.rodar.co/api/driver/create', {
method: 'POST',
headers: {
'Authorization': 'Bearer ',
'Content-Type': 'application/json'
},
body: JSON.stringify(
{
document: '1234756789',
name: 'Juan',
last_name: 'Pérez',
phone: '3001234567',
status: true,
driver_category_id: 1,
vehicle_type_id: 2,
trailer_type_id: 3,
vehicle_plate: 'ABC123'
})
});
const data = await response.json();
| Nombre | Descripción | Tipo | Requerido |
|---|---|---|---|
| document | Documento del conductor | string | Sí |
| name | Nombre del conductor | string | Sí |
| last_name | Apellido del conductor | string | Sí |
| phone | Teléfono del conductor | string | Sí |
| status | Estado del conductor con la compañia | boolean | Sí |
| driver_category_id | Id de la categoría del conductor | integer | Sí |
| vehicle_type_id | Id del tipo de vehículo | integer | No |
| trailer_type_id | Id del tipo de remolque | integer | No |
| vehicle_plate | Placa del vehículo | string | No |
| Id | Name |
|---|---|
| 1 | ESPORADICO |
| 2 | FRECUENTE |
| 3 | SUPERFRECUENTE |
| 4 | PROPIO |
| 5 | AFILIADO |
{
"message": "Conductores actualizados exitosamente"
}
{
"error": "No se permiten más de 100 conductores por solicitud"
}
URL: /api/drivers/update. Este endpoint permite actualizar información de un grupo de conductores mediante una solicitud PATCH se recibe un array con hasta 100 conductores y cada posición debe contener los siguientes parámetros.
curl -X PATCH https://api-dev.rodar.co/api/driver/update \ -H "Authorization: Bearer" \ -H "Content-Type: application/json" \ -d '{ "drivers": [ { "document": "123456789", "category_id": 2, "active": false, "status": true, "name": "Juan", "last_name": "Pérez", "phone": "3001112233", "vehicle_type_id": 1, "trailer_type_id": 2, "vehicle_id": 1 } ] }'
import requests
response = requests.patch(
'https://api-dev.rodar.co/api/driver/update',
headers={
'Authorization': 'Bearer ',
'Content-Type': 'application/json'
},
json={
'drivers': [
{
'document': '123456789',
'category_id': 2,
'active': False,
'status': True,
'name': 'Juan',
'last_name': 'Pérez',
'phone': '3001112233',
'vehicle_type_id': 1,
'trailer_type_id': 2,
'vehicle_id': 1
}
]
}
)
print(response.json())
const response = await fetch('https://api-dev.rodar.co/api/driver/update', {
method: 'PATCH',
headers: {
'Authorization': 'Bearer ',
'Content-Type': 'application/json'
},
body: JSON.stringify({
drivers: [
{
document: '123456789',
category_id: 2,
active: false,
status: true,
name: 'Juan',
last_name: 'Pérez',
phone: '3001112233',
vehicle_type_id: 1,
trailer_type_id: 2,
vehicle_id: 1
}
]
})
});
const data = await response.json();
| Nombre | Descripción | Tipo | Requerido |
|---|---|---|---|
| document | Documento del conductor | string | Sí |
| category_id | Id de la categoría del conductor | integer | No |
| active | Estado del conductor en la app (por defecto false) | string | No |
| status | Estado del conductor con la compañia | boolean | No |
| name | Nombre del conductor | string | No |
| last_name | Apellido del conductor | string | No |
| phone | Teléfono del conductor | string | No |
| vehicle_type_id | Id del tipo de vehículo | integer | No |
| trailer_type_id | Id del tipo de remolque | integer | No |
| vehicle_plate | Placa del vehículo | string | No |
{
"message": "Conductores actualizados exitosamente"
}
{
"error": "No se permiten más de 100 conductores por solicitud"
}
URL: /api/drivers/restrictions. Este endpoint recibe un array de cédulas y retorna la información básica y restricciones. El método utilizado es POST.
curl -X POST https://api-dev.rodar.co/api/driver/restrictions \ -H "Authorization: Bearer" \ -H "Content-Type: application/json" \ -d '{ "documents": [ "123456789", "1234567890" ] }'
import requests
response = requests.post(
'https://api-dev.rodar.co/api/driver/restrictions',
headers={
'Authorization': 'Bearer ',
'Content-Type': 'application/json'
},
json={
'documents': [
'123456789',
'1234567890'
]
}
)
print(response.json())
const response = await fetch('https://api-dev.rodar.co/api/driver/restrictions', {
method: 'POST',
headers: {
'Authorization': 'Bearer ',
'Content-Type': 'application/json'
},
body: JSON.stringify(
{
documents: [
'123456789',
'1234567890'
]
})
});
const data = await response.json();
| Nombre | Descripción | Tipo | Requerido |
|---|---|---|---|
| documents | Array de documentos (cédulas) a consultar | array[string] | Sí |
{
"message": "Conductor encontrado",
"data": [
{
"name": "Carlos",
"last_name": "López",
"document": "123456789",
"phone": "3001234567",
"city_id": 5,
"vehicle_type_id": 2,
"trailer_type_id": 1,
"trailer_plate": "XYZ456",
"vehicle_plate": "ABC123",
"user_id": 88,
"active": true,
"email": "carlos@example.com",
"address": "Calle 123",
"company_id": 22,
"status": "activo",
"category_name": "Categoría A"
}
]
}
{
"message": "The documents field is required.",
"errors": {
"documents": [
"The documents field is required."
]
}
}
URL: /api/vehicle/create. Este endpoint permite registrar un nuevo vehículo. El método utilizado es POST.
curl -X POST https://api-dev.rodar.co/api/vehicle/create \ -H "Authorization: Bearer" \ -H "Content-Type: application/json" \ -d '{ "vehicle_plate": "ABC1123", "vehicle_type_name": "Sencillo", "trailer_plate": "R43404", "trailer_type_name": "Estacas", "owner_document": "123456789" }'
import requests
response = requests.post(
'https://api-dev.rodar.co/api/vehicle/create',
headers={
'Authorization': 'Bearer ',
'Content-Type': 'application/json'
},
json={
'vehicle_plate': 'ABC1123',
'vehicle_type_name': 'Sencillo',
'trailer_plate': 'R43404',
'trailer_type_name': 'Estacas',
'owner_document': '123456789'
}
)
print(response.json())
const response = await fetch('https://api-dev.rodar.co/api/vehicle/create', {
method: 'POST',
headers: {
'Authorization': 'Bearer ',
'Content-Type': 'application/json'
},
body: JSON.stringify({
vehicle_plate: 'ABC1123',
vehicle_type_name: 'Sencillo',
trailer_plate: 'R43404',
trailer_type_name: 'Estacas',
owner_document: '123456789'
})
});
const data = await response.json();
| Nombre | Descripción | Tipo | Requerido |
|---|---|---|---|
| vehicle_plate | Placa del vehículo | string | Sí |
| vehicle_type_name | Nombre del tipo vehículo | string | No |
| trailer_plate | Placa del remolque | string | No |
| trailer_type_name | Nombre del tipo de remolque | string | No |
| owner_document | Documento del propietario | string | No |
| Id | Name | Ministerio |
|---|---|---|
| 1 | Tractocamión | 3S3 |
| 2 | Sencillo | 2 |
| 3 | Dobletroque | 3 |
| 4 | Patineta | 2S2 |
| 5 | Poderosa | 2S3 |
| 6 | Superpoderosa | 2S3 |
| 7 | Turbo | 2 |
| 10 | Cuatro manos | 4 |
| 11 | Llanta sencilla | 2 |
| 12 | Turbo sencillo | 2 |
| 13 | Camioneta | CA |
| 14 | Volqueta | V2 |
| Id | Name |
|---|---|
| 1 | Estacas |
| 2 | Plancha |
| 3 | Furgón |
| 4 | Contenedor |
| 5 | Cisterna |
| 6 | Furgón refrigerado |
| 7 | Cama baja |
| 8 | Volco |
| 9 | Niñera |
| 10 | Botellero |
| 11 | Portacontenedor |
| 12 | Estaca-Plancha |
{
"success": true,
"message": "Vehículo creado exitosamente",
"data": {
"vehicle": {
"vehicle_plate": "ABC123",
"vehicle_type_name": "Camión",
"trailer_plate": "XYZ789",
"trailer_type_name": "Remolque cerrado",
"owner_document": "123456789"
}
}
}
{
"success": false,
"message": "El vehículo ya existe.",
"data": {
"vehicle_plate": "ABC123"
}
}
URL: /api/vehicle/update/{vehicle_plate}. Este endpoint permite actualizar un vehículo existente por su placa. El método utilizado es PATCH.
curl -X PATCH https://api-dev.rodar.co/api/vehicle/update/ABC123 \ -H "Authorization: Bearer" \ -H "Content-Type: application/json" \ -d '{ "vehicle_type_name": "Sencillo", "trailer_plate": "R43404", "trailer_type_name": "Estacas", "owner_document": 123456789 }'
import requests
response = requests.patch(
'https://api-dev.rodar.co/api/vehicle/update/ABC123',
headers={
'Authorization': 'Bearer ',
'Content-Type': 'application/json'
},
json={
'vehicle_type_name': 'Sencillo',
'trailer_plate': 'R43404',
'trailer_type_name': 'Estacas',
'owner_document': 123456789
}
)
print(response.json())
const response = await fetch('https://api-dev.rodar.co/api/vehicle/update/ABC123', {
method: 'PATCH',
headers: {
'Authorization': 'Bearer ',
'Content-Type': 'application/json'
},
body: JSON.stringify({
vehicle_type_name: 'Sencillo',
trailer_plate: 'R43404',
trailer_type_name: 'Estacas',
owner_document: 123456789
})
});
const data = await response.json();
| Nombre | Descripción | Tipo | Requerido |
|---|---|---|---|
| vehicle_plate (en URL) | Placa del vehículo que se desea actualizar | string | Sí |
| vehicle_type_name | Nombre del tipo de vehículo | string | No |
| trailer_plate | Placa del remolque | string | No |
| trailer_type_name | Tipo de remolque | string | No |
| owner_document | Documento del propietario | numeric | No |
{
"success": true,
"message": "Vehículo actualizado exitosamente",
"data": {
"vehicle_plate": "ABC123",
"vehicle_type_id": 2,
"trailer_id": 3,
"trailer_type_id": 4,
"owner_id": 5
}
}
{
"success": false,
"message": "El vehículo no existe.",
"data": {
"vehicle_plate": "NOEXISTE123"
}
}
URL: /api/vehicles/restrictions — Este endpoint permite consultar la información detallada de uno o más vehículos mediante un arreglo de placas. El método es POST.
curl -X POST https://api-dev.rodar.co/api/vehicle/restrictions \ -H "Authorization: Bearer" \ -H "Content-Type: application/json" \ -d '{ "vehicle_plates": ["ABC123", "DEF456"], }'
import requests
response = requests.post(
'https://api-dev.rodar.co/api/vehicle/restrictions',
headers={
'Authorization': 'Bearer ',
'Content-Type': 'application/json'
},
json={
'vehicle_plates': ['ABC123', 'DEF456']
}
)
print(response.json())
const response = await fetch('https://api-dev.rodar.co/api/vehicle/restrictions', {
method: 'POST',
headers: {
'Authorization': 'Bearer ',
'Content-Type': 'application/json'
},
body: JSON.stringify({
vehicle_plates: ['ABC123', 'DEF456']
})
});
const data = await response.json();
| Nombre | Descripción | Tipo | Requerido |
|---|---|---|---|
| vehicle_plates | Arreglo de placas a consultar | array de strings | Sí |
{
"success": true,
"message": "Vehículos encontrados",
"data": {
"vehicles": [
{
"vehicle_plate": "ABC123",
"vehicle_type": "Camión",
"trailer_plate": "TRX456",
"trailer_type": "Remolque",
"owner_first_name": "Carlos",
"owner_first_surname": "Pérez",
"owner_document": "11223344"
}
]
}
}
URL: /api/owner/create — Este endpoint permite crear un nuevo propietario. El método es POST.
curl -X POST https://api-dev.rodar.co/api/owner/create \ -H "Authorization: Bearer" \ -H "Content-Type: application/json" \ -d '{ "type_document": "CC", "document": "1234156789", "first_name": "John", "second_name": "Doe", "first_surname": "Doe", "second_surname": "Smith", "email": "john.doe@example.com", "phone": "123456789", "address": "123 Main St" }'
import requests
response = requests.post(
'https://api-dev.rodar.co/api/owner/create',
headers={
'Authorization': 'Bearer ',
'Content-Type': 'application/json'
},
json={
'type_document': 'CC',
'document': '1234156789',
'first_name': 'John',
'second_name': 'Doe',
'first_surname': 'Doe',
'second_surname': 'Smith',
'email': 'john.doe@example.com',
'phone': '123456789',
'address': '123 Main St'
}
)
print(response.json())
const response = await fetch('https://api-dev.rodar.co/api/owner/create', {
method: 'POST',
headers: {
'Authorization': 'Bearer ',
'Content-Type': 'application/json'
},
body: JSON.stringify({
type_document: 'CC',
document: '1234156789',
first_name: 'John',
second_name: 'Doe',
first_surname: 'Doe',
second_surname: 'Smith',
email: 'john.doe@example.com',
phone: '123456789',
address: '123 Main St'
})
});
const data = await response.json();
| Nombre | Descripción | Tipo | Requerido |
|---|---|---|---|
| type_document | Tipo de documento | string | No |
| document | Número de documento | string | Sí |
| first_name | Primer nombre | string | Sí |
| second_name | Segundo nombre | string | No |
| first_surname | Primer apellido | string | Sí |
| second_surname | Segundo apellido | string | No |
| Correo electrónico | No | ||
| phone | Teléfono | string | Sí |
| address | Dirección | string | No |
{
"message": "Propietario creado correctamente"
}
{
"message": "El propietario ya existe"
}
{
"message": {
"document": ["El campo documento es obligatorio."],
"phone": ["El campo teléfono es obligatorio."]
}
}
URL: /api/owner/update/{document} — Este endpoint permite actualizar la información de un propietario por su documento. El método es POST.
curl -X POST https://api-dev.rodar.co/api/owner/update/123456789 \ -H "Authorization: Bearer" \ -H "Content-Type: application/json" \ -d '{ "type_document": "CC", "first_name": "John", "second_name": "Doe", "first_surname": "Doe", "second_surname": "Smith", "email": "john.doe@example.com", "phone": "123456789", "address": "123 Main St" }'
import requests
response = requests.post(
'https://api-dev.rodar.co/api/owner/update/123456789',
headers={
'Authorization': 'Bearer ',
'Content-Type': 'application/json'
},
json={
'type_document': 'CC',
'first_name': 'John',
'second_name': 'Doe',
'first_surname': 'Doe',
'second_surname': 'Smith',
'email': 'john.doe@example.com',
'phone': '123456789',
'address': '123 Main St'
}
)
print(response.json())
const response = await fetch('https://api-dev.rodar.co/api/owner/update/123456789', {
method: 'POST',
headers: {
'Authorization': 'Bearer ',
'Content-Type': 'application/json'
},
body: JSON.stringify({
type_document: 'CC',
first_name: 'John',
second_name: 'Doe',
first_surname: 'Doe',
second_surname: 'Smith',
email: 'john.doe@example.com',
phone: '123456789',
address: '123 Main St'
})
});
const data = await response.json();
{document} es el número de documento del propietario a actualizar (requerido en la URL).
| Nombre | Descripción | Tipo | Requerido |
|---|---|---|---|
| type_document | Tipo de documento | string | No |
| first_name | Primer nombre | string | No |
| second_name | Segundo nombre | string | No |
| first_surname | Primer apellido | string | No |
| second_surname | Segundo apellido | string | No |
| Correo electrónico | No | ||
| phone | Teléfono | string | No |
| address | Dirección | string | No |
{
"success": true,
"message": "Propietario actualizado exitosamente",
"data": {
"id": 12,
"type_document": "CC",
"document": "123456789",
"first_name": "Laura",
"second_name": null,
"first_surname": "Gómez",
"second_surname": null,
"email": "laura@example.com",
"phone": "3001234567",
"address": "Cra 10 #20-30"
}
}
{
"message": {
"email": ["El campo correo electrónico debe ser una dirección válida."]
}
}
// o
{
"message": "Error al actualizar el propietario",
"error": "Mensaje de error interno"
}
URL: /api/owners — Este endpoint permite consultar información de propietarios mediante un arreglo de documentos. El método es POST.
curl -X POST https://api-dev.rodar.co/api/owners \ -H "Authorization: Bearer" \ -H "Content-Type: application/json" \ -d '{ "documents": ["123456789", "987654321"] }'
import requests
response = requests.post(
'https://api-dev.rodar.co/api/owners',
headers={
'Authorization': 'Bearer ',
'Content-Type': 'application/json'
},
json={
'documents': ['123456789', '987654321']
}
)
print(response.json())
const response = await fetch('https://api-dev.rodar.co/api/owners', {
method: 'POST',
headers: {
'Authorization': 'Bearer ',
'Content-Type': 'application/json'
},
body: JSON.stringify({
documents: ['123456789', '987654321']
})
});
const data = await response.json();
| Nombre | Descripción | Tipo | Requerido |
|---|---|---|---|
| documents | Arreglo de documentos de propietarios | array[string] | Sí |
[
{
"first_name": "Laura",
"first_surname": "Gómez",
"document": "123456789",
"phone": "3001234567",
"address": "Calle 123",
...
}
]
{
"message": "No se encontraron propietarios con los documentos proporcionados."
}
URL: /api/package-types — Este endpoint permite consultar todos los tipos de empaque disponibles. El método es GET.
curl -X GET https://api-dev.rodar.co/api/package-types \ -H "Authorization: Bearer <TOKEN>"
import requests
response = requests.get(
'https://api-dev.rodar.co/api/package-types',
headers={'Authorization': 'Bearer <TOKEN>'}
)
print(response.json())
const response = await fetch('https://api-dev.rodar.co/api/package-types', {
method: 'GET',
headers: {
'Authorization': 'Bearer <TOKEN>'
}
});
const data = await response.json();
console.log(data);
Este endpoint no requiere parámetros adicionales.
[
{
"id": 1,
"name": "ACERO"
},
{
"id": 2,
"name": "ALIMENTACIÓN HUMANA"
},
{
"id": 3,
"name": "ARROZ"
}
]
{
"error": "Unauthorized"
}
{
"success": false,
"message": "Error al obtener los tipos de empaque"
}
URL: /api/product-groups — Este endpoint permite consultar todos los grupos de productos. El método es GET.
curl -X GET https://api-dev.rodar.co/api/product-groups \ -H "Authorization: Bearer <TOKEN>"
import requests
response = requests.get(
'https://api-dev.rodar.co/api/product-groups',
headers={'Authorization': 'Bearer <TOKEN>'}
)
print(response.json())
const response = await fetch('https://api-dev.rodar.co/api/product-groups', {
method: 'GET',
headers: {
'Authorization': 'Bearer <TOKEN>'
}
});
const data = await response.json();
console.log(data);
Este endpoint no requiere parámetros adicionales.
[
{
"id": 1,
"name": "ACERO"
},
{
"id": 2,
"name": "ALIMENTACIÓN HUMANA"
},
{
"id": 3,
"name": "ARROZ"
},
{
"id": 4,
"name": "AZÚCAR"
}
]
{
"error": "Unauthorized"
}
{
"success": false,
"message": "Error al obtener los productos"
}
Restricción: Este servicio solo está habilitado para usuarios registrados como empresa de transporte en el sistema.
Este endpoint permite consultar la información detallada de un grupo de viajes previamente creado en el sistema. Se accede mediante una solicitud GET utilizando el ID del grupo.
URL: /api/travels/{id}
Reemplaza {id} por el identificador del grupo de viajes que deseas consultar.
curl -X GET https://api-dev.rodar.co/api/travels/123 \
-H "Authorization: Bearer YOUR_ACCESS_TOKEN"
import requests
response = requests.get(
'https://api-dev.rodar.co/api/travels/123',
headers={'Authorization': 'Bearer YOUR_ACCESS_TOKEN'}
)
print(response.json())
const response = await fetch('https://api-dev.rodar.co/api/travels/123', {
method: 'GET',
headers: {
'Authorization': 'Bearer YOUR_ACCESS_TOKEN'
}
});
const data = await response.json();
console.log(data);
Este endpoint requiere un parámetro de tipo path en la URL:
{id}: ID del grupo de viajes que deseas consultar.
Nota: Dentro del sistema, los grupos de viajes se conocen bajo el identificador travels. Este identificador será clave para relacionarlos con sus
viajes individuales o shippings.
{
"success": true,
"message": "Grupo de viajes encontrado",
"data": {
"travel_id": 208180,
"digital_count": 2,
"roadway_id": 28,
"customer": "COLANTA",
"product_group": "OTROS",
"product_specific": "CARGA GENERAL",
"shipment_weight": "5000",
"cargo_method": "CARGUE POR ORDEN DE LLEGADA",
"timeframe": "2 DíAS",
"charge_date": "2025-05-13",
"charge_hour": "12:00:00",
"discharge_date": "2025-05-02",
"discharge_hour": "16:00:00",
"freight_type": "TONELADA",
"freight": "10000",
"number_tons": "10",
"total_freight": 100000,
"status": "DISPONIBLE",
"digital_code": "DIGI-001",
"tariff_type": "TARIFA POR VIAJE",
"tariff": 20000,
"ton_per_vehicle": "50",
"assignment_type": "VIAJE CERRADO",
"scheduling_type": "PLANEADO",
"origin_charge_date": "2025-09-03",
"origin_charge_hour": "12:00:00",
"shippings": [
{
"shipping_id": 1122499,
"customer": "COLANTA",
"product_group": "OTROS",
"product_specific": "CARGA GENERAL",
"shipment_weight": "5000",
"freight": "10000",
"freight_type": "TONELADA",
"number_tons": "10",
"total_freight": 100000,
"charge_value": "50000",
"discharge_value": "30000",
"assignment_type": "VIAJE CERRADO",
"scheduling_type": "PLANEADO",
"digital_code": "DIGI-001",
"origin_charge_date": "2025-05-13",
"origin_charge_hour": "12:00:00",
"comments": "ENTREGA URGENTE",
"phone": "3001234567",
"origin": {
"location_id": 2056,
"name": "RIO NEGRO",
"point_reference": "RIO NEGRO - NO ESPECIFICADO",
"city": "RIONEGRO, SAN",
"division_code": "68615009"
},
"destination": {
"location_id": 920,
"name": "ÁBREGO",
"point_reference": "ABREGO - NO ESPECIFICADO",
"city": "ÁBREGO, NSA",
"division_code": "54003000"
},
"vehicle_type": {
"vehicle_id": 15,
"name_rodar": "TM 3S2",
"short_configuration": "3S2",
"vehicle_codes": ["54"],
"trailer_codes": ["62"]
},
"vehicle_body_type": {
"body_type_id": 14,
"name_rodar": "SIN CARROCERÍA",
"body_type_codes": ["0"]
},
"shipping_product": {
"product_id": 3301,
"type": "00",
"product_code": "000206",
"chapter": "CARNES Y DESPOJOS COMESTIBLES",
"name": "DESPOJOS COMESTIBLES DE ANIMALES DE LAS ESPECIES BOVINA; PORCINA; OVINA; CAPRI"
},
"package_type": {
"package_type_id": 4,
"name": "CAJA",
"package_code": "4G"
},
"updated_at": "2025-08-21T16:36:18.000000Z"
}
],
"updated_at": "2025-08-21T16:54:14.000000Z"
}
}
La respuesta exitosa del endpoint devuelve un resumen completo del grupo de viajes (identificado en el
sistema como travels) y una lista de los viajes
individuales asociados, bajo el arreglo shippings.
Cada objeto dentro de shippings representa un viaje individual y
contiene información detallada sobre el viaje específico, incluyendo:
division_code, que corresponde al código homologado
en el RNDC.Recomendación: Si deseas obtener información más específica o actualizada sobre un viaje individual, puedes consultarlo directamente utilizando el endpoint correspondiente en la sección de Viaje individual.
{
"message": "Unauthorized"
}
{
"success": false,
"message": "No cuenta con permisos para consumir este recurso"
}
{
"success": false,
"message": "Grupo de viajes no encontrado"
}
{
"success": false,
"message": "Error al obtener el grupo de viajes"
}
Restricción: Este servicio solo está habilitado para usuarios registrados como empresa de transporte en el sistema.
Este endpoint permite crear un nuevo grupo de viajes mediante una solicitud POST con un payload en formato JSON. Es obligatorio incluir un token de autenticación en los encabezados de la solicitud.
URL: /api/travel/create
Si se envían los siguientes parámetros:
originCodelocationOrigindestinationCodeslocationDestinationscustomerNitvehicleCodesbodyTypeCodestrailerCodeschargeDate
Y ya existe un grupo de viajes con estas mismas características, no se creará un nuevo
grupo. En su lugar, solo se actualizará el valor de
digital_count,
la cantidad de viajes digitales en el grupo existente.
curl -X POST https://api-dev.rodar.co/api/travel/create \
-H "Content-Type: application/json" \
-H "Authorization: Bearer YOUR_ACCESS_TOKEN" \
-d '{
"customerNit": "123",
"digitalCode": "DIGI-001",
"automaticRenewal": 1,
"originCodeType": "DANE",
"originCode": "08001",
"locationOrigin": "Aceros Turia Amagá",
"destinationCodeType": "DANE",
"destinationCodes": ["08001"],
"locationDestinations": ["Alimentos Doria Mosquera"],
"vehicleCodes": ["54"],
"bodyTypeCodes": ["301"],
"trailerCodes": ["64", ""],
"digitalCount": 1,
"chargeDate": "2025-05-12",
"chargeHour": "12:00",
"dischargeDate": "2025-05-02",
"dischargeHour": "16:00",
"productCode": "008546",
"productSpecific": "Malta",
"shipmentWeight": 5000,
"cargoMethod": "Cargue por orden de llegada",
"timeframe": "2 días",
"packageTypeCode": "4G",
"freightTypeId": 1,
"freight": 10000,
"numberTons": 10,
"costs": "Paga cargue y descargue",
"chargeValue": 50000,
"dischargeValue": 30000,
"phone": "3001234567",
"comments": "Entrega urgente",
"tariffType": "No tariff",
"tariff": 5000,
"tonPerVehicle": 5000,
"prioritySpecialGroupId": 2,
"exclusiveGroupIds": [12],
"travelAvailability": "Trip confirmed as available"
}'
import requests
url = "https://api-dev.rodar.co/api/travel/create"
headers = {
"Content-Type": "application/json",
"Authorization": "Bearer YOUR_ACCESS_TOKEN"
}
payload = {
"customerNit": "123",
"digitalCode": "DIGI-001",
"automaticRenewal": 1,
"originCodeType": "DANE",
"originCode": "08001",
"locationOrigin": "Aceros Turia Amagá",
"destinationCodeType": "DANE",
"destinationCodes": ["08001"],
"locationDestinations": ["Alimentos Doria Mosquera"],
"vehicleCodes": ["54"],
"bodyTypeCodes": ["301"],
"trailerCodes": ["64", ""],
"digitalCount": 1,
"chargeDate": "2025-05-12",
"chargeHour": "12:00",
"dischargeDate": "2025-05-02",
"dischargeHour": "16:00",
"productCode": "008546",
"productSpecific": "Malta",
"shipmentWeight": 5000,
"cargoMethod": "Cargue por orden de llegada",
"timeframe": "2 días",
"packageTypeCode": "4G",
"freightTypeId": 1,
"freight": 10000,
"numberTons": 10,
"costs": "Paga cargue y descargue",
"chargeValue": 50000,
"dischargeValue": 30000,
"phone": "3001234567",
"comments": "Entrega urgente",
"tariffType": "No tariff",
"tariff": 5000,
"tonPerVehicle": 5000,
"prioritySpecialGroupId": 2,
"exclusiveGroupIds": [12],
"travelAvailability": "Trip confirmed as available"
}
response = requests.post(url, headers=headers, json=payload)
print("Status code:", response.status_code)
print("Response JSON:", response.json())
const fetch = require('node-fetch'); // omitir si estás en Node 18+
const url = 'https://api-dev.rodar.co/api/travel/create';
const headers = {
'Content-Type': 'application/json',
'Authorization': 'Bearer YOUR_ACCESS_TOKEN'
};
const payload = {
customerNit: "123",
digitalCode: "DIGI-001",
automaticRenewal: 1,
originCodeType: "DANE",
originCode: "08001",
locationOrigin: "Aceros Turia Amagá",
destinationCodeType: "DANE",
destinationCodes: ["08001"],
locationDestinations: ["Alimentos Doria Mosquera"],
vehicleCodes: ["54"],
bodyTypeCodes: ["301"],
trailerCodes: ["64", ""],
digitalCount: 1,
chargeDate: "2025-05-12",
chargeHour: "12:00",
dischargeDate: "2025-05-02",
dischargeHour: "16:00",
productCode: "008546",
productSpecific: "Malta",
shipmentWeight: 5000,
cargoMethod: "Cargue por orden de llegada",
timeframe: "2 días",
packageTypeCode: "4G",
freightTypeId: 1,
freight: 10000,
numberTons: 10,
costs: "Paga cargue y descargue",
chargeValue: 50000,
dischargeValue: 30000,
phone: "3001234567",
comments: "Entrega urgente",
tariffType: "No tariff",
tariff: 5000,
tonPerVehicle: 5000,
prioritySpecialGroupId: 2,
exclusiveGroupIds: [12],
travelAvailability: "Trip confirmed as available"
};
async function createTravel() {
try {
const response = await fetch(url, {
method: 'POST',
headers: headers,
body: JSON.stringify(payload)
});
const data = await response.json();
if (!response.ok) {
console.error('❌ Error:', data);
return;
}
console.log('✅ Respuesta:', data);
} catch (error) {
console.error('❌ Error en la solicitud:', error);
}
}
createTravel();
A continuación se describen los parámetros que pueden ser usados en las peticiones a la API. Los campos marcados como requeridos deben ser incluidos obligatoriamente.
| Nombre | Descripción | Tipo de dato | Requerido |
|---|---|---|---|
| customerNit | Número de Identificación Tributaria (NIT) del cliente o generador de carga. | string | No |
| digitalCode | Código de identificación digital o número de oferta que se utiliza como identificación interna por parte de cada usuario. | string | No |
| automaticRenewal | Indica si la renovación es automática. | boolean | No |
| originCodeType |
Tipo de código de origen. Opciones:
|
string | Sí |
| originCode | Código específico de origen según el tipo (RNDC o DANE). | string | Sí |
| locationOrigin | Nombre del lugar de origen. | string | No |
| destinationCodeType |
Tipo de código de destino. Opciones:
|
string | Sí |
| destinationCodes | Lista de códigos de destino (RNDC o DANE). | array of string | Sí |
| locationDestinations | Lista de nombres de lugares de destino. | array of string | No |
| vehicleCodes | Lista de códigos de tipo de vehículos (RNDC). | array of string | Sí |
| bodyTypeCodes | Lista de códigos de tipo de carrocerías (RNDC). | array of string | Sí |
| trailerCodes | Lista de códigos de tipo de remolques o trailer (RNDC). | array of string | Sí |
| digitalCount | Cantidad de viajes que hacen parte del grupo de viajes | integer | Sí |
| chargeDate | Fecha de carga (ejemplo: "2025-05-02") | date | Sí |
| chargeHour | Hora de carga (ejemplo: "16:00") | string | No |
| dischargeDate | Fecha de descarga (ejemplo: "2025-05-02") | date | No |
| dischargeHour | Hora de descarga (ejemplo: "16:00") | string | No |
| productCode | Código del producto que se va a transportar (RNDC). | string | No |
| productSpecific | Nombre o producto específico | string | No |
| shipmentWeight | Peso de la mercancía | integer | No |
| cargoMethod |
Método de carga:
|
string | No |
| timeframe | Ventana horaria | string | No |
| packageTypeCode | El código del tipo de paquete (RNDC). | string | No |
| freightTypeId |
Tipo de flete:
|
integer | No |
| freight | Flete | integer | No es requerido si es un viaje Sin Flete |
| numberTons | Número de toneladas | integer | Es requerido si es un viaje por Tonelada |
| costs |
Tipo de costo:
|
string | No |
| chargeValue | Valor del cargue | integer | Es requerido si el costo está asociado con cargue |
| dischargeValue | Valor del descargue | integer | Es requerido si el costo está asociado con descargue |
| phone | Número de contacto | string | No |
| comments | Comentarios | string | No |
| tariffType |
Tipo de tarifa:
|
string | No |
| tariff | Tarifa | integer | No es requerido si el viaje en Sin tarifa |
| tonPerVehicle | Toneladas por vehículo | integer | Requerido si el viaje es Tarifa por tonelada |
| prioritySpecialGroupId | Grupos especiales con prioridad (consultar en la API - Grupos de empresa especiales) | integer | No |
| exclusiveGroupIds | Grupos exclusivos (consultar en la API - Grupos de empresa especiales) | array of integer | No |
| travelAvailability |
Disponibilidad de los viajes:
|
string | No |
Nota: Algunos parámetros tienen condiciones especiales sobre su obligatoriedad. Por
ejemplo, el parámetrofreight no es requerido si el tipo de flete es
0 (Sin flete).
{
"success": true,
"message": "Grupo de viajes creado exitosamente",
"data": {
"travel_id": 208180,
"digital_count": 2,
"roadway_id": 28,
"customer": "COLANTA",
"product_group": "OTROS",
"product_specific": "CARGA GENERAL",
"shipment_weight": "5000",
"cargo_method": "CARGUE POR ORDEN DE LLEGADA",
"timeframe": "2 DíAS",
"charge_date": "2025-05-13",
"charge_hour": "12:00:00",
"discharge_date": "2025-05-02",
"discharge_hour": "16:00:00",
"freight_type": "TONELADA",
"freight": "10000",
"number_tons": "10",
"total_freight": 100000,
"status": "DISPONIBLE",
"digital_code": "DIGI-001",
"tariff_type": "TARIFA POR VIAJE",
"tariff": 20000,
"ton_per_vehicle": "50",
"assignment_type": "VIAJE CERRADO",
"scheduling_type": "PLANEADO",
"origin_charge_date": "2025-09-03",
"origin_charge_hour": "12:00:00",
"shippings": [
{
"shipping_id": 1122499,
"customer": "COLANTA",
"product_group": "OTROS",
"product_specific": "CARGA GENERAL",
"shipment_weight": "5000",
"freight": "10000",
"freight_type": "TONELADA",
"number_tons": "10",
"total_freight": 100000,
"charge_value": "50000",
"discharge_value": "30000",
"assignment_type": "VIAJE CERRADO",
"scheduling_type": "PLANEADO",
"digital_code": "DIGI-001",
"origin_charge_date": "2025-05-13",
"origin_charge_hour": "12:00:00",
"comments": "ENTREGA URGENTE",
"phone": "3001234567",
"origin": {
"location_id": 2056,
"name": "RIO NEGRO",
"point_reference": "RIO NEGRO - NO ESPECIFICADO",
"city": "RIONEGRO, SAN",
"division_code": "68615009"
},
"destination": {
"location_id": 920,
"name": "ÁBREGO",
"point_reference": "ABREGO - NO ESPECIFICADO",
"city": "ÁBREGO, NSA",
"division_code": "54003000"
},
"vehicle_type": {
"vehicle_id": 15,
"name_rodar": "TM 3S2",
"short_configuration": "3S2",
"vehicle_codes": ["54"],
"trailer_codes": ["62"]
},
"vehicle_body_type": {
"body_type_id": 14,
"name_rodar": "SIN CARROCERÍA",
"body_type_codes": ["0"]
},
"shipping_product": {
"product_id": 3301,
"type": "00",
"product_code": "000206",
"chapter": "CARNES Y DESPOJOS COMESTIBLES",
"name": "DESPOJOS COMESTIBLES DE ANIMALES DE LAS ESPECIES BOVINA; PORCINA; OVINA; CAPRI"
},
"package_type": {
"package_type_id": 4,
"name": "CAJA",
"package_code": "4G"
},
"updated_at": "2025-08-21T16:36:18.000000Z"
}
],
"updated_at": "2025-08-21T16:54:14.000000Z"
}
}
{
"success": false,
"message": "BadRequest: ...."
}
{
"message": "Unauthorized"
}
{
"success": false,
"message": "No cuenta con permisos para consumir este recurso"
}
{
"success": false,
"message": "Validation errors",
"errors": {}
}
{
"success": false,
"message": "Error al crear grupo de viajes"
}
Restricción: Este servicio solo está habilitado para usuarios registrados como empresa de transporte en el sistema.
Este endpoint permite actualizar un grupo de viajes existente mediante una solicitud PATCH. Debes incluir un token de autenticación en los encabezados de la solicitud.
URL: /api/travel/{id}
Donde {id} corresponde al identificador del grupo de viajes que se desea
actualizar.
Al enviar el parámetro digitalCount en el cuerpo de la solicitud,
se actualizará la cantidad total de viajes del grupo. Si el valor es menor al actual, se eliminarán
los viajes individuales sobrantes; si es mayor, se crearán los viajes faltantes para alcanzar la
cantidad especificada. No se eliminarán viajes que ya hayan iniciado despacho.
curl -X PATCH https://api-dev.rodar.co/api/travel/123456789 \
-H "Content-Type: application/json" \
-H "Authorization: Bearer YOUR_ACCESS_TOKEN" \
-d '{
"customerNit": "123456789",
"digitalCode": "DIGI-001",
"chargeDate": "2025-05-12",
"chargeHour": "12:00",
"dischargeDate": "2025-05-02",
"dischargeHour": "16:00"
}'
import requests
url = "https://api-dev.rodar.co/api/travel/123456789"
headers = {
"Content-Type": "application/json",
"Authorization": "Bearer YOUR_ACCESS_TOKEN"
}
payload = {
"customerNit": "123456789",
"digitalCode": "DIGI-001",
"chargeDate": "2025-05-12",
"chargeHour": "12:00",
"dischargeDate": "2025-05-02",
"dischargeHour": "16:00"
}
response = requests.patch(url, headers=headers, json=payload)
print(response.json())
const fetch = require('node-fetch');
const url = "https://api-dev.rodar.co/api/travel/123456789";
const payload = {
customerNit: "123456789",
digitalCode: "DIGI-001",
chargeDate: "2025-05-12",
chargeHour: "12:00",
dischargeDate: "2025-05-02",
dischargeHour: "16:00"
};
fetch(url, {
method: 'PATCH',
headers: {
'Content-Type': 'application/json',
'Authorization': 'Bearer YOUR_ACCESS_TOKEN'
},
body: JSON.stringify(payload)
})
.then(res => res.json())
.then(data => console.log(data))
.catch(err => console.error(err));
Este endpoint requiere un parámetro de tipo path en la URL:
{id}: ID del grupo de viajes que deseas actualizar.| Nombre | Descripción | Tipo de dato | Requerido |
|---|---|---|---|
| customerNit | Número de Identificación Tributaria (NIT) del cliente o generador de carga. | string | No |
| digitalCode | Código de identificación digital o número de oferta que se utiliza como identificación interna por parte de cada usuario. | string | No |
| automaticRenewal | Indica si la renovación es automática. | boolean | No |
| originCodeType |
Tipo de código de origen. Opciones:
|
string | Es requerido si se desea actualizar el originCode |
| originCode | Código específico de origen según el tipo (RNDC o DANE). | string | No |
| locationOrigin | Nombre del lugar de origen. | string | No |
| destinationCodeType |
Tipo de código de destino. Opciones:
|
string | Es requerido si se desea actualizar el destinationCodes |
| destinationCodes | Lista de códigos de destino (RNDC o DANE). | array of string | No |
| locationDestinations | Lista de nombres de lugares de destino. | array of string | No |
| vehicleCodes | Lista de códigos de tipo de vehículos (RNDC). | array of string | No |
| bodyTypeCodes | Lista de códigos de tipo de carrocerías (RNDC). | array of string | No |
| trailerCodes | Lista de códigos de tipo de remolques o trailer (RNDC). | array of string | No |
| digitalCount | Cantidad de viajes que hacen parte del grupo de viajes | integer | No |
| chargeDate | Fecha de carga (ejemplo: "2025-05-02") | date | No |
| chargeHour | Hora de carga (ejemplo: "16:00") | string | No |
| dischargeDate | Fecha de descarga (ejemplo: "2025-05-02") | date | No |
| dischargeHour | Hora de descarga (ejemplo: "16:00") | string | No |
| productCode | Código del producto que se va a transportar (RNDC). | string | No |
| productSpecific | Nombre o producto específico | string | No |
| shipmentWeight | Peso de la mercancía | integer | No |
| cargoMethod |
Método de carga:
|
string | No |
| timeframe | Ventana horaria | string | No |
| packageTypeCode | El código del tipo de paquete (RNDC). | string | No |
| freightTypeId |
Tipo de flete:
|
integer | No |
| freight | Flete | integer | No es requerido si es un viaje Sin Flete |
| numberTons | Número de toneladas | integer | Es requerido si es un viaje por Tonelada |
| costs |
Tipo de costo:
|
string | No |
| chargeValue | Valor del cargue | integer | Es requerido si el costo está asociado con cargue |
| dischargeValue | Valor del descargue | integer | Es requerido si el costo está asociado con descargue |
| phone | Número de contacto | string | No |
| comments | Comentarios | string | No |
| tariffType |
Tipo de tarifa:
|
string | No |
| tariff | Tarifa | integer | No es requerido si el viaje en Sin tarifa |
| tonPerVehicle | Toneladas por vehículo | integer | Requerido si el viaje es Tarifa por tonelada |
| prioritySpecialGroupId | Grupos especiales con prioridad (consultar en la API - Grupos de empresa especiales) | integer | No |
| exclusiveGroupIds | Grupos exclusivos (consultar en la API - Grupos de empresa especiales) | array of integer | No |
| travelAvailability |
Disponibilidad de los viajes:
|
string | No |
Nota: Algunos parámetros tienen condiciones especiales sobre su obligatoriedad. Por
ejemplo, el parámetrofreight no es requerido si el tipo de flete es
0 (Sin flete).
{
"success": true,
"message": "Grupo de viajes actualizado correctamente",
"data": {
"travel_id": 208181,
"digital_count": 1,
"roadway_id": 27,
"customer": "COLANTA",
"product_group": "OTROS",
"product_specific": "MALTA",
"shipment_weight": "5000",
"cargo_method": "CARGUE POR ORDEN DE LLEGADA",
"timeframe": "2 DíAS",
"charge_date": "2025-05-12",
"charge_hour": "12:00:00",
"discharge_date": "2025-05-02",
"discharge_hour": "16:00:00",
"freight_type": "TONELADA",
"freight": "10000",
"number_tons": "10",
"total_freight": 100000,
"status": "DISPONIBLE",
"digital_code": "DIGI-001",
"tariff_type": "SIN TARIFA",
"tariff": null,
"ton_per_vehicle": null,
"assignment_type": "VIAJE CERRADO",
"scheduling_type": "PLANEADO",
"origin_charge_date": "2025-10-12",
"origin_charge_hour": "12:00:00",
"shippings": [
{
"shipping_id": 1122501,
"customer": "COLANTA",
"product_group": "OTROS",
"product_specific": "MALTA",
"shipment_weight": "5000",
"cargo_method": "CARGUE POR ORDEN DE LLEGADA",
"timeframe": "2 DíAS",
"charge_date": "2025-05-12",
"charge_hour": "12:00:00",
"discharge_date": "2025-05-02",
"discharge_hour": "16:00:00",
"freight_type": "TONELADA",
"freight": "10000",
"number_tons": "10",
"total_freight": 100000,
"charge_value": "50000",
"discharge_value": "30000",
"comments": "ENTREGA URGENTE",
"phone": "3001234567",
"assignment_type": "VIAJE CERRADO",
"scheduling_type": "PLANEADO",
"tariff_type": "SIN TARIFA",
"tariff": "",
"ton_per_vehicle": "",
"digital_code": "DIGI-001",
"visibility_CV": "all",
"travel_id": 208181,
"origin_charge_date": "2025-05-12",
"origin_charge_hour": "12:00:00",
"origin": {
"location_id": 568,
"name": "ACEROS TURIA AMAGA",
"point_reference": "ACEROS TURIA AMAGá",
"city": "AMAGá, ANT",
"division_code": ""
},
"destination": {
"location_id": 125,
"name": "ALIMENTOS DORIA",
"point_reference": "ALIMENTOS DORIA MOSQUERA",
"city": "MOSQUERA, CUN",
"division_code": ""
},
"vehicle_type": {
"vehicle_id": 15,
"name_rodar": "TM 3S2",
"short_configuration": "3S2",
"vehicle_codes": [
"54"
],
"trailer_codes": [
"62"
]
},
"vehicle_body_type": {
"body_type_id": 13,
"name_rodar": "OTROS",
"body_type_codes": [
"301"
]
},
"shipping_product": {
"product_id": 2213,
"type": "00",
"product_code": "008546",
"chapter": "MÁQUINA; APARATOS Y MATERIAL ELÉCTRICO Y SUS PARTES; APARATOS DE",
"name": "AISLADORES ELECTRICOS DE CUALQUIER MATERIA"
},
"package_type": {
"package_type_id": 4,
"name": "CAJA",
"package_code": "4G"
},
"updated_at": "2025-08-22T19:17:27.000000Z"
}
],
"updated_at": "2025-08-22T19:17:27.000000Z"
}
}
{
"success": false,
"message": "BadRequest: ...."
}
{
"message": "Unauthorized"
}
{
"success": false,
"message": "No cuenta con permisos para consumir este recurso"
}
{
"success": false,
"message": "Grupo de viajes no encontrado"
}
{
"success": false,
"message": "Validation errors",
"errors": {}
}
{
"success": false,
"message": "Error al actualizar grupo de viajes"
}
Este endpoint permite consultar todos los grupos de empresas especiales disponibles. Se accede mediante una solicitud GET.
URL: /api/special-groups
curl -X GET https://api-dev.rodar.co/api/special-groups \ -H "Authorization: Bearer <TOKEN>"
import requests
response = requests.get(
'https://api-dev.rodar.co/api/special-groups',
headers={'Authorization': 'Bearer <TOKEN>'}
)
print(response.json())
const response = await fetch('https://api-dev.rodar.co/api/special-groups', {
method: 'GET',
headers: {
'Authorization': 'Bearer <TOKEN>'
}
});
const data = await response.json();
console.log(data);
Este endpoint no requiere parámetros adicionales.
[
{
"id": 4,
"name": "GRUPO BIOS"
},
{
"id": 8,
"name": "CAFE"
},
{
"id": 10,
"name": "DIACO"
},
{
"id": 11,
"name": "DHL"
}
]
{
"message": "Unauthorized"
}
{
"success": false,
"message": "Error al obtener los grupos de empresas especiales"
}
URL: /api/trailer-types — Este endpoint permite consultar todos los tipos de trailer disponibles. El método es GET.
curl -X GET https://api-dev.rodar.co/api/trailer-types \ -H "Authorization: Bearer <TOKEN>"
import requests
response = requests.get(
'https://api-dev.rodar.co/api/trailer-types',
headers={'Authorization': 'Bearer <TOKEN>'}
)
print(response.json())
const response = await fetch('https://api-dev.rodar.co/api/trailer-types', {
method: 'GET',
headers: {
'Authorization': 'Bearer <TOKEN>'
}
});
const data = await response.json();
console.log(data);
Este endpoint no requiere parámetros adicionales.
[
{
"id": 1,
"name": "Estacas"
},
{
"id": 2,
"name": "Plancha"
},
{
"id": 3,
"name": "Furgón"
},
{
"id": 4,
"name": "Contenedor"
},
{
"id": 5,
"name": "Cisterna"
}
]
{
"error": "Unauthorized"
}
{
"success": false,
"message": "Error al obtener los tipos de trailer"
}
Restricción: Este servicio solo está habilitado para usuarios registrados como empresa de transporte en el sistema.
Este endpoint permite consultar la información detallada de un viaje previamente creado en el sistema. Se accede mediante una solicitud GET utilizando el ID del viaje.
URL: /api/shippings/{id}
Reemplaza {id} por el identificador del viaje que deseas consultar.
curl -X GET https://api-dev.rodar.co/api/shippings/123 \ -H "Authorization: Bearer YOUR_ACCESS_TOKEN"
import requests
response = requests.get(
'https://api-dev.rodar.co/api/shippings/123',
headers={'Authorization': 'Bearer YOUR_ACCESS_TOKEN'}
)
print(response.json())
const response = await fetch('https://api-dev.rodar.co/api/shippings/123', {
method: 'GET',
headers: {
'Authorization': 'Bearer YOUR_ACCESS_TOKEN'
}
});
const data = await response.json();
console.log(data);
Este endpoint requiere un parámetro de tipo path en la URL:
{id}: ID del viaje que deseas consultar.
Nota: Dentro del sistema, los viajes se identifican mediante el campo shippings.
Importante: Las relaciones como owner, vehicle, driver, entre otras, solo
estarán presentes si el viaje correspondiente contiene dicha información asociada.
{
"success": true,
"message": "Viaje encontrado",
"data": {
"shipping_id": 1122425,
"customer": "EXPEDITOR",
"product_group": "OTROS",
"product_specific": "",
"shipment_weight": "",
"cargo_method": "CARGUE CON CITA PREVIA",
"timeframe": "DE 6 A 12",
"charge_date": "2025-08-19",
"charge_hour": "",
"discharge_date": "2025-08-15",
"discharge_hour": "",
"freight_type": "SIN FLETE",
"freight": "",
"number_tons": "",
"total_freight": "",
"charge_value": "",
"discharge_value": "",
"comments": "",
"phone": "3107569516",
"assignment_type": "VIAJE CERRADO",
"scheduling_type": "PLANEADO",
"tariff_type": "SIN TARIFA",
"tariff": "",
"ton_per_vehicle": "",
"digital_code": "",
"visibility_CV": "all",
"travel_id": 208003,
"origin_charge_date": "2025-08-19",
"origin_charge_hour": "",
"origin": {
"location_id": 718,
"name": "CELTA TRADE PARK",
"point_reference": "CELTA TRADE PARK FUNZA",
"city": "FUNZA, CUN",
"division_code": ""
},
"destination": {
"location_id": 313,
"name": "BUENAVENTURA",
"point_reference": "BUENAVENTURA - NO ESPECIFICADO",
"city": "BUENAVENTURA, VAL",
"division_code": "76109000"
},
"vehicle_type": {
"vehicle_id": 1,
"name_rodar": "TM 3S3",
"short_configuration": "3S3",
"vehicle_codes": [],
"trailer_codes": []
},
"vehicle_body_type": {
"body_type_id": 4,
"name_rodar": "CONTENEDOR",
"body_type_codes": []
},
"shipping_product": {
"product_id": 3435,
"type": "00",
"product_code": "009980",
"chapter": "VARIOS",
"name": "PRODUCTOS VARIOS"
},
"package_type": null,
"shipping_status": {
"shipping_status_id": 23,
"order": 0,
"name": "CONTACTO"
},
"driver": {
"type_identification": "",
"identification": "80825275",
"name": "OSCAR ",
"last_name": "HERNANDEZ ",
"code_city": "11001000",
"address": "",
"email": "",
"cell_phone_number": "300-502-3593",
"plan": "SIMPLIFICADO",
"gender": "",
"license_number": "",
"license_category": "",
"license_validity": "",
"company": "",
"company_phone": "",
"bank": "",
"account_number": "",
"type_account": "",
"reference_name": " ",
"reference_relationship": "",
"reference_code_city": ""
},
"vehicle": {
"vehicle_plate": "SPC126",
"trailer_plate": "S70343",
"headstock_line_code": "",
"headstock_brand_code": "",
"model": "",
"color": "",
"employment_type": "",
"body_type_code": "",
"fuel_type": "",
"engine_type": "",
"engine_number": "",
"chassis_number": "",
"vehicle_type_code": "3S3",
"load_capacity_kg": "",
"empty_weight_tn": "",
"vehicle_rating": "",
"mechanical_inspection_certificate": "",
"gas_emission_expiry_date": "",
"soat_number": "",
"soat_company": "",
"soat_validity": "",
"owner": {
"type_identification": "",
"identification": "1073523068",
"type": "",
"name": "BRAYAN FELIPE",
"last_name": "VANEGAS CUESTA",
"code_city": "",
"address": "VANEGASB874@GMAIL.COM",
"cell_phone_number": "323-396-6827",
"plan": "SIMPLIFICADO",
"gender": "",
"economic_activity_ciiu": "",
"commercial_registration_number": "",
"bank": "",
"account_number": "",
"type_account": ""
}
},
"updated_at": "2025-08-18T21:14:27.000000Z"
}
}
{
"message": "Unauthorized"
}
{
"success": false,
"message": "No cuenta con permisos para consumir este recurso"
}
{
"success": false,
"message": "Viaje no encontrado"
}
{
"success": false,
"message": "Error al obtener el viaje"
}
Restricción: Este servicio solo está habilitado para usuarios registrados como empresa de transporte en el sistema.
Este endpoint permite eliminar un viaje previamente creado en el sistema. Se accede mediante una solicitud DELETE utilizando el ID del viaje.
URL: /api/shippings/{id}
Reemplaza {id} por el identificador del viaje que deseas eliminar.
curl -X DELETE https://api-dev.rodar.co/api/shippings/123 \ -H "Authorization: Bearer YOUR_ACCESS_TOKEN"
import requests
response = requests.delete(
'https://api-dev.rodar.co/api/shippings/123',
headers={'Authorization': 'Bearer YOUR_ACCESS_TOKEN'}
)
print(response.json())
const response = await fetch('https://api-dev.rodar.co/api/shippings/123', {
method: 'DELETE',
headers: {
'Authorization': 'Bearer YOUR_ACCESS_TOKEN'
}
});
const data = await response.json();
console.log(data);
Este endpoint requiere un parámetro de tipo path en la URL:
{id}: ID del viaje que deseas eliminar.
{
"message": "Unauthorized"
}
{
"success": false,
"message": "No cuenta con permisos para consumir este recurso"
}
{
"success": false,
"message": "Viaje no encontrado"
}
{
"success": false,
"message": "Error al eliminar el viaje"
}
Restricción: Este servicio solo está habilitado para usuarios registrados como empresa de transporte en el sistema.
Este endpoint permite consultar cambiar el estado de un viaje previamente creado en el sistema. Se accede mediante una solicitud PATCH utilizando el ID del viaje.
URL: /api/shippings/{id}/status
Reemplaza {id} por el identificador del viaje que deseas actualizar.
curl -X PATCH https://api-dev.rodar.co/api/shippings/123/status \
-H "Authorization: Bearer YOUR_ACCESS_TOKEN"\
-H "Content-Type: application/json" \
-d '{"shippingStatusId": 3}'
import requests
url = 'https://api-dev.rodar.co/api/shippings/123/status'
headers = {
'Authorization': 'Bearer YOUR_ACCESS_TOKEN',
'Content-Type': 'application/json'
}
data = {
'shippingStatusId': 3
}
response = requests.patch(url, headers=headers, json=data)
print(response.status_code)
print(response.json())
const response = await fetch('https://api-dev.rodar.co/api/shippings/123/status', {
method: 'PATCH',
headers: {
'Authorization': 'Bearer YOUR_ACCESS_TOKEN'',
'Content-Type': 'application/json'
},
body: JSON.stringify({
shippingStatusId: 3
})
});
const data = await response.json();
console.log(data);
Este endpoint requiere un parámetro de tipo path en la URL:
{id}: ID del viaje que deseas actualizar.| Nombre | Descripción | Tipo de dato | Requerido |
|---|---|---|---|
| shippingStatusId | ID del shipping status al que desea cambiar el viaje individual (Consultar en la API - Estados del viaje) | integer | Sí |
{
"success": true,
"message": "Estado actualizado"
}
{
"error": "Unauthorized"
}
{
"success": false,
"message": "No cuenta con permisos para consumir este recurso"
}
{
"success": false,
"message": "Viaje no encontrado"
}
{
"success": false,
"message": "Error de validación",
"errors": {}
}
{
"success": false,
"message": "Error al actualizar el estado"
}
Restricción: Este servicio solo está habilitado para usuarios registrados como empresa de transporte en el sistema.
Este endpoint permite cancelar un viaje previamente creado en el sistema. Se accede mediante una solicitud POST utilizando el ID del viaje.
URL: /api/shippings/{id}/cancel
Reemplaza {id} por el identificador del viaje que deseas cancelar.
curl -X POST https://api-dev.rodar.co/api/shippings/123/cancel \ -H "Authorization: Bearer YOUR_ACCESS_TOKEN"
import requests
url = 'https://api-dev.rodar.co/api/shippings/123/cancel'
headers = {
'Authorization': 'Bearer YOUR_ACCESS_TOKEN',
}
response = requests.post(url, headers=headers)
print(response.status_code)
print(response.json())
const response = await fetch('https://api-dev.rodar.co/api/shippings/123/cancel', {
method: 'POST',
headers: {
'Authorization': 'Bearer YOUR_ACCESS_TOKEN'
}
});
const data = await response.json();
console.log(data);
Este endpoint requiere un parámetro de tipo path en la URL:
{id}: ID del viaje que deseas cancelar.
{
"success": true,
"message": "Viaje cancelado exitosamente"
}
{
"message": "Unauthorized"
}
{
"success": false,
"message": "No cuenta con permisos para consumir este recurso"
}
{
"success": false,
"message": "Viaje no encontrado"
}
{
"success": false,
"message": "Error al cancelar el viaje"
}
Restricción: Este servicio solo está habilitado para usuarios registrados como empresa de transporte en el sistema.
Este endpoint permite suspender un viaje previamente creado en el sistema. Se accede mediante una solicitud POST utilizando el ID del viaje.
URL: /api/shippings/{id}/suspend
Reemplaza {id} por el identificador del viaje que deseas consultar.
curl -X POST https://api-dev.rodar.co/api/shippings/123/suspend \ -H "Authorization: Bearer YOUR_ACCESS_TOKEN"
import requests
url = 'https://api-dev.rodar.co/api/shippings/123/suspend'
headers = {
'Authorization': 'Bearer YOUR_ACCESS_TOKEN',
}
response = requests.post(url, headers=headers)
print(response.status_code)
print(response.json())
const response = await fetch('https://api-dev.rodar.co/api/shippings/123/suspend', {
method: 'POST',
headers: {
'Authorization': 'Bearer YOUR_ACCESS_TOKEN'
}
});
const data = await response.json();
console.log(data);
Este endpoint requiere un parámetro de tipo path en la URL:
{id}: ID del viaje que deseas suspender.
{
"success": true,
"message": "Viaje suspendido exitosamente"
}
{
"message": "Unauthorized"
}
{
"success": false,
"message": "No cuenta con permisos para consumir este recurso"
}
{
"success": false,
"message": "Viaje no encontrado"
}
{
"success": false,
"message": "Error al suspender el viaje"
}
Restricción: Este servicio solo está habilitado para usuarios registrados como empresa de transporte en el sistema.
URL: /api/shippings/{id}/start — Este endpoint permite inicializar el despacho de un viaje individual. El método es POST.
curl -X POST https://api-dev.rodar.co/api/shippings/123/start \
-H "Authorization: Bearer <TOKEN>" \
-H "Content-Type: application/json" \
-d '{
"driver": {
"typeIdentification": "CC",
"identification": "123456789",
"firstName": "Juan",
"secondName": "Carlos",
"firstLastName": "Pérez",
"secondLastName": "Gómez",
"codeTypeCity": "DANE",
"codeCity": "11001",
"address": "Calle 123 #45-67",
"cellPhoneNumber": "3101234567",
"email": "juan.perez@example.com",
"gender": "hombre",
"licenseNumber": "ABC123456",
"licenseCategory": "C2",
"licenseValidity": "2026-05-01",
"bankId": 1,
"accountNumber": "1234567890",
"typeAccount": "ahorros",
"referenceName": "María Gómez",
"referencePhone": "3109876543"
},
"vehicle": {
"vehiclePlate": "ABC123",
"headstockBrandCode": "216",
"headstockLineCode": "91",
"model": "2023",
"color": "Blanco",
"fuelType": "Gasolina",
"vehicleCode": "54",
"trailerCode": "63",
"loadCapacityKg": 5000,
"soatNumber": "SOAT123456",
"soatCompanyId": 2,
"soatValidity": "2026-01-01"
},
"bodyType": {
"trailerPlate": "XYZ456",
"bodyTypeCode": "1"
},
"owner": {
"typeIdentification": "CC",
"identification": "900123456",
"firstName": "Carlos",
"secondName": "Andrés",
"firstLastName": "Ramírez",
"secondLastName": "Gómez",
"address": "Cra 45 #10-50",
"cellPhoneNumber": "3106549870",
"email": "carlos.ramirez@example.com",
"gender": "hombre",
"bankId": 3,
"accountNumber": "6543210987",
"typeAccount": "corriente"
},
"holder": {
"typeIdentification": "CC",
"identification": "1012345678",
"firstName": "Laura",
"secondName": "Marcela",
"firstLastName": "Gómez",
"secondLastName": "López",
"address": "Calle 45 #22-80",
"cellPhoneNumber": "3009876543",
"email": "laura.gomez@example.com",
"gender": "mujer",
"bankId": 5,
"accountNumber": "1122334455",
"typeAccount": "ahorros"
},
"chargeDate": "2025-08-07",
"chargeHour": "10:30",
"dischargeDate": "2025-08-08",
"dischargeHour": "10:30"
}'
import requests url = "https://api-dev.rodar.co/api/shippings/123/start" token = "" headers = { "Authorization": f"Bearer {token}", "Content-Type": "application/json" } payload = { "driver": { "typeIdentification": "CC", "identification": "123456789", "firstName": "Juan", "secondName": "Carlos", "firstLastName": "Pérez", "secondLastName": "Gómez", "codeTypeCity": "DANE", "codeCity": "11001", "address": "Calle 123 #45-67", "cellPhoneNumber": "3101234567", "email": "juan.perez@example.com", "gender": "hombre", "licenseNumber": "ABC123456", "licenseCategory": "C2", "licenseValidity": "2026-05-01", "bankId": 1, "accountNumber": "1234567890", "typeAccount": "ahorros", "referenceName": "María Gómez", "referencePhone": "3109876543" }, "vehicle": { "vehiclePlate": "ABC123", "headstockBrandCode": "216", "headstockLineCode": "91", "model": "2023", "color": "Blanco", "fuelType": "Gasolina", "vehicleCode": "54", "trailerCode": "63", "loadCapacityKg": 5000, "soatNumber": "SOAT123456", "soatCompanyId": 2, "soatValidity": "2026-01-01" }, "bodyType": { "trailerPlate": "XYZ456", "bodyTypeCode": "1" }, "owner": { "typeIdentification": "CC", "identification": "900123456", "firstName": "Carlos", "secondName": "Andrés", "firstLastName": "Ramírez", "secondLastName": "Gómez", "address": "Cra 45 #10-50", "cellPhoneNumber": "3106549870", "email": "carlos.ramirez@example.com", "gender": "hombre", "bankId": 3, "accountNumber": "6543210987", "typeAccount": "corriente" }, "holder": { "typeIdentification": "CC", "identification": "1012345678", "firstName": "Laura", "secondName": "Marcela", "firstLastName": "Gómez", "secondLastName": "López", "address": "Calle 45 #22-80", "cellPhoneNumber": "3009876543", "email": "laura.gomez@example.com", "gender": "mujer", "bankId": 5, "accountNumber": "1122334455", "typeAccount": "ahorros" }, "chargeDate": "2025-08-07", "chargeHour": "10:30", "dischargeDate": "2025-08-08", "dischargeHour": "10:30" } response = requests.post(url, json=payload, headers=headers) print(response.status_code) print(response.json())
import fetch from 'node-fetch'; const url = 'https://api-dev.rodar.co/api/shippings/123/start'; const token = ''; const data = { driver: { typeIdentification: "CC", identification: "123456789", firstName: "Juan", secondName: "Carlos", firstLastName: "Pérez", secondLastName: "Gómez", codeTypeCity: "DANE", codeCity: "11001", address: "Calle 123 #45-67", cellPhoneNumber: "3101234567", email: "juan.perez@example.com", gender: "hombre", licenseNumber: "ABC123456", licenseCategory: "C2", licenseValidity: "2026-05-01", bankId: 1, accountNumber: "1234567890", typeAccount: "ahorros", referenceName: "María Gómez", referencePhone: "3109876543" }, vehicle: { vehiclePlate: "ABC123", headstockBrandCode: "216", headstockLineCode: "91", model: "2023", color: "Blanco", fuelType: "Gasolina", vehicleCode: "54", trailerCode: "63", loadCapacityKg: 5000, soatNumber: "SOAT123456", soatCompanyId: 2, soatValidity: "2026-01-01" }, bodyType: { trailerPlate: "XYZ456", bodyTypeCode: "1" }, owner: { typeIdentification: "CC", identification: "900123456", firstName: "Carlos", secondName: "Andrés", firstLastName: "Ramírez", secondLastName: "Gómez", address: "Cra 45 #10-50", cellPhoneNumber: "3106549870", email: "carlos.ramirez@example.com", gender: "hombre", bankId: 3, accountNumber: "6543210987", typeAccount: "corriente" }, holder: { typeIdentification: "CC", identification: "1012345678", firstName: "Laura", secondName: "Marcela", firstLastName: "Gómez", secondLastName: "López", address: "Calle 45 #22-80", cellPhoneNumber: "3009876543", email: "laura.gomez@example.com", gender: "mujer", bankId: 5, accountNumber: "1122334455", typeAccount: "ahorros" }, chargeDate: "2025-08-07", chargeHour: "10:30", dischargeDate: "2025-08-08", dischargeHour: "10:30" }; fetch(url, { method: 'POST', headers: { 'Authorization': `Bearer ${token}`, 'Content-Type': 'application/json' }, body: JSON.stringify(data) }) .then(res => res.json()) .then(json => console.log(json)) .catch(err => console.error('Error:', err));
Este endpoint requiere un parámetro en la URL: {id} , correspondiente al viaje individual al que se desea iniciar el
despacho.
| Nombre | Descripción | Tipo | Requerido |
|---|---|---|---|
| Datos del conductor (Campo requerido) | |||
| driver.typeIdentification | Tipo documento. Enum con opciones indicadas:
|
string | Sí |
| driver.identification | Número de documento | string | Sí |
| driver.firstName | Primer nombre del conductor | string | Sí |
| driver.secondName | Segundo nombre del conductor | string | No |
| driver.firstLastName | Primer apellido del conductor | string | Sí |
| driver.secondLastName | Segundo apellido del conductor | string | No |
| driver.codeTypeCity | Tipo de código de ciudad. Enum con opciones indicadas:
|
string | No |
| driver.codeCity | Código de ciudad de residencia | string | No |
| driver.address | Dirección de residencia del conductor | string | No |
| driver.cellPhoneNumber | Teléfono celular del conductor | string | No |
| driver.email | Correo electrónico del conductor | string | No |
| driver.gender | Género. Enum con opciones indicadas:
|
string | No |
| driver.licenseNumber | Número de licencia de conducción | string | No |
| driver.licenseCategory | Categoría de licencia. Enum con opciones indicadas:
|
string | No |
| driver.licenseValidity | Fecha vencimiento (YYYY-MM-DD) | string | No |
| driver.bankId | ID del banco de la cuenta bancaria (Consultar en la API - Bancos) | integer | No |
| driver.accountNumber | Número de cuenta bancaria del conductor | string | No |
| driver.typeAccount | Tipo de cuenta bancaria del conductor. Enum con
opciones indicadas:
|
string | No |
| driver.referenceName | Nombre referencia del conductor | string | No |
| driver.referencePhone | Celular referencia del conductor | string | No |
| Datos del vehículo (Campo requerido) | |||
| vehicle.vehiclePlate | Placa del vehículo (AAA000) | string | Sí |
| vehicle.vehicleCode | Código RNDC del vehículo | string | Sí |
| vehicle.headstockBrandCode | Código RNDC de marca | string | No |
| vehicle.headstockLineCode | Código RNDC de la línea | string | No |
| vehicle.model | Modelo del vehículo | string | No |
| vehicle.color | Color del vehículo | string | No |
| vehicle.fuelType | Tipo combustible. Enum con opciones indicadas:
|
string | No |
| vehicle.trailerCode | Código RNDC del trailer | string | No |
| vehicle.loadCapacityKg | Capacidad en kilogramos | integer | No |
| vehicle.soatNumber | SOAT número | string | No |
| vehicle.soatCompanyId | ID de empresa aseguradora SOAT (Consultar en la API - SoatComapanies) | integer | No |
| vehicle.soatValidity | Vencimiento SOAT. Ejemplo: 2026-01-01. | string | No |
| vehicle.soatValidity | Vencimiento SOAT. Ejemplo: 2026-01-01. | string | No |
| Datos del propietario del vehículo | |||
| owner.typeIdentification | Tipo documento. Enum con opciones indicadas:
|
string | Sí |
| owner.identification | Número de documento del propietario | string | Sí |
| owner.firstName | Primer nombre del propietario | string | Sí |
| owner.secondName | Segundo nombre del propietario | string | No |
| owner.firstLastName | Primer apellido del propietario | string | Sí |
| owner.secondLastName | Segundo apellido del propietario | string | No |
| owner.address | Dirección de residencia del propietario | string | No |
| owner.cellPhoneNumber | Teléfono celular del propietario | string | No |
| owner.email | Correo electrónico del propietario | string | No |
| owner.gender | Género. Enum con opciones indicadas:
|
string | No |
| owner.bankId | ID del banco de la cuenta bancaria (Consultar en la API - Bancos) | integer | No |
| owner.accountNumber | Número de cuenta bancaria del propietario | string | No |
| owner.typeAccount | Tipo de cuenta bancaria del propietario. Enum con
opciones indicadas:
|
string | No |
| Datos del tenedor o titular del vehículo | |||
| holder.typeIdentification | Tipo documento. Enum con opciones indicadas:
|
string | Sí |
| holder.identification | Número de documento del tenedor o titular | string | Sí |
| holder.firstName | Primer nombre del tenedor o titular | string | Sí |
| holder.secondName | Segundo nombre del tenedor o titular | string | No |
| holder.firstLastName | Primer apellido del tenedor o titular | string | Sí |
| holder.secondLastName | Segundo apellido del tenedor o titular | string | No |
| holder.address | Dirección de residencia del tenedor o titular | string | No |
| holder.cellPhoneNumber | Teléfono celular del tenedor o titular | string | No |
| holder.email | Correo electrónico del tenedor o titular | string | No |
| holder.gender | Género. Enum con opciones indicadas:
|
string | No |
| holder.bankId | ID del banco de la cuenta bancaria (Consultar en la API - Bancos) | integer | No |
| holder.accountNumber | Número de cuenta bancaria del tenedor o titular | string | No |
| holder.typeAccount | Tipo de cuenta bancaria del tenedor o titular. Enum con
opciones indicadas:
|
string | No |
| Datos de la carrocería y Trailer | |||
| bodyType.trailerPlate | Placa del trailer o remolque | string | No |
| bodyType.bodyTypeCode | Código RND del tipo carrocería | string | No |
| Datos del cargue | |||
| chargeDate | Fecha estimada de cargue (YYYY-MM-DD) | date | Sí |
| chargeHour | Hora estimada de cargue (HH:MM) | string | No |
| dischargeDate | Fecha estimada de descargue (YYYY-MM-DD) | date | No |
| dischargeHour | Hora estimada de descargue (HH:MM) | string | No |
{
"success": true,
"message": "Se inicia despacho"
}
{
"error": "Unauthorized"
}
{
"success": false,
"message": "No cuenta con permisos para consumir este recurso"
}
{
"success": false,
"message": "Viaje no encontrado"
}
{
"success": false,
"message": "Validation errors",
"errors": {}
}
{
"success": false,
"message": "Error al inicializar el viaje"
}
Restricción: Este servicio solo está habilitado para usuarios registrados como empresa de transporte en el sistema.
URL: /api/shippings/{id}/documents — Este endpoint permite cargar o subir documentos referentes a un viaje individual. El método es POST.
curl -X POST "https://api-dev.rodar.co/api/shippings/123/documents" \ -H "Authorization: Bearer <TOKEN>" \ -F "documents[]=@/ruta/al/archivo1.pdf" \ -F "documents[]=@/ruta/al/archivo2.jpg"
import requests
url = "https://api-dev.rodar.co/api/shippings/123/documents"
token = "TOKEN"
files = [
('documents[]', open('/ruta/al/archivo1.pdf', 'rb')),
('documents[]', open('/ruta/al/archivo2.jpg', 'rb'))
]
headers = {
"Authorization": f"Bearer {token}"
}
response = requests.post(url, headers=headers, files=files)
print("Status:", response.status_code)
print("Response:", response.json())
const fetch = require('node-fetch');
const FormData = require('form-data');
const fs = require('fs');
const form = new FormData();
form.append('documents[]', fs.createReadStream('/ruta/al/archivo1.pdf'));
form.append('documents[]', fs.createReadStream('/ruta/al/archivo2.jpg'));
fetch('https://api-dev.rodar.co/api/shippings/123/documents', {
method: 'POST',
headers: {
'Authorization': 'Bearer TU_TOKEN_AQUI',
...form.getHeaders()
},
body: form
})
.then(async (res) => {
const data = await res.json();
console.log("Status:", res.status);
console.log("Response:", data);
})
.catch(err => {
console.error("Error:", err.message);
});
Este endpoint requiere un parámetro en la URL: {id}
del viaje individual
al que desea adjuntar documentos.
{
"success": true,
"message": "Documentos subidos correctamente",
"files": [
{
"original_name": "archivo1.pdf",
"stored_path": "shippings/123/documents/archivo1.pdf"
},
{
"original_name": "imagen.jpg",
"stored_path": "shippings/123/documents/imagen.jpg"
}
]
}
{
"error": "Unauthorized"
}
{
"success": false,
"message": "No cuenta con permisos para consumir este recurso"
}
{
"success": false,
"message": "Viaje no encontrado"
}
{
"success": false,
"message": "El archivo enviado excede el tamaño máximo permitido por el servidor."
}
{
"success": false,
"message": "El campo documents es obligatorio.",
"errors": {
"documents.0": [
"El archivo debe ser un archivo válido."
]
}
}
{
"success": false,
"message": "Error al subir documentos"
}
Este endpoint permite consultar todos los estados del viaje. Se accede mediante una solicitud GET.
URL: /api/shipping-statuses
Cada estado contiene un campo order que representa la secuencia lógica del
flujo del viaje. Este
valor debe usarse para validar transiciones válidas entre estados.
Consideraciones importantes:
order sea
mayor al
estado actual.
order
menor al actual).curl -X GET https://api-dev.rodar.co/api/shipping-statuses \ -H "Authorization: Bearer YOUR_ACCESS_TOKEN"
import requests
response = requests.get(
'https://api-dev.rodar.co/api/shipping-statuses',
headers={'Authorization': 'Bearer YOUR_ACCESS_TOKEN'}
)
print(response.json())
const response = await fetch('https://api-dev.rodar.co/api/shipping-statuses', {
method: 'GET',
headers: {
'Authorization': 'Bearer YOUR_ACCESS_TOKEN'
}
});
const data = await response.json();
console.log(data);
Este endpoint no requiere parámetros adicionales.
{
"success": true,
"message": "Estados del viaje",
"data": [
{
"id": 1,
"name": "Confirmar viaje como disponible",
"order": 1
}
]
}
{
"message": "Unauthorized"
}
{
"success": false,
"message": "Error al obtener los estados del viaje"
}
A continuación se muestra el listado actual de estados del viaje en el orden en que ocurren dentro del flujo
operativo.
Este orden corresponde al valor del campo order devuelto por el endpoint no al id.
🔸 Este listado puede variar según futuras actualizaciones del sistema. Se recomienda consultar este endpoint directamente en los ambientes de prueba o producción para obtener los valores más recientes.
URL: /api/vehicle-types — Este endpoint permite consultar todos los tipos de vehículo disponibles. El método es GET.
curl -X GET https://api-dev.rodar.co/api/vehicle-types \ -H "Authorization: Bearer <TOKEN>"
import requests
response = requests.get(
'https://api-dev.rodar.co/api/vehicle-types',
headers={'Authorization': 'Bearer <TOKEN>'}
)
print(response.json())
const response = await fetch('https://api-dev.rodar.co/api/vehicle-types', {
method: 'GET',
headers: {
'Authorization': 'Bearer <TOKEN>'
}
});
const data = await response.json();
console.log(data);
Este endpoint no requiere parámetros adicionales.
[
{
"id": 1,
"name": "TM 3S3",
"configuration": "3S3"
},
{
"id": 2,
"name": "Sencillo",
"configuration": "2"
},
{
"id": 3,
"name": "Dobletroque",
"configuration": "3"
},
{
"id": 4,
"name": "Patineta 2S2",
"configuration": "2S2"
},
{
"id": 5,
"name": "Poderosa 2S3",
"configuration": "2S3"
}
]
{
"error": "Unauthorized"
}
{
"success": false,
"message": "Error al obtener los tipos de vehículo"
}
Restricción: Este servicio solo está habilitado para usuarios registrados como empresa de transporte en el sistema.
Los webhooks permiten a las empresas recibir notificaciones automáticas cada vez que ocurren ciertos eventos
dentro de la plataforma.
Estas notificaciones se envían a una URL previamente registrada, utilizando solicitudes HTTP
POST con datos en formato JSON.
Para recibir notificaciones correctamente:
POST con Content-Type: application/json.
200 OK para confirmar la recepción del evento.Métodos disponibles:
GET /api/webhooks — Obtener la configuración actual del
webhook.
POST /api/webhooks/create — Crear un nuevo webhook.
DELETE /api/webhooks/{id} — Eliminar un webhook registrado.
PATCH /api/webhooks/{id} — Actualizar un webhook existente.
Los siguientes eventos están disponibles para suscripción. Puedes seleccionar uno o varios al registrar tu webhook.
trip.started
Se activa cuando se inicia despacho de un viaje.
trip.status
Se emite cuando el viaje cambia de estado.
trip.canceled
Se emite cuando el viaje ha sido cancelado.
trip.suspended
Se emite cuando el viaje ha sido suspendido.
trip.deleted
Se emite cuando el viaje ha sido eliminado.
trip.renew
Se emite cuando el viaje se renueva automáticamente.
A continuación se describe el contenido específico del campo data para cada uno de los eventos
disponibles.
trip.started
Este evento se emite cuando el viaje inicia oficialmente.
{
"event": "trip.started",
"timestamp": "2025-08-08T11:00:00Z",
"data": {
"id": 1116592,
"shipping_status": {
"id": 1,
"name": "Disponibilidad"
},
"origin": {
"id": 568,
"point_reference": "Aceros Turia Amagá"
},
"destination": {
"id": 125,
"point_reference": "Alimentos Doria Mosquera"
},
"vehicle": {
"vehicle_plate": "ABC123",
"trailer_plate": "XYZ456",
"headstock_code": "F1000",
"headstock_brand_code": "FORD",
"model": "2023",
"color": "Blanco",
"trailer_type_code": "TIPO1",
"fuel_type": "Gasolina",
"vehicle_type_code": "CAMION",
"load_capacity_kg": 5000,
"soat_number": "SOAT123456",
"soat_company_id": 2,
"soat_validity": "2026-01-01"
},
"driver": {
"type_identification": "CC",
"identification": "123456789",
"name": "Juan",
"last_name": "Montoya",
"gender": "hombre",
"email": "juan.perez@example.com",
"cell_phone_number": "3101234567",
"address": "Calle 123 #45-67",
"code_dane_city": "11001",
"plan": "Simplificado",
"license_number": "ABC123456",
"license_category": "C2",
"license_validity": "2026-05-01",
"company": "2026-05-01",
"bank_id": 1,
"account_number": "1234567890",
"type_account": "ahorros",
"reference_name": "María Gómez",
"reference_relationship": "Hermana",
"reference_code_dane_city": "11001",
"reference_phone": "3109876543"
},
"weight_units" =>'10ks',
"discharge_date"=> '2025-08-07',
"discharge_hour"=> '10:30',
"charge_date": "2025-08-07",
"charge_hour": "10:30",
"travel_id": 1112,
"updated_at" : "2025-08-08T14:59:00Z";
}
}
trip.status
Este evento se emite cuando el viaje cambia de estado.
{
"event": "trip.status",
"timestamp": "2025-08-08T15:00:00Z",
"data": {
"id": 1116592,
"shipping_status": {
"id": 1,
"name": "Disponibilidad"
},
"origin": {
"id": 568,
"point_reference": "Aceros Turia Amagá"
},
"destination": {
"id": 125,
"point_reference": "Alimentos Doria Mosquera"
},
"vehicle": {
"vehicle_plate": "ABC123",
"trailer_plate": "XYZ456",
"trailer_type_code": "TIPO1",
"vehicle_type_code": "CAMION"
},
"driver": {
"type_identification": "CC",
"identification": "123456789",
"name": "Juan",
"last_name": "Montoya",
"cell_phone_number": "3101234567",
},
"charge_date": "2025-08-07",
"charge_hour": "10:30",
"travel_id": 1112,
"updated_at" : "2025-08-08T14:59:00Z";
}
}
trip.canceled
Este evento se emite cuando un viaje ha sido cancelado. Puede incluir uno o dos objetos, dependiendo del estado del viaje al momento de su cancelación.
Escenario 1: El viaje es cancelado sin haber sido tomado por un conductor. El payload enviado es:
{
"event":"trip.canceled",
"timestamp":"2025-08-28T11:42:28-05:00",
"data":{
"canceled_shipping":{
"shipping_id":1125114,
"shipping_status":{
"shipping_status_id":7,
"order":0,
"name":"CANCELADO"
}
},
"origin":{
"location_id":1324,
"name":"FAJOBE SERVICIOS DE ACERO - SEDE CALI CARRERA 15",
"point_reference":"PLANTA FAJOBE CALOTO",
"city":"CALOTO, CAU",
"division_code":""
},
"destination":{
"location_id":681,
"name":"GARZON HUILA",
"point_reference":"GARZóN - NO ESPECIFICADO",
"city":"GARZóN, HUI",
"division_code":"41298000"
},
"travel_id":210827,
"updated_at":"2025-08-28 11:42:26"
}
}
En este caso, el objeto canceled_shipping representa el viaje
cancelado.
Escenario 2: El viaje es cancelado después de haber sido asignado a un conductor. El payload incluirá también información del viaje descartado:
{
"event":"trip.canceled",
"timestamp":"2025-08-28T11:35:57-05:00",
"data":{
"canceled_shipping":{
"shipping_id":1125378,
"shipping_status":{
"shipping_status_id":7,
"order":0,
"name":"CANCELADO"
}
},
"discarded_shipping":{
"shipping_id":1125304,
"shipping_status":{
"shipping_status_id":5,
"order":16,
"name":"DESCARTADO"
}
},
"vehicle":{
"vehicle_plate":"SYU836",
"trailer_plate":"",
"headstock_line_code":"",
"headstock_brand_code":"",
"model":"",
"color":"",
"employment_type":"",
"body_type_code":"",
"fuel_type":"",
"engine_type":"",
"engine_number":"",
"chassis_number":"",
"vehicle_type_code":"3S3",
"load_capacity_kg":"",
"empty_weight_tn":"",
"vehicle_rating":"",
"mechanical_inspection_certificate":"",
"gas_emission_expiry_date":"",
"soat_number":"",
"soat_company":"",
"owner":{
"type_identification":"",
"identification":"80245531",
"type":"",
"name":"NéSTOR ADRIáN",
"last_name":"FORERO ESPINOSA",
"code_city":"",
"address":"MANZANA 1 CASA 22 JARDíN SANTANDER",
"cell_phone_number":"322-846-0618",
"plan":"SIMPLIFICADO",
"gender":"",
"economic_activity_ciiu":"",
"commercial_registration_number":"",
"bank":"",
"account_number":"",
"type_account":""
}
},
"driver":{
"type_identification":"",
"identification":"1014185110",
"name":"ESTEBAN ",
"last_name":"MILLAN LOPEZ",
"code_city":"11001000",
"address":"",
"email":"",
"cell_phone_number":"320-489-5816",
"plan":"SIMPLIFICADO",
"gender":"",
"license_number":"",
"license_category":"",
"license_validity":"",
"company":"",
"company_phone":"",
"bank":"",
"account_number":"",
"type_account":"",
"reference_name":" ",
"reference_relationship":"",
"reference_code_city":""
},
"origin":{
"location_id":327,
"name":"MALTERIA TROPICAL",
"point_reference":"MALTERíA TROPICAL ",
"city":"CARTAGENA, BOL",
"division_code":""
},
"destination":{
"location_id":328,
"name":"TOCANCIPá",
"point_reference":"MALTERíA TIBITó ",
"city":"TOCANCIPá, CUN",
"division_code":""
},
"travel_id":210714,
"updated_at":"2025-08-28 11:35:55"
}
}
En este caso, el objeto discarded_shipping representa al
viaje tomado y luego descartado por el conductor, mientras que canceled_shipping representa el viaje cancelado.
trip.suspended
Este evento se emite cuando se ha suspendido un viaje.
{
"event":"trip.suspended",
"timestamp":"2025-08-28T11:11:48-05:00",
"data":{
"shipping_id":1125309,
"shipping_status":{
"shipping_status_id":8,
"order":0,
"name":"SUSPENDIDO"
},
"origin":{
"location_id":137,
"name":"CALOTO",
"point_reference":"NUEVA GENERACIóN DE BEBIDAS NGB CALOTO",
"city":"CALOTO, CAU",
"division_code":""
},
"destination":{
"location_id":119,
"name":"MALAMBO",
"point_reference":"POSTOBóN MALAMBO",
"city":"MALAMBO, ATL",
"division_code":""
},
"travel_id":210926,
"updated_at":"2025-08-28 11:11:47"
}
}
trip.deleted
Este evento se emite cuando se ha eliminado un viaje.
{
"event":"trip.deleted",
"timestamp":"2025-08-28T10:54:13-05:00",
"data":{
"shipping_id":1125363,
"origin":{
"location_id":558,
"name":"GERDAU DIACO PLANTA MUñA",
"point_reference":"GERDAU DIACO MUñA SIBATé",
"city":"SIBATé, CUN",
"division_code":""
},
"destination":{
"location_id":321,
"name":"YUMBO",
"point_reference":"YUMBO - NO ESPECIFICADO",
"city":"YUMBO, VAL",
"division_code":"76892000"
},
"travel_id":210967,
"updated_at":"2025-08-28 10:54:11"
}
}
trip.renew
Este evento se emite cuando se ha renovado un viaje.
{
"event": "trip.renew",
"timestamp": "2025-08-08T15:00:00Z",
"data": {
"id": 1116592,
"origin": {
"id": 568,
"point_reference": "Aceros Turia Amagá"
},
"destination": {
"id": 125,
"point_reference": "Alimentos Doria Mosquera"
},
"charge_date": "2025-08-07",
"charge_hour": "10:30",
"travel_id": 1112,
"updated_at" : "2025-08-08T14:59:00Z";
}
}
A continuación se muestran ejemplos de cómo recibir y procesar una notificación en distintos lenguajes:
Route::post('/webhook-handler', function (Request $request) {
$payload = $request->all();
Log::info('Webhook recibido:', $payload);
return response()->json(['received' => true]);
});
app.post('/webhook-handler', (req, res) => {
console.log('Webhook recibido:', req.body);
res.json({ received: true });
});
@app.route('/webhook-handler', methods=['POST'])
def webhook():
data = request.get_json()
print('Webhook recibido:', data)
return jsonify({'received': True})
Restricción: Este servicio solo está habilitado para usuarios registrados como empresa de transporte en el sistema.
URL: /api/webhooks — Este endpoint permite consultar la configuración actual de tu webhook, incluyendo la URL de destino, eventos configurados y estado de activación. El método es GET.
curl -X GET https://api-dev.rodar.co/api/webhooks \ -H "Authorization: Bearer <TOKEN>"
import requests
response = requests.get(
'https://api-dev.rodar.co/api/webhooks',
headers={'Authorization': 'Bearer <TOKEN>'}
)
print(response.json())
const response = await fetch('https://api-dev.rodar.co/api/webhooks', {
method: 'GET',
headers: {
'Authorization': 'Bearer <TOKEN>'
}
});
const data = await response.json();
console.log(data);
Este endpoint no requiere parámetros adicionales.
{
"success": true,
"message": "Webhook vinculado",
"data": {
"id": 1,
"url": "https://example.com/rodar/trip_status",
"events": ["trip.created", "trip.started", "trip.completed"],
"status": "active",
"last_delivery" : "2025-01-15T10:30:00Z",
"created_at" : "2025-05-02T10:41:03Z",
"updated_at" : "2025-05-02T10:41:03Z"
}
}
{
"error": "Unauthorized"
}
{
"success": false,
"message": "No cuenta con permisos para consumir este recurso"
}
{
"success": false,
"message": "Webhook no encontrado"
}
{
"success": false,
"message": "Error al obtener webhook
}
Restricción: Este servicio solo está habilitado para usuarios registrados como empresa de transporte en el sistema.
URL: /api/webhooks/create. Este endpoint permite la creación o configuración del webhook mediante una solicitud POST.
curl -X POST https://api-dev.rodar.co/api/webhooks/create \
-H "Content-Type: application/json" \
-H "Authorization: Bearer <TOKEN>" \
-d '{
"url": "https://example.com/rodar/trip_status",
"events": ["trip.created", "trip.started", "trip.completed"],
"status": 1
}'
import requests
url = "https://api-dev.rodar.co/api/webhooks/create"
headers = {
"Content-Type": "application/json",
"Authorization": "Bearer <TOKEN>"
}
payload = {
"url": "https://example.com/rodar/trip_status",
"events": ["trip.created", "trip.started", "trip.completed"],
"status": 1
}
response = requests.post(url, headers=headers, json=payload)
print("Status code:", response.status_code)
print("Response JSON:", response.json())
// Si usas Node.js < 18, primero instala node-fetch:
// npm install node-fetch
const fetch = require('node-fetch'); // Elimina esta línea si estás en Node 18+
const url = 'https://api-dev.rodar.co/api/webhooks/create';
const headers = {
'Content-Type': 'application/json',
'Authorization': 'Bearer <TOKEN>'
};
const payload = {
"url": "https://example.com/rodar/trip_status",
"events": ["trip.created", "trip.started", "trip.completed"],
"status": 1
};
async function createTravel() {
try {
const response = await fetch(url, {
method: 'POST',
headers: headers,
body: JSON.stringify(payload)
});
const data = await response.json();
if (!response.ok) {
console.error('❌ Error:', data);
return;
}
console.log('✅ Respuesta:', data);
} catch (error) {
console.error('❌ Error al hacer la solicitud:', error);
}
}
createTravel();
| Nombre | Descripción | Tipo | Requerido |
|---|---|---|---|
| url | Punto de entrada donde se recibirán los eventos del webhook | string (Punto de entrada - URL) | Sí |
| events | Listado de eventos a los que suscribirse | array of string | Sí |
| status | Estado del webhook | boolean | Sí |
{
"success": true,
"message": "Webhook creado exitosamente",
"data": {
"id": 1,
"url": "https://example.com/rodar/trip_status",
"events": ["trip.created", "trip.started", "trip.completed"],
"status": "active"
}
}
{
"success": false,
"message": "BadRequest: ...."
}
{
"error": "Unauthorized"
}
{
"success": false,
"message": "No cuenta con permisos para consumir este recurso"
}
{
"success": false,
"message": "Ya existe un webhook configurado para esta empresa."
}
{
"success": false,
"message": "Validation errors",
"errors": {}
}
{
"success": false,
"message": "Error al crear webhook"
}
Restricción: Este servicio solo está habilitado para usuarios registrados como empresa de transporte en el sistema.
URL: /api/webhooks/{id}. Este endpoint permite la actualización del webhook configurado PATCH.
curl -X PATCH https://api-dev.rodar.co/api/webhooks/123456789 \
-H "Content-Type: application/json" \
-H "Authorization: Bearer <TOKEN>" \
-d '{
"url": "https://example.com/rodar/trip_status",
"events": ["trip.created", "trip.started", "trip.completed"],
"status": "active"
}'
import requests
url = "https://api-dev.rodar.co/api/webhooks/23456789"
headers = {
"Content-Type": "application/json",
"Authorization": "Bearer <TOKEN>"
}
payload = {
"url": "https://example.com/rodar/trip_status",
"events": ["trip.created", "trip.started", "trip.completed"],
"status": "active"
}
response = requests.patch(url, headers=headers, json=payload)
print(response.json())
const fetch = require('node-fetch');
const url = "https://api-dev.rodar.co/api/webhooks/23456789";
const payload = {
"url": "https://example.com/rodar/trip_status",
"events": ["trip.created", "trip.started", "trip.completed"],
"status": "active"
};
fetch(url, {
method: 'PATCH',
headers: {
'Content-Type': 'application/json',
'Authorization': 'Bearer '
},
body: JSON.stringify(payload)
})
.then(res => res.json())
.then(data => console.log(data))
.catch(err => console.error(err));
Este endpoint requiere un parámetro en la URL: {id} del webhook que se desea actualizar.
| Nombre | Descripción | Tipo | Requerido |
|---|---|---|---|
| url | Punto de entrada donde se recibirán los eventos del webhook | string (Punto de entrada - URL) | No |
| events | Listado de eventos a los que suscribirse | array of string | No |
| status | Estado del webhook | boolean | No |
{
"success": true,
"message": "Webhook actualizado correctamente",
"data": {
"id": 1,
"url": "https://example.com/rodar/trip_status",
"events": ["trip.created", "trip.started", "trip.completed"],
"status": "active"
}
}
{
"success": false,
"message": "BadRequest: ...."
}
{
"error": "Unauthorized"
}
{
"success": false,
"message": "No cuenta con permisos para consumir este recurso"
}
{
"success": false,
"message": "Webhook no encontrado"
}
{
"success": false,
"message": "Validation errors",
"errors": {}
}
{
"success": false,
"message": "Error al actualizar el webhook"
}
Restricción: Este servicio solo está habilitado para usuarios registrados como empresa de transporte en el sistema.
URL: /api/webhooks/{id} — Este endpoint permite eliminar webhook. El método es DELETE.
curl -X DELETE https://api-dev.rodar.co/api/webhooks/123 \ -H "Authorization: Bearer <TOKEN>"
import requests
response = requests.delete(
'https://api-dev.rodar.co/api/webhooks/123',
headers={'Authorization': 'Bearer <TOKEN>'}
)
print(response.json())
const response = await fetch('https://api-dev.rodar.co/api/webhooks/123', {
method: 'DELETE',
headers: {
'Authorization': 'Bearer <TOKEN>'
}
});
const data = await response.json();
console.log(data);
Este endpoint requiere un parámetro en la URL: {id}
del webhook
que se desea eliminar.
{
"error": "Unauthorized"
}
{
"success": false,
"message": "No cuenta con permisos para consumir este recurso"
}
{
"success": false,
"message": "Webhook no encontrado"
}
{
"success": false,
"message": "Error al eliminar el webhook"
}
Este endpoint permite consultar el costo mínimo de operación según los criterios definidos por el sistema SICETAC (Sistema de Información de Costos Eficientes para el Transporte Automotor de Carga), administrado por el Ministerio de Transporte de Colombia.
URL: /api/quotes/consult
curl -X GET "https://api-dev.rodar.co/api/quotes/consult?vehicle_code=2&transport_unit=Volco&cargo_type=Granel%20S%C3%B3lido&city_code_type=DANE&origin=13001&destination=13001" \
-H "Authorization: Bearer YOUR_ACCESS_TOKEN"
import requests
url = "https://api-dev.rodar.co/api/quotes/consult"
headers = {
"Authorization": "Bearer YOUR_ACCESS_TOKEN"
}
params = {
"vehicle_code": "2",
"transport_unit": "Volco",
"cargo_type": "Granel Sólido",
"city_code_type": "DANE",
"origin": 13001,
"destination": 13001
}
response = requests.get(url, headers=headers, params=params)
print(response.json())
const fetch = require('node-fetch');
const url = 'https://api-dev.rodar.co/api/quotes/consult?vehicle_code=2&transport_unit=Volco&cargo_type=Granel%20S%C3%B3lido&city_code_type=DANE&origin=13001&destination=13001';
const options = {
method: 'GET',
headers: {
'Authorization': 'Bearer YOUR_ACCESS_TOKEN'
}
};
fetch(url, options)
.then(res => res.json())
.then(data => console.log(data))
.catch(err => console.error('Error:', err));
Este endpoint requiere los siguientes parámetros por query string:
| Nombre | Descripción | Tipo | Requerido |
|---|---|---|---|
| vehicle_code |
Código del tipo de vehículo. Enum con opciones:
|
string | Sí |
| transport_unit |
Unidad de transporte. Enum con opciones:
|
string | Sí |
| cargo_type |
Tipo de carga. Enum con opciones:
|
string | Sí |
| city_code_type |
Tipo de código para ciudades. Enum con opciones:
|
string | Sí |
| origin |
Código de la ciudad/municipio de origen (según city_code_type)
|
integer | Sí |
| destination |
Código de la ciudad/municipio de destino (según city_code_type)
|
integer | Sí |
| year | Año de la consulta. Opcional. Si no se proporciona, se consultarán todos los años disponibles. | integer | No |
| month | Mes de la consulta (1 a 12). Opcional. Si no se proporciona, se consultarán todos los meses disponibles. | integer | No |
Nota: Si no se encuentra información que coincida con los parámetros ingresados, el
sistema responderá con un success: false y un error 404
{
"success": true,
"message": "Data encontrada",
"data": [
{
"date": "2025-09-01 00:00:00",
"year": "2025",
"month": 9,
"route": null,
"name_route": "CARTAGENA BOLIVAR_BAYUNCA CARTAGENA BOLIVAR",
"origin_code": "13001000",
"destination_code": "13001004",
"configuration": "2",
"type_charge": "5",
"name_type_charge": "Granel Sólido",
"transport_unit": "4",
"name_transport_unit": "VOLCO",
"value": 63151,
"value_ton": 7016.78,
"distance": 24,
"value_hour": 0
}
]
}
{
"message": "Unauthorized"
}
{
"success": false,
"message": "Data no encontrada",
"data": []
}
{
"message": "La ciudad de origen no existe con el código 1300100 (DANE). (and 1 more error)",
"errors": {
"origin": [
"La ciudad de origen no existe con el código 1300100 (DANE)."
],
"destination": [
"La ciudad de destino no existe con el código 13001000 (DANE)."
]
}
}
{
"success": false,
"message": "Error al obtener la data"
}