openapi: 3.1.0
info:
  title: Vehicles
  description: 'Este API es parte de **Transcend** y corresponde al módulo de gestión
    de vehículos. Proporciona operaciones CRUD completas para la flota de vehículos
    del sector logístico.


    Su principal misión es mantener un registro actualizado de todos los vehículos
    disponibles, sus características técnicas y estado operativo, permitiendo una
    gestión eficiente de la flota.

    '
  version: 1.0.0
  contact:
    email: support@cargoffer.com
  license: Private API - Access by agreement only
servers:
- url: https://api.pro.cargoffer.com
  description: Producción
components:
  securitySchemes:
    BearerAuth:
      type: http
      scheme: bearer
      bearerFormat: JWT
      description: Token JWT obtenido del servicio IAM
    ApiKeyAuth:
      type: apiKey
      in: header
      name: X-API-Key
      description: Clave API para la autenticación de servicio
  parameters:
    VehicleId:
      name: id
      in: path
      description: Identificador único del vehículo
      required: true
      schema:
        type: string
        format: uuid
      example: 5f8d0d55b54764421b7156c3
  schemas:
    Vehicle:
      type: object
      properties:
        id:
          type: string
          format: uuid
          description: Identificador único del vehículo, generado por el sistema
          example: 5f8d0d55b54764421b7156c3
          readOnly: true
        model:
          type: string
          description: Modelo comercial del vehículo (entre 2 y 50 caracteres)
          minLength: 2
          maxLength: 50
          example: Mercedes Actros 1845
        licensePlate:
          type: string
          description: Matrícula del vehículo en formato español (0000 XXX) o europeo
            (XX-000-XX)
          pattern: ^[0-9]{4}[A-Z]{3}$|^[A-Z]{2}-[0-9]{3}-[A-Z]{2}$
          example: 1234ABC
        status:
          type: string
          enum:
          - active
          - maintenance
          - out_of_service
          description: 'Estado operativo del vehículo:

            - active: En servicio y disponible para rutas

            - maintenance: En taller para reparación/revisión

            - out_of_service: Retirado de servicio temporal o definitivamente

            '
          example: active
        maxWeight:
          type: number
          format: float
          description: Peso máximo autorizado en toneladas (entre 3.5 y 44 t)
          minimum: 3.5
          maximum: 44
          example: 18.75
        dimensions:
          type: object
          description: Dimensiones del vehículo en metros
          properties:
            length:
              type: number
              minimum: 2
              maximum: 25
              description: Longitud en metros
              example: 13.6
            width:
              type: number
              minimum: 1.5
              maximum: 3
              description: Ancho en metros
              example: 2.55
            height:
              type: number
              minimum: 1.5
              maximum: 4.5
              description: Altura en metros
              example: 3.8
      required:
      - model
      - licensePlate
      - status
      - maxWeight
    VehicleType:
      type: object
      properties:
        code:
          type: string
          description: Código del tipo de vehículo
          enum:
          - r3c
          - tir
          - rt
          - r2c
          - r2d
          - van
          - frc
          - f2c
          - adr
          - ft
          - none
        min:
          type: number
          description: Valor mínimo asociado
        max:
          type: number
          description: Valor máximo asociado
        kg_min:
          type: number
          description: Peso mínimo en kg
        kg_max:
          type: number
          description: Peso máximo en kg
        config:
          type: string
          description: Configuración
        length:
          type: number
          description: Longitud
        mma:
          type: number
          description: MMA
        payload:
          type: number
          description: Carga útil
        volume:
          type: number
          description: Volumen
        image:
          type: string
          description: Imagen en Base64
tags:
- name: Health
  description: Endpoints para verificar el estado del servicio
- name: Vehicles
  description: Operaciones CRUD para la gestión de vehículos
- name: Brands
  description: Operaciones de consulta para marcas, modelos y especificaciones técnicas
