Crear un vehículo
Guarda un vehículo en la flota de tu organización (también aparece en la aplicación).
Mismos campos y reglas de acceso que un vehículo de /v1/pack; se valida con los límites de tamaño y carga útil que la aplicación aplica a su tipo. Gratis: no se cobran créditos.
Autenticación
Parámetros del cuerpo
application/jsontypestringobligatorioTipo de vehículo. Solo se aceptan los tipos indicados en GET /v1/limits (allowed_vehicle_types).
trucktrailerflatbedcontainerpalletaircraftshipnamestringobligatorioNombre visible.
lengthnumber · cmobligatorioLargo interior del espacio de carga, a lo largo de x (desde la pared frontal hacia la puerta).
widthnumber · cmobligatorioAncho interior del espacio de carga, a lo largo de z.
heightnumber · cmobligatorioAlto interior del espacio de carga, a lo largo de y.
max_weightnumber · kgobligatorioCarga útil máxima.
floor_load_capacitynumber · kg/m²Capacidad de carga del suelo: 0 o más (0 = sin límite).
aux_deckbooleanEl vehículo tiene un segundo piso (doble piso).
falseaux_deck_heightnumber · cmAltura del segundo piso sobre el suelo. Obligatorio cuando aux_deck es true.
aux_deck_max_weightnumber · kgLímite de carga del segundo piso. Obligatorio cuando aux_deck es true.
blocked_areasRect[]Zonas del suelo en las que no se puede colocar nada (pasos de rueda, daños, espacio reservado). Cada una debe estar dentro del suelo del vehículo.
xnumber · cmobligatorioDistancia desde la pared frontal hasta el borde más cercano del rectángulo.
znumber · cmobligatorioDistancia desde la pared derecha (z = 0; la derecha vista desde la puerta, mirando hacia dentro) hasta el borde más cercano del rectángulo.
lengthnumber · cmobligatorioExtensión a lo largo de x.
widthnumber · cmobligatorioExtensión a lo largo de z.
axle_positionsRequiere accesonumber[] · cmPosiciones de los ejes (puntos de apoyo) medidas desde la parte delantera de la zona de carga; negativo = por delante de ella. Mismo número de elementos que axle_max_loads. Cada una entre −300 (un eje por delante de la zona de carga, p. ej., el eje delantero de un camión rígido, bajo la cabina) y el largo del vehículo.
axle_max_loadsRequiere accesonumber[] · kgCarga máxima por eje, en el orden de axle_positions. Cada valor debe ser mayor que 0 y no superar 100000.
cog_range_xRequiere accesonumber · cmDesviación permitida del centro de gravedad respecto a la mitad del largo: de 0 a length / 2.
cog_range_yRequiere accesonumber · cmDesviación permitida del centro de gravedad respecto a la mitad del ancho: de 0 a width / 2.
tractor_weightRequiere accesonumber · kgModelo de ejes de semirremolque: masa de la tractora.
empty_trailer_weightRequiere accesonumber · kgModelo de ejes de semirremolque: masa en vacío del remolque.
front_axle_to_middle_axleRequiere accesonumber · cmModelo de ejes de semirremolque: del eje delantero de la tractora al eje motriz (central).
front_axle_to_tractor_cogRequiere accesonumber · cmModelo de ejes de semirremolque: del eje delantero al centro de gravedad de la tractora.
front_axle_to_kingpinRequiere accesonumber · cmModelo de ejes de semirremolque: del eje delantero al pivote de enganche (quinta rueda).
kingpin_to_rear_axleRequiere accesonumber · cmModelo de ejes de semirremolque: del pivote de enganche al grupo de ejes traseros del remolque.
trailer_cog_to_rear_axleRequiere accesonumber · cmModelo de ejes de semirremolque: del centro de gravedad del remolque al grupo de ejes traseros.
trailer_start_to_kingpinRequiere accesonumber · cmModelo de ejes de semirremolque: de la parte delantera del remolque al pivote de enganche.
max_middle_axle_weightRequiere accesonumber · kgModelo de ejes de semirremolque: límite legal del eje motriz (central).
max_rear_axle_weightRequiere accesonumber · kgModelo de ejes de semirremolque: límite legal del grupo de ejes traseros.
Ejemplo de solicitud
curl -X POST "https://runner.cargoduo.com/v1/vehicles" \
-H "Authorization: Bearer $CARGODUO_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"name": "Mega trailer 13.6 m",
"type": "trailer",
"length": 1360,
"width": 248,
"height": 300,
"max_weight": 24000
}'const res = await fetch("https://runner.cargoduo.com/v1/vehicles", {
method: "POST",
headers: {
Authorization: `Bearer ${process.env.CARGODUO_API_KEY}`,
"Content-Type": "application/json",
},
body: JSON.stringify({
"name": "Mega trailer 13.6 m",
"type": "trailer",
"length": 1360,
"width": 248,
"height": 300,
"max_weight": 24000
}),
});
const data = await res.json();
console.log(res.status, data);import os
import requests
response = requests.post(
"https://runner.cargoduo.com/v1/vehicles",
headers={"Authorization": f"Bearer {os.environ['CARGODUO_API_KEY']}"},
json={
"name": "Mega trailer 13.6 m",
"type": "trailer",
"length": 1360,
"width": 248,
"height": 300,
"max_weight": 24000,
},
)
print(response.status_code, response.json())package main
import (
"fmt"
"io"
"net/http"
"os"
"strings"
)
func main() {
body := strings.NewReader(`{
"name": "Mega trailer 13.6 m",
"type": "trailer",
"length": 1360,
"width": 248,
"height": 300,
"max_weight": 24000
}`)
req, err := http.NewRequest("POST", "https://runner.cargoduo.com/v1/vehicles", body)
if err != nil {
panic(err)
}
req.Header.Set("Authorization", "Bearer "+os.Getenv("CARGODUO_API_KEY"))
req.Header.Set("Content-Type", "application/json")
res, err := http.DefaultClient.Do(req)
if err != nil {
panic(err)
}
defer res.Body.Close()
out, _ := io.ReadAll(res.Body)
fmt.Println(res.StatusCode, string(out))
}import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
public class Main {
public static void main(String[] args) throws Exception {
String body = """
{
"name": "Mega trailer 13.6 m",
"type": "trailer",
"length": 1360,
"width": 248,
"height": 300,
"max_weight": 24000
}
""";
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create("https://runner.cargoduo.com/v1/vehicles"))
.header("Authorization", "Bearer " + System.getenv("CARGODUO_API_KEY"))
.header("Content-Type", "application/json")
.method("POST", HttpRequest.BodyPublishers.ofString(body))
.build();
HttpResponse<String> response = HttpClient.newHttpClient()
.send(request, HttpResponse.BodyHandlers.ofString());
System.out.println(response.statusCode() + " " + response.body());
}
}using System.Net.Http.Headers;
using System.Text;
using var client = new HttpClient();
client.DefaultRequestHeaders.Authorization =
new AuthenticationHeaderValue("Bearer", Environment.GetEnvironmentVariable("CARGODUO_API_KEY"));
var json = """
{
"name": "Mega trailer 13.6 m",
"type": "trailer",
"length": 1360,
"width": 248,
"height": 300,
"max_weight": 24000
}
""";
var request = new HttpRequestMessage(HttpMethod.Post, "https://runner.cargoduo.com/v1/vehicles")
{
Content = new StringContent(json, Encoding.UTF8, "application/json"),
};
var response = await client.SendAsync(request);
Console.WriteLine($"{(int)response.StatusCode} {await response.Content.ReadAsStringAsync()}");<?php
$payload = <<<'JSON'
{
"name": "Mega trailer 13.6 m",
"type": "trailer",
"length": 1360,
"width": 248,
"height": 300,
"max_weight": 24000
}
JSON;
$ch = curl_init('https://runner.cargoduo.com/v1/vehicles');
curl_setopt_array($ch, [
CURLOPT_CUSTOMREQUEST => 'POST',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => [
'Authorization: Bearer ' . getenv('CARGODUO_API_KEY'),
'Content-Type: application/json',
],
CURLOPT_POSTFIELDS => $payload,
]);
$response = curl_exec($ch);
echo curl_getinfo($ch, CURLINFO_HTTP_CODE), ' ', $response, PHP_EOL;require "net/http"
require "uri"
uri = URI("https://runner.cargoduo.com/v1/vehicles")
request = Net::HTTP::Post.new(uri)
request["Authorization"] = "Bearer #{ENV.fetch("CARGODUO_API_KEY")}"
request["Content-Type"] = "application/json"
request.body = <<~'JSON'
{
"name": "Mega trailer 13.6 m",
"type": "trailer",
"length": 1360,
"width": 248,
"height": 300,
"max_weight": 24000
}
JSON
response = Net::HTTP.start(uri.host, uri.port, use_ssl: uri.scheme == "https") do |http|
http.request(request)
end
puts response.code, response.bodyEjemplo de respuesta
{
"id": "veh_118",
"object": "vehicle",
"kind": "custom",
"name": "Mega trailer 13.6 m",
"type": "trailer",
"length": 1360,
"width": 248,
"height": 300,
"max_weight": 24000,
"floor_load_capacity": null,
"axle_positions": [],
"axle_max_loads": [],
"cog_range_x": null,
"cog_range_y": null,
"aux_deck": false,
"aux_deck_height": null,
"aux_deck_max_weight": null,
"tractor_weight": null,
"empty_trailer_weight": null,
"front_axle_to_middle_axle": null,
"front_axle_to_tractor_cog": null,
"front_axle_to_kingpin": null,
"kingpin_to_rear_axle": null,
"trailer_cog_to_rear_axle": null,
"trailer_start_to_kingpin": null,
"max_middle_axle_weight": null,
"max_rear_axle_weight": null,
"blocked_areas": [],
"created_by": {
"id": "usr_7",
"name": "Elif Kaya"
},
"updated_by": {
"id": "usr_7",
"name": "Elif Kaya"
},
"created_at": "2026-10-02T08:41:17Z"
}Respuestas
201El vehículo nuevo.
NombreTipoObligatorioDescripciónidstringstringNoID del vehículo predefinido, o veh_… en tus propios vehículos.
objectstringstringNovehiclekindstringstringNopreset= el catálogo predefinido;custom= los de tu organización.presetcustomtypestringstringNoTipo de vehículo. Solo se aceptan los tipos indicados en GET /v1/limits (allowed_vehicle_types).
trucktrailerflatbedcontainerpalletaircraftshipnamestringstringNoNombre visible.
lengthnumber · cmnumber · cmNoLargo interior del espacio de carga, a lo largo de x (desde la pared frontal hacia la puerta).
widthnumber · cmnumber · cmNoAncho interior del espacio de carga, a lo largo de z.
heightnumber · cmnumber · cmNoAlto interior del espacio de carga, a lo largo de y.
max_weightnumber · kgnumber · kgNoCarga útil máxima.
floor_load_capacitynumber | null · kg/m²number | null · kg/m²NoCapacidad de carga del suelo: 0 o más (0 = sin límite).
axle_positionsnumber[] · cmnumber[] · cmNoPosiciones de los ejes (puntos de apoyo) medidas desde la parte delantera de la zona de carga; negativo = por delante de ella. Mismo número de elementos que axle_max_loads. Cada una entre −300 (un eje por delante de la zona de carga, p. ej., el eje delantero de un camión rígido, bajo la cabina) y el largo del vehículo.
axle_max_loadsnumber[] · kgnumber[] · kgNoCarga máxima por eje, en el orden de axle_positions. Cada valor debe ser mayor que 0 y no superar 100000.
cog_range_xnumber | null · cmnumber | null · cmNoDesviación permitida del centro de gravedad respecto a la mitad del largo: de 0 a length / 2.
cog_range_ynumber | null · cmnumber | null · cmNoDesviación permitida del centro de gravedad respecto a la mitad del ancho: de 0 a width / 2.
aux_deckbooleanbooleanNoEl vehículo tiene un segundo piso (doble piso).
aux_deck_heightnumber | null · cmnumber | null · cmNoAltura del segundo piso sobre el suelo. Obligatorio cuando
aux_deckestrue.aux_deck_max_weightnumber | null · kgnumber | null · kgNoLímite de carga del segundo piso. Obligatorio cuando
aux_deckestrue.tractor_weightnumber | null · kgnumber | null · kgNoModelo de ejes de semirremolque: masa de la tractora.
empty_trailer_weightnumber | null · kgnumber | null · kgNoModelo de ejes de semirremolque: masa en vacío del remolque.
front_axle_to_middle_axlenumber | null · cmnumber | null · cmNoModelo de ejes de semirremolque: del eje delantero de la tractora al eje motriz (central).
front_axle_to_tractor_cognumber | null · cmnumber | null · cmNoModelo de ejes de semirremolque: del eje delantero al centro de gravedad de la tractora.
front_axle_to_kingpinnumber | null · cmnumber | null · cmNoModelo de ejes de semirremolque: del eje delantero al pivote de enganche (quinta rueda).
kingpin_to_rear_axlenumber | null · cmnumber | null · cmNoModelo de ejes de semirremolque: del pivote de enganche al grupo de ejes traseros del remolque.
trailer_cog_to_rear_axlenumber | null · cmnumber | null · cmNoModelo de ejes de semirremolque: del centro de gravedad del remolque al grupo de ejes traseros.
trailer_start_to_kingpinnumber | null · cmnumber | null · cmNoModelo de ejes de semirremolque: de la parte delantera del remolque al pivote de enganche.
max_middle_axle_weightnumber | null · kgnumber | null · kgNoModelo de ejes de semirremolque: límite legal del eje motriz (central).
max_rear_axle_weightnumber | null · kgnumber | null · kgNoModelo de ejes de semirremolque: límite legal del grupo de ejes traseros.
blocked_areasRect[]Rect[]NoZonas del suelo en las que no se puede colocar nada (pasos de rueda, daños, espacio reservado). Cada una debe estar dentro del suelo del vehículo.
xnumber · cmobligatorionumber · cmSíDistancia desde la pared frontal hasta el borde más cercano del rectángulo.
znumber · cmobligatorionumber · cmSíDistancia desde la pared derecha (z = 0; la derecha vista desde la puerta, mirando hacia dentro) hasta el borde más cercano del rectángulo.
lengthnumber · cmobligatorionumber · cmSíExtensión a lo largo de x.
widthnumber · cmobligatorionumber · cmSíExtensión a lo largo de z.
created_byUserRef | nullUserRef | nullNoEl miembro que lo creó (en las llamadas a la API: el miembro que creó la clave).
nullsi se desconoce.idstringstringNoID del miembro (usr_…). Filtra las listas con ?created_by=.
namestringstringNoupdated_byUserRef | nullUserRef | nullNoEl último miembro que lo modificó.
idstringstringNoID del miembro (usr_…). Filtra las listas con ?created_by=.
namestringstringNocreated_atstring | nullstring | nullNoRFC 3339;
nullen los predefinidos.400Bad request
invalid_jsoninvalid_jsonEl cuerpo no es JSON válido o un campo tiene un tipo incorrecto.
Todos los códigos de errorNombreTipoObligatorioDescripciónerrorErrorBodyobligatorioErrorBodySícodestringobligatoriostringSíCódigo legible por máquina (snake_case). Basa tu lógica en este campo, nunca en
message.messagestringobligatoriostringSíExplicación en inglés.
request_idstringobligatoriostringSíIgual que la cabecera X-Request-Id. Indícalo al contactar con el soporte.
detailsErrorDetail[]ErrorDetail[]NoProblemas por campo (
validation_failed).pathstringstringNoRuta JSON del campo erróneo, p. ej., items[3].length.
codestringstringNorequired,invalid_value,out_of_range,duplicate_id,unknown_vehicle,unknown_template,type_not_allowed,unknown_group,does_not_fit,too_many_items,too_many_vehicles,unknown_field,invalid_json.messagestringstringNoExplicación en inglés.
401Unauthorized
unauthorizedkey_revokedkey_expiredunauthorizedClave de API ausente, mal formada o desconocida.key_revokedLa clave se ha revocado.key_expiredLa clave ha superado su fecha de caducidad.
Todos los códigos de errorNombreTipoObligatorioDescripciónerrorErrorBodyobligatorioErrorBodySícodestringobligatoriostringSíCódigo legible por máquina (snake_case). Basa tu lógica en este campo, nunca en
message.messagestringobligatoriostringSíExplicación en inglés.
request_idstringobligatoriostringSíIgual que la cabecera X-Request-Id. Indícalo al contactar con el soporte.
detailsErrorDetail[]ErrorDetail[]NoProblemas por campo (
validation_failed).pathstringstringNoRuta JSON del campo erróneo, p. ej., items[3].length.
codestringstringNorequired,invalid_value,out_of_range,duplicate_id,unknown_vehicle,unknown_template,type_not_allowed,unknown_group,does_not_fit,too_many_items,too_many_vehicles,unknown_field,invalid_json.messagestringstringNoExplicación en inglés.
403Forbidden
ip_not_allowedsubscription_inactiveaccount_inactivescope_missingip_not_allowedLa IP de origen no está en la lista de IP permitidas de la clave.subscription_inactiveLa organización no tiene ninguna suscripción activa que incluya la API.account_inactiveLa organización está suspendida o no tiene ningún propietario con la cuenta activa.scope_missingA la clave le falta un permiso que requiere este endpoint.
Todos los códigos de errorNombreTipoObligatorioDescripciónerrorErrorBodyobligatorioErrorBodySícodestringobligatoriostringSíCódigo legible por máquina (snake_case). Basa tu lógica en este campo, nunca en
message.messagestringobligatoriostringSíExplicación en inglés.
request_idstringobligatoriostringSíIgual que la cabecera X-Request-Id. Indícalo al contactar con el soporte.
detailsErrorDetail[]ErrorDetail[]NoProblemas por campo (
validation_failed).pathstringstringNoRuta JSON del campo erróneo, p. ej., items[3].length.
codestringstringNorequired,invalid_value,out_of_range,duplicate_id,unknown_vehicle,unknown_template,type_not_allowed,unknown_group,does_not_fit,too_many_items,too_many_vehicles,unknown_field,invalid_json.messagestringstringNoExplicación en inglés.
413Payload too large
payload_too_largepayload_too_largeEl cuerpo de la solicitud supera los 10 MB.
Todos los códigos de errorNombreTipoObligatorioDescripciónerrorErrorBodyobligatorioErrorBodySícodestringobligatoriostringSíCódigo legible por máquina (snake_case). Basa tu lógica en este campo, nunca en
message.messagestringobligatoriostringSíExplicación en inglés.
request_idstringobligatoriostringSíIgual que la cabecera X-Request-Id. Indícalo al contactar con el soporte.
detailsErrorDetail[]ErrorDetail[]NoProblemas por campo (
validation_failed).pathstringstringNoRuta JSON del campo erróneo, p. ej., items[3].length.
codestringstringNorequired,invalid_value,out_of_range,duplicate_id,unknown_vehicle,unknown_template,type_not_allowed,unknown_group,does_not_fit,too_many_items,too_many_vehicles,unknown_field,invalid_json.messagestringstringNoExplicación en inglés.
422Unprocessable entity
validation_failedvalidation_failedLa solicitud es JSON bien formado, pero describe un trabajo no válido. details[] enumera todos los problemas.
Todos los códigos de errorNombreTipoObligatorioDescripciónerrorErrorBodyobligatorioErrorBodySícodestringobligatoriostringSíCódigo legible por máquina (snake_case). Basa tu lógica en este campo, nunca en
message.messagestringobligatoriostringSíExplicación en inglés.
request_idstringobligatoriostringSíIgual que la cabecera X-Request-Id. Indícalo al contactar con el soporte.
detailsErrorDetail[]ErrorDetail[]NoProblemas por campo (
validation_failed).pathstringstringNoRuta JSON del campo erróneo, p. ej., items[3].length.
codestringstringNorequired,invalid_value,out_of_range,duplicate_id,unknown_vehicle,unknown_template,type_not_allowed,unknown_group,does_not_fit,too_many_items,too_many_vehicles,unknown_field,invalid_json.messagestringstringNoExplicación en inglés.
429Too many requests
rate_limitedrate_limitedDemasiadas solicitudes en el minuto, la hora o el día en curso (por clave o por organización), o más de 60 autenticaciones fallidas por minuto desde tu dirección IP.
Todos los códigos de errorNombreTipoObligatorioDescripciónerrorErrorBodyobligatorioErrorBodySícodestringobligatoriostringSíCódigo legible por máquina (snake_case). Basa tu lógica en este campo, nunca en
message.messagestringobligatoriostringSíExplicación en inglés.
request_idstringobligatoriostringSíIgual que la cabecera X-Request-Id. Indícalo al contactar con el soporte.
detailsErrorDetail[]ErrorDetail[]NoProblemas por campo (
validation_failed).pathstringstringNoRuta JSON del campo erróneo, p. ej., items[3].length.
codestringstringNorequired,invalid_value,out_of_range,duplicate_id,unknown_vehicle,unknown_template,type_not_allowed,unknown_group,does_not_fit,too_many_items,too_many_vehicles,unknown_field,invalid_json.messagestringstringNoExplicación en inglés.
500Internal server error
internal_errorinternal_errorAlgo ha fallado por nuestra parte.
Todos los códigos de errorNombreTipoObligatorioDescripciónerrorErrorBodyobligatorioErrorBodySícodestringobligatoriostringSíCódigo legible por máquina (snake_case). Basa tu lógica en este campo, nunca en
message.messagestringobligatoriostringSíExplicación en inglés.
request_idstringobligatoriostringSíIgual que la cabecera X-Request-Id. Indícalo al contactar con el soporte.
detailsErrorDetail[]ErrorDetail[]NoProblemas por campo (
validation_failed).pathstringstringNoRuta JSON del campo erróneo, p. ej., items[3].length.
codestringstringNorequired,invalid_value,out_of_range,duplicate_id,unknown_vehicle,unknown_template,type_not_allowed,unknown_group,does_not_fit,too_many_items,too_many_vehicles,unknown_field,invalid_json.messagestringstringNoExplicación en inglés.
503Service unavailable
api_disabledapi_disabledLa API está desactivada temporalmente (mantenimiento) o deshabilitada para la organización.
Todos los códigos de errorNombreTipoObligatorioDescripciónerrorErrorBodyobligatorioErrorBodySícodestringobligatoriostringSíCódigo legible por máquina (snake_case). Basa tu lógica en este campo, nunca en
message.messagestringobligatoriostringSíExplicación en inglés.
request_idstringobligatoriostringSíIgual que la cabecera X-Request-Id. Indícalo al contactar con el soporte.
detailsErrorDetail[]ErrorDetail[]NoProblemas por campo (
validation_failed).pathstringstringNoRuta JSON del campo erróneo, p. ej., items[3].length.
codestringstringNorequired,invalid_value,out_of_range,duplicate_id,unknown_vehicle,unknown_template,type_not_allowed,unknown_group,does_not_fit,too_many_items,too_many_vehicles,unknown_field,invalid_json.messagestringstringNoExplicación en inglés.