paths:
  /brands:
    get:
      tags:
      - Brands
      summary: Get list of vehicle brands
      description: Recupera todas las marcas de vehículos disponibles en el sistema
      operationId: getBrands
      security:
      - BearerAuth: []
      - ApiKeyAuth: []
      responses:
        '200':
          description: Lista de marcas recuperada exitosamente
          content:
            application/json:
              schema:
                type: array
                items:
                  type: object
                  properties:
                    id:
                      type: string
                      format: uuid
                    name:
                      type: string
        '401':
          description: No autorizado - Token inválido o faltante
        '500':
          description: Error del servidor
  /brands/with-counts:
    get:
      tags:
      - Brands
      summary: Get brands with model count
      description: Recupera todas las marcas de vehículos con el conteo de los modelos
        asociados
      operationId: getBrandsWithModelCount
      security:
      - BearerAuth: []
      - ApiKeyAuth: []
      responses:
        '200':
          description: Lista de marcas con conteo de modelos recuperada exitosamente
          content:
            application/json:
              schema:
                type: array
                items:
                  type: object
                  properties:
                    id:
                      type: string
                      format: uuid
                    name:
                      type: string
                    modelCount:
                      type: integer
        '401':
          description: No autorizado - Token inválido o faltante
        '500':
          description: Error del servidor
  /brands/{brandId}:
    get:
      tags:
      - Brands
      summary: Get brand by ID
      description: Recupera los detalles de una marca específica por su ID
      operationId: getBrandById
      security:
      - BearerAuth: []
      - ApiKeyAuth: []
      parameters:
      - name: brandId
        in: path
        description: ID de la marca
        required: true
        schema:
          type: string
          format: uuid
      responses:
        '200':
          description: Marca recuperada exitosamente
          content:
            application/json:
              schema:
                type: object
                properties:
                  id:
                    type: string
                    format: uuid
                  name:
                    type: string
        '401':
          description: No autorizado - Token inválido o faltante
        '404':
          description: Marca no encontrada
        '500':
          description: Error del servidor
  /models/{brandId}:
    get:
      tags:
      - Brands
      summary: Get models by brand
      description: Recupera todos los modelos disponibles para una marca específica
      operationId: getModelsByBrand
      security:
      - BearerAuth: []
      - ApiKeyAuth: []
      parameters:
      - name: brandId
        in: path
        description: ID de la marca
        required: true
        schema:
          type: string
          format: uuid
      responses:
        '200':
          description: Modelos recuperados exitosamente
          content:
            application/json:
              schema:
                type: array
                items:
                  type: object
                  properties:
                    id:
                      type: string
                      format: uuid
                    name:
                      type: string
        '401':
          description: No autorizado - Token inválido o faltante
        '404':
          description: Marca no encontrada
        '500':
          description: Error del servidor
  /models:
    get:
      tags:
      - Brands
      summary: Get all models with brand info
      description: Recupera todos los modelos disponibles con información de su marca
        asociada
      operationId: getAllModelsWithBrand
      security:
      - BearerAuth: []
      - ApiKeyAuth: []
      responses:
        '200':
          description: Modelos con información de marca recuperados exitosamente
          content:
            application/json:
              schema:
                type: array
                items:
                  type: object
                  properties:
                    id:
                      type: string
                      format: uuid
                    name:
                      type: string
                    brand:
                      type: object
                      properties:
                        id:
                          type: string
                          format: uuid
                        name:
                          type: string
        '401':
          description: No autorizado - Token inválido o faltante
        '500':
          description: Error del servidor
  /models/{modelId}/specs:
    get:
      tags:
      - Brands
      summary: Get technical specifications by model
      description: Recupera las especificaciones técnicas detalladas para un modelo
        específico
      operationId: getSpecsByModel
      security:
      - BearerAuth: []
      - ApiKeyAuth: []
      parameters:
      - name: modelId
        in: path
        description: ID del modelo
        required: true
        schema:
          type: string
          format: uuid
      responses:
        '200':
          description: Especificaciones técnicas recuperadas exitosamente
          content:
            application/json:
              schema:
                type: object
                properties:
                  id:
                    type: string
                    format: uuid
                  specifications:
                    type: object
        '401':
          description: No autorizado - Token inválido o faltante
        '404':
          description: Modelo no encontrado
        '500':
          description: Error del servidor
  /models/search:
    get:
      tags:
      - Brands
      summary: Search brands and models
      description: Realiza una búsqueda de marcas y modelos de vehículos utilizando
        un término de búsqueda
      operationId: searchBrandsAndModels
      security:
      - BearerAuth: []
      - ApiKeyAuth: []
      parameters:
      - name: q
        in: query
        description: Termo de búsqueda para filtrar marcas y modelos
        required: true
        schema:
          type: string
      responses:
        '200':
          description: Resultados de la búsqueda recuperados exitosamente
          content:
            application/json:
              schema:
                type: object
                properties:
                  brands:
                    type: array
                    items:
                      type: object
                      properties:
                        id:
                          type: string
                          format: uuid
                        name:
                          type: string
                  models:
                    type: array
                    items:
                      type: object
                      properties:
                        id:
                          type: string
                          format: uuid
                        name:
                          type: string
                        brand:
                          type: object
                          properties:
                            id:
                              type: string
                              format: uuid
                            name:
                              type: string
        '400':
          description: Parámetro de búsqueda ausente o inválido
        '401':
          description: No autorizado - Token inválido o faltante
        '500':
          description: Error del servidor
  /series/{modelId}:
    get:
      tags:
      - Brands
      summary: Get series by model
      description: Recupera todas las series disponibles para un modelo de vehículo
        dado
      operationId: getSeriesByModel
      security:
      - BearerAuth: []
      - ApiKeyAuth: []
      parameters:
      - name: modelId
        in: path
        description: ID del modelo
        required: true
        schema:
          type: string
          format: uuid
      responses:
        '200':
          description: Series recuperadas exitosamente
          content:
            application/json:
              schema:
                type: array
                items:
                  type: object
                  properties:
                    id:
                      type: string
                      format: uuid
                    name:
                      type: string
        '401':
          description: No autorizado - Token inválido o faltante
        '404':
          description: Modelo no encontrado
        '500':
          description: Error del servidor
  /trims/{seriesId}:
    get:
      tags:
      - Brands
      summary: Get trims by series
      description: Recupera todos los 'trims' (acabados) disponibles para una serie
        de vehículos específica
      operationId: getTrimsBySeries
      security:
      - BearerAuth: []
      - ApiKeyAuth: []
      parameters:
      - name: seriesId
        in: path
        description: ID de la serie
        required: true
        schema:
          type: string
          format: uuid
      responses:
        '200':
          description: Trims (acabados) recuperados exitosamente
          content:
            application/json:
              schema:
                type: array
                items:
                  type: object
                  properties:
                    id:
                      type: string
                      format: uuid
                    name:
                      type: string
                    specifications:
                      type: object
        '401':
          description: No autorizado - Token inválido o faltante
        '404':
          description: Serie no encontrada
        '500':
          description: Error del servidor
  /trims/{trimId}:
    get:
      tags:
      - Brands
      summary: Get trim by ID
      description: Recupera los detalles completos de un 'trim' (acabado) específico,
        incluyendo todas sus especificaciones técnicas
      operationId: getTrimById
      security:
      - BearerAuth: []
      - ApiKeyAuth: []
      parameters:
      - name: trimId
        in: path
        description: ID del 'trim' (acabado)
        required: true
        schema:
          type: string
          format: uuid
      responses:
        '200':
          description: Trim (acabado) recuperado exitosamente
          content:
            application/json:
              schema:
                type: object
                properties:
                  id:
                    type: string
                    format: uuid
                  name:
                    type: string
                  specifications:
                    type: object
                    example:
                      other:
                        fuel_consumption: '40'
                  series:
                    type: object
                    properties:
                      id:
                        type: string
                        format: uuid
                      name:
                        type: string
        '401':
          description: No autorizado - Token inválido o faltante
        '404':
          description: Trim (acabado) no encontrado
        '500':
          description: Error del servidor
  /specs/search:
    post:
      tags:
      - Brands
      summary: Search by specifications
      description: Realiza una búsqueda de vehículos basada en criterios de especificaciones
        técnicas
      operationId: searchBySpecifications
      security:
      - BearerAuth: []
      - ApiKeyAuth: []
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                specifications:
                  type: object
                  description: Objeto con pares clave-valor de las especificaciones
                    a buscar
                  example:
                    engineType: Diesel
                    horsepower: 450
              required:
              - specifications
      responses:
        '200':
          description: Resultados de la búsqueda recuperados exitosamente
          content:
            application/json:
              schema:
                type: array
                items:
                  type: object
                  properties:
                    id:
                      type: string
                      format: uuid
                    name:
                      type: string
                    specifications:
                      type: object
        '400':
          description: Criterios de búsqueda inválidos
        '401':
          description: No autorizado - Token inválido o faltante
        '500':
          description: Error del servidor
  /specs/keys:
    get:
      tags:
      - Brands
      summary: Get available specification keys
      description: Recupera todas las claves de especificaciones técnicas disponibles
        en el sistema
      operationId: getAvailableSpecificationKeys
      security:
      - BearerAuth: []
      - ApiKeyAuth: []
      responses:
        '200':
          description: Claves de especificación recuperadas exitosamente
          content:
            application/json:
              schema:
                type: array
                items:
                  type: string
                example:
                - engineType
                - horsepower
                - torque
                - fuelType
                - transmission
        '401':
          description: No autorizado - Token inválido o faltante
        '500':
          description: Error del servidor
  /vehicles:
    post:
      tags:
      - Vehicles
      summary: Create a new vehicle
      description: "Registra un nuevo vehículo en el sistema. Requiere autenticación\
        \ JWT con el rol 'fleet_manager'.\n\nEjemplo de uso:\n```json\n{\n  \"model\"\
        : \"Volvo FH 540\",\n  \"licensePlate\": \"5678XYZ\",\n  \"status\": \"active\"\
        ,\n  \"maxWeight\": 40.0,\n  \"dimensions\": {\n    \"length\": 16.5,\n  \
        \  \"width\": 2.55,\n    \"height\": 4.0\n  }\n}\n```\n"
      operationId: createVehicle
      security:
      - BearerAuth: []
      - ApiKeyAuth: []
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/Vehicle'
            example:
              model: Volvo FH 540
              licensePlate: 5678XYZ
              status: active
              maxWeight: 40.0
              dimensions:
                length: 16.5
                width: 2.55
                height: 4.0
      responses:
        '201':
          description: Vehículo creado exitosamente
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Vehicle'
              example:
                id: 5f8d0d55b54764421b7156c3
                model: Volvo FH 540
                licensePlate: 5678XYZ
                status: active
                maxWeight: 40.0
                dimensions:
                  length: 16.5
                  width: 2.55
                  height: 4.0
        '400':
          description: Datos de vehículo inválidos
          content:
            application/json:
              schema:
                type: object
                properties:
                  error:
                    type: string
        '401':
          description: No autorizado - Token inválido o faltante
        '500':
          description: Error del servidor
    get:
      tags:
      - Vehicles
      summary: Get list of vehicles
      description: "Recupera todos los vehículos registrados en el sistema con paginación.\
        \ \nSe puede filtrar por estado usando el parámetro de consulta ?status=[active|maintenance|out_of_service].\n\
        Parámetros de paginación:\n- page: Número de página (por defecto 1)\n- limit:\
        \ Límite de elementos por página (por defecto 10)\n\nEjemplo de respuesta:\n\
        ```json\n[\n  {\n    \"id\": \"5f8d0d55b54764421b7156c3\",\n    \"model\"\
        : \"Volvo FH 540\",\n    \"licensePlate\": \"5678XYZ\",\n    \"status\": \"\
        active\",\n    \"maxWeight\": 40.0,\n    \"dimensions\": {\n      \"length\"\
        : 16.5,\n      \"width\": 2.55,\n      \"height\": 4.0\n    }\n  }\n]\n```\n"
      operationId: getVehicles
      security:
      - BearerAuth: []
      - ApiKeyAuth: []
      parameters:
      - name: status
        in: query
        description: Filtrar los vehículos por estado operativo
        required: false
        schema:
          type: string
          enum:
          - active
          - maintenance
          - out_of_service
      - name: page
        in: query
        description: Número de página
        required: false
        schema:
          type: integer
          minimum: 1
          default: 1
      - name: limit
        in: query
        description: Límite de elementos por página
        required: false
        schema:
          type: integer
          minimum: 1
          maximum: 100
          default: 10
      responses:
        '200':
          description: Lista de vehículos recuperada exitosamente
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: '#/components/schemas/Vehicle'
              example:
              - id: 5f8d0d55b54764421b7156c3
                model: Volvo FH 540
                licensePlate: 5678XYZ
                status: active
                maxWeight: 40.0
                dimensions:
                  length: 16.5
                  width: 2.55
                  height: 4.0
              - id: 6g9e1e66c65875532c8267d4
                model: MAN TGX 26.480
                licensePlate: 4321ABC
                status: maintenance
                maxWeight: 26.0
                dimensions:
                  length: 12.8
                  width: 2.5
                  height: 3.9
        '401':
          description: No autorizado - Token inválido o faltante
        '500':
          description: Error del servidor
  /vehicles/{id}:
    get:
      tags:
      - Vehicles
      summary: Get vehicle by ID
      description: Recupera los detalles de un vehículo específico por su ID
      operationId: getVehicleById
      security:
      - BearerAuth: []
      - ApiKeyAuth: []
      parameters:
      - $ref: '#/components/parameters/VehicleId'
      responses:
        '200':
          description: Vehículo recuperado exitosamente
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Vehicle'
        '401':
          description: No autorizado - Token inválido o faltante
        '404':
          description: Vehículo no encontrado
        '500':
          description: Error del servidor
    put:
      tags:
      - Vehicles
      summary: Update vehicle
      description: Modifica los datos de un vehículo existente
      operationId: updateVehicle
      security:
      - BearerAuth: []
      - ApiKeyAuth: []
      parameters:
      - $ref: '#/components/parameters/VehicleId'
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/Vehicle'
      responses:
        '200':
          description: Vehículo actualizado exitosamente
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Vehicle'
        '400':
          description: Datos de vehículo inválidos
        '401':
          description: No autorizado - Token inválido o faltante
        '404':
          description: Vehículo no encontrado
        '500':
          description: Error del servidor
    delete:
      tags:
      - Vehicles
      summary: Delete vehicle
      description: Elimina permanentemente un vehículo del sistema
      operationId: deleteVehicle
      security:
      - BearerAuth: []
      - ApiKeyAuth: []
      parameters:
      - $ref: '#/components/parameters/VehicleId'
      responses:
        '204':
          description: Vehículo eliminado exitosamente
        '401':
          description: No autorizado - Token inválido o faltante
        '404':
          description: Vehículo no encontrado
        '500':
          description: Error del servidor
  /vehicles/{id}/enabled:
    patch:
      tags:
      - Vehicles
      summary: Toggle vehicle 'enabled' status
      description: Activa o desactiva el estado 'enabled' de un vehículo
      operationId: toggleVehicleEnabled
      security:
      - BearerAuth: []
      - ApiKeyAuth: []
      parameters:
      - $ref: '#/components/parameters/VehicleId'
      responses:
        '200':
          description: Estado del vehículo actualizado exitosamente
          content:
            application/json:
              schema:
                type: object
                properties:
                  id:
                    type: string
                  enabled:
                    type: boolean
        '401':
          description: No autorizado - Token inválido o faltante
        '404':
          description: Vehículo no encontrado
        '500':
          description: Error del servidor
  /vehicles/{id}/position:
    get:
      tags:
      - Vehicles
      summary: Get current vehicle position
      description: Recupera la última posición GPS registrada del vehículo
      operationId: getCurrentPosition
      security:
      - BearerAuth: []
      - ApiKeyAuth: []
      parameters:
      - $ref: '#/components/parameters/VehicleId'
      responses:
        '200':
          description: Posición recuperada exitosamente
          content:
            application/json:
              schema:
                type: object
                properties:
                  vehicleId:
                    type: string
                  latitude:
                    type: number
                  longitude:
                    type: number
                  timestamp:
                    type: string
                    format: date-time
        '401':
          description: No autorizado - Token inválido o faltante
        '404':
          description: Vehículo o posición no encontrada
        '500':
          description: Error del servidor
    put:
      tags:
      - Vehicles
      summary: Update vehicle position
      description: Registra una nueva posición GPS para el vehículo
      operationId: updatePosition
      security:
      - BearerAuth: []
      - ApiKeyAuth: []
      parameters:
      - $ref: '#/components/parameters/VehicleId'
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                latitude:
                  type: number
                  minimum: -90
                  maximum: 90
                  description: Latitud de la nueva posición
                longitude:
                  type: number
                  minimum: -180
                  maximum: 180
                  description: Longitud de la nueva posición
              required:
              - latitude
              - longitude
      responses:
        '200':
          description: Posición actualizada exitosamente
          content:
            application/json:
              schema:
                type: object
                properties:
                  vehicleId:
                    type: string
                  latitude:
                    type: number
                  longitude:
                    type: number
                  timestamp:
                    type: string
                    format: date-time
        '400':
          description: Datos de posición inválidos
        '401':
          description: No autorizado - Token inválido o faltante
        '404':
          description: Vehículo no encontrado
        '500':
          description: Error del servidor
  /vehicles/{id}/position/history:
    get:
      tags:
      - Vehicles
      summary: Get vehicle position history
      description: Recupera el historial de posiciones GPS del vehículo
      operationId: getVehiclePositionHistory
      x-docusaurus:
        sidebar_key: vehicles-get-position-history
      security:
      - BearerAuth: []
      - ApiKeyAuth: []
      parameters:
      - $ref: '#/components/parameters/VehicleId'
      - name: startDate
        in: query
        description: Fecha de inicio del historial
        schema:
          type: string
          format: date-time
      - name: endDate
        in: query
        description: Fecha de fin del historial
        schema:
          type: string
          format: date-time
      - name: limit
        in: query
        description: Número máximo de entradas a devolver
        schema:
          type: integer
          minimum: 1
          maximum: 1000
          default: 100
      responses:
        '200':
          description: Historial de posiciones recuperado exitosamente
          content:
            application/json:
              schema:
                type: array
                items:
                  type: object
                  properties:
                    vehicleId:
                      type: string
                    latitude:
                      type: number
                    longitude:
                      type: number
                    timestamp:
                      type: string
                      format: date-time
        '401':
          description: No autorizado - Token inválido o faltante
        '404':
          description: Vehículo no encontrado
        '500':
          description: Error del servidor
  /types:
    get:
      tags:
      - Vehicles
      summary: Get all vehicle types
      description: Recupera todos los tipos de vehículos disponibles y sus configuraciones
      operationId: getVehicleTypes
      security:
      - BearerAuth: []
      - ApiKeyAuth: []
      responses:
        '200':
          description: Lista de tipos recuperada exitosamente
          content:
            application/json:
              schema:
                type: object
                additionalProperties:
                  $ref: '#/components/schemas/VehicleType'
  /vehicles/vehicle-types/{id}:
    get:
      tags:
      - Vehicles
      summary: Get vehicle type label
      description: Recupera la etiqueta descriptiva de un tipo de vehículo por su
        ID
      operationId: getVehicleTypeLabel
      security:
      - BearerAuth: []
      - ApiKeyAuth: []
      parameters:
      - name: id
        in: path
        description: ID del tipo de vehículo
        required: true
        schema:
          type: string
      responses:
        '200':
          description: Etiqueta de tipo de vehículo recuperada exitosamente
          content:
            application/json:
              schema:
                type: object
                properties:
                  id:
                    type: string
                  label:
                    type: string
        '401':
          description: No autorizado - Token inválido o faltante
        '404':
          description: Tipo de vehículo no encontrado
        '500':
          description: Error del servidor
  /vehicles/specs/{modelId}:
    get:
      tags:
      - Vehicles
      summary: Get specifications by model ID
      description: Recupera las especificaciones técnicas de un modelo específico
        por su ID
      operationId: getSpecsByModelId
      security:
      - BearerAuth: []
      - ApiKeyAuth: []
      parameters:
      - name: modelId
        in: path
        description: ID del modelo
        required: true
        schema:
          type: string
      responses:
        '200':
          description: Especificaciones recuperadas exitosamente
          content:
            application/json:
              schema:
                type: object
        '401':
          description: No autorizado - Token inválido o faltante
        '404':
          description: Modelo no encontrado
        '500':
          description: Error del servidor
  /vehicles/specs/name/{modelName}:
    get:
      tags:
      - Vehicles
      summary: Get specifications by model name
      description: Recupera las especificaciones técnicas de un modelo específico
        por su nombre
      operationId: getSpecsByModelName
      security:
      - BearerAuth: []
      - ApiKeyAuth: []
      parameters:
      - name: modelName
        in: path
        description: Nombre del modelo
        required: true
        schema:
          type: string
      responses:
        '200':
          description: Especificaciones recuperadas exitosamente
          content:
            application/json:
              schema:
                type: object
        '401':
          description: No autorizado - Token inválido o faltante
        '404':
          description: Modelo no encontrado
        '500':
          description: Error del servidor
  /vehicles/specs/model-id/{modelId}:
    get:
      tags:
      - Vehicles
      summary: Get specifications by model ID (alternative)
      description: Endpoint alternativo para recuperar especificaciones técnicas por
        ID de modelo
      operationId: getSpecsByModelIdAlt
      security:
      - BearerAuth: []
      - ApiKeyAuth: []
      parameters:
      - name: modelId
        in: path
        description: ID del modelo
        required: true
        schema:
          type: string
      responses:
        '200':
          description: Especificaciones recuperadas exitosamente
          content:
            application/json:
              schema:
                type: object
        '401':
          description: No autorizado - Token inválido o faltante
        '404':
          description: Modelo no encontrado
        '500':
          description: Error del servidor
