{
  "openapi": "3.1.0",
  "info": {
    "title": "API de Conduce",
    "version": "1",
    "summary": "Precio Real e Inspección 360 por API.",
    "description": "Precio Real e Inspección 360: el valor de mercado de carros y motos en Venezuela, con cada comparable que lo respalda, y el resultado de las inspecciones de tus vehículos.",
    "contact": {
      "name": "Conduce",
      "url": "https://docs.conduceapp.com"
    }
  },
  "servers": [
    {
      "url": "https://api.conduceapp.com/v1",
      "description": "Producción"
    }
  ],
  "security": [
    {
      "llave": []
    }
  ],
  "tags": [
    {
      "name": "Valuaciones",
      "description": "El precio de mercado de un vehículo, con cada comparable que lo respalda."
    },
    {
      "name": "Inspecciones 360",
      "description": "El resultado de las inspecciones que Conduce hace a tus vehículos."
    },
    {
      "name": "Catálogo",
      "description": "Marcas, modelos y versiones que la valuadora conoce."
    },
    {
      "name": "Tu cuenta",
      "description": "Tu uso del mes."
    }
  ],
  "paths": {
    "/valuations": {
      "post": {
        "operationId": "crearValuacion",
        "x-ancla": "crear-valuacion",
        "x-variable": "valuation",
        "tags": [
          "Valuaciones"
        ],
        "summary": "Crear una valuación",
        "description": "Calcula el precio de mercado de un vehículo con sus datos. Usa los nombres del catálogo para marca, modelo y versión: la marca tiene que estar en el catálogo, y el modelo y la versión se comparan por parecido. confidence.match te dice si se comparó con la misma versión o con todo el modelo, y cada comparable trae su modelo.",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ValuationRequest"
              },
              "example": {
                "vehicle_type": "car",
                "year": 2020,
                "brand": "Toyota",
                "model": "Corolla",
                "version": "SE",
                "mileage_km": 85000,
                "condition": "good",
                "reference": "yummer-48213"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "El objeto Valuación. Si no hay suficientes vehículos parecidos, status es insufficient_data y price viene en null: esa consulta no gasta cupo.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Valuation"
                },
                "examples": {
                  "valuacion": {
                    "summary": "Valuación",
                    "value": {
                      "id": "val_7Qm2xK9pT4sW8vLd",
                      "object": "valuation",
                      "status": "complete",
                      "vehicle": {
                        "type": "car",
                        "year": 2020,
                        "brand": "Toyota",
                        "model": "Corolla",
                        "version": "SE",
                        "mileage_km": 85000,
                        "condition": "good"
                      },
                      "price": {
                        "estimated": 24589,
                        "low": 22622,
                        "high": 26556,
                        "currency": "USD"
                      },
                      "confidence": {
                        "level": "high",
                        "match": "version",
                        "comparables_used": 37
                      },
                      "comparables": [
                        {
                          "source": "market",
                          "status": "listed",
                          "year": 2020,
                          "model": "Corolla",
                          "version": "SE",
                          "mileage_km": 80000,
                          "price": 25081,
                          "adjusted_price": 24581,
                          "outlier": false
                        },
                        {
                          "source": "conduce",
                          "status": "active",
                          "year": 2020,
                          "model": "Corolla",
                          "version": "SE",
                          "mileage_km": 73000,
                          "price": 28900,
                          "adjusted_price": 27700,
                          "outlier": false
                        },
                        {
                          "source": "market",
                          "status": "listed",
                          "year": 2020,
                          "model": "Corolla",
                          "version": "SE",
                          "mileage_km": 70000,
                          "price": 23179,
                          "adjusted_price": 21679,
                          "outlier": false
                        }
                      ],
                      "message": null,
                      "reference": "yummer-48213",
                      "created_at": "2026-10-27T02:01:31Z"
                    },
                    "x-recortes": [
                      {
                        "en": "comparables",
                        "texto": "y los otros 34 comparables"
                      }
                    ]
                  },
                  "sin_datos": {
                    "summary": "Sin datos suficientes",
                    "value": {
                      "id": "val_2Lp8vN3cR6yB5kTe",
                      "object": "valuation",
                      "status": "insufficient_data",
                      "vehicle": {
                        "type": "car",
                        "year": 1998,
                        "brand": "Fiat",
                        "model": "Tempra",
                        "version": null,
                        "mileage_km": 240000,
                        "condition": "fair"
                      },
                      "price": null,
                      "confidence": {
                        "level": null,
                        "match": null,
                        "comparables_used": 0
                      },
                      "comparables": [],
                      "message": null,
                      "reference": "yummer-50771",
                      "created_at": "2026-10-27T02:03:12Z"
                    }
                  }
                }
              }
            },
            "headers": {
              "RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimit-Limit"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              },
              "RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimit-Reset"
              },
              "X-Request-Id": {
                "$ref": "#/components/headers/X-Request-Id"
              },
              "X-Conduce-Quota-Remaining": {
                "$ref": "#/components/headers/X-Conduce-Quota-Remaining"
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/JsonIlegible"
          },
          "401": {
            "$ref": "#/components/responses/SinLlave"
          },
          "403": {
            "$ref": "#/components/responses/Suspendido"
          },
          "413": {
            "description": "El cuerpo de la petición pasa de 1 MB.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "examples": {
                  "body_too_large": {
                    "summary": "Cuerpo demasiado grande",
                    "value": {
                      "error": {
                        "type": "invalid_request_error",
                        "code": "body_too_large",
                        "param": null,
                        "message": "El cuerpo de la petición pasa de 1 MB.",
                        "doc_url": "https://docs.conduceapp.com/api#errores"
                      }
                    }
                  }
                }
              }
            }
          },
          "422": {
            "description": "Falta un dato, un dato no es válido o la marca no está en el catálogo.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "examples": {
                  "parameter_invalid": {
                    "summary": "Dato inválido",
                    "value": {
                      "error": {
                        "type": "invalid_request_error",
                        "code": "parameter_invalid",
                        "param": "condition",
                        "message": "condition debe ser excellent, very_good, good, fair o needs_repairs.",
                        "doc_url": "https://docs.conduceapp.com/api#errores"
                      }
                    }
                  },
                  "brand_not_found": {
                    "summary": "Marca que no existe",
                    "value": {
                      "error": {
                        "type": "invalid_request_error",
                        "code": "brand_not_found",
                        "param": "brand",
                        "message": "No encontramos la marca \"Toyta\". ¿Quisiste decir Toyota?",
                        "doc_url": "https://docs.conduceapp.com/api#errores"
                      }
                    }
                  }
                }
              }
            }
          },
          "429": {
            "description": "Llegaste al cupo de valuaciones del mes (monthly_quota_exceeded): no trae Retry-After, el cupo vuelve el día 1 del mes, en hora de Venezuela. O pasaste el límite por minuto (rate_limited): espera los segundos que dice Retry-After.",
            "headers": {
              "Retry-After": {
                "$ref": "#/components/headers/Retry-After"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "examples": {
                  "monthly_quota_exceeded": {
                    "summary": "Cupo del mes",
                    "value": {
                      "error": {
                        "type": "rate_limit_error",
                        "code": "monthly_quota_exceeded",
                        "param": null,
                        "message": "Llegaste al cupo de valuaciones de tu plan para este mes. Se renueva el 1 de noviembre.",
                        "doc_url": "https://docs.conduceapp.com/api#limites"
                      }
                    }
                  },
                  "rate_limited": {
                    "summary": "Límite por minuto",
                    "value": {
                      "error": {
                        "type": "rate_limit_error",
                        "code": "rate_limited",
                        "param": null,
                        "message": "Pasaste el límite de 60 peticiones por minuto. Espera 41 segundos y vuelve a intentar.",
                        "doc_url": "https://docs.conduceapp.com/api#limites"
                      }
                    }
                  }
                }
              }
            }
          },
          "500": {
            "$ref": "#/components/responses/FallaNuestra"
          }
        }
      },
      "get": {
        "operationId": "listarValuaciones",
        "x-ancla": "listar-valuaciones",
        "x-variable": "valuations",
        "tags": [
          "Valuaciones"
        ],
        "summary": "Listar valuaciones",
        "description": "Tus valuaciones, de la más nueva a la más vieja, por páginas. Sirve para encontrar las de un conductor con su referencia. No gasta cupo. Incluye las valuaciones que vienen con tus Inspecciones 360 (es el mismo id de inspection.valuation). Esas no gastan cupo. Tu uso del mes está en GET /v1/usage.",
        "parameters": [
          {
            "name": "reference",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string"
            },
            "description": "Solo las valuaciones con esa referencia.",
            "example": "yummer-48213"
          },
          {
            "name": "limit",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 100,
              "default": 10
            },
            "description": "Cuántas por página, de 1 a 100. Si no lo mandas, 10.",
            "example": 10
          },
          {
            "name": "starting_after",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string"
            },
            "description": "El id de la última que recibiste, para pedir la página siguiente."
          }
        ],
        "responses": {
          "200": {
            "description": "Una lista de objetos Valuación.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ValuationList"
                },
                "examples": {
                  "lista": {
                    "summary": "Lista",
                    "value": {
                      "object": "list",
                      "data": [
                        {
                          "id": "val_7Qm2xK9pT4sW8vLd",
                          "object": "valuation",
                          "status": "complete",
                          "vehicle": {
                            "type": "car",
                            "year": 2020,
                            "brand": "Toyota",
                            "model": "Corolla",
                            "version": "SE",
                            "mileage_km": 85000,
                            "condition": "good"
                          },
                          "price": {
                            "estimated": 24589,
                            "low": 22622,
                            "high": 26556,
                            "currency": "USD"
                          },
                          "confidence": {
                            "level": "high",
                            "match": "version",
                            "comparables_used": 37
                          },
                          "comparables": [
                            {
                              "source": "market",
                              "status": "listed",
                              "year": 2020,
                              "model": "Corolla",
                              "version": "SE",
                              "mileage_km": 80000,
                              "price": 25081,
                              "adjusted_price": 24581,
                              "outlier": false
                            },
                            {
                              "source": "conduce",
                              "status": "active",
                              "year": 2020,
                              "model": "Corolla",
                              "version": "SE",
                              "mileage_km": 73000,
                              "price": 28900,
                              "adjusted_price": 27700,
                              "outlier": false
                            },
                            {
                              "source": "market",
                              "status": "listed",
                              "year": 2020,
                              "model": "Corolla",
                              "version": "SE",
                              "mileage_km": 70000,
                              "price": 23179,
                              "adjusted_price": 21679,
                              "outlier": false
                            }
                          ],
                          "message": null,
                          "reference": "yummer-48213",
                          "created_at": "2026-10-27T02:01:31Z"
                        }
                      ],
                      "has_more": false
                    },
                    "x-recortes": [
                      {
                        "en": "data.0",
                        "dejar": [
                          "id",
                          "object",
                          "status",
                          "reference"
                        ],
                        "texto": "el objeto Valuación completo"
                      }
                    ]
                  }
                }
              }
            },
            "headers": {
              "RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimit-Limit"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              },
              "RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimit-Reset"
              },
              "X-Request-Id": {
                "$ref": "#/components/headers/X-Request-Id"
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/SinLlave"
          },
          "403": {
            "$ref": "#/components/responses/Suspendido"
          },
          "422": {
            "$ref": "#/components/responses/ParametroInvalido"
          },
          "429": {
            "$ref": "#/components/responses/Limite"
          },
          "500": {
            "$ref": "#/components/responses/FallaNuestra"
          }
        }
      }
    },
    "/valuations/{id}": {
      "get": {
        "operationId": "obtenerValuacion",
        "x-ancla": "obtener-valuacion",
        "x-variable": "valuation",
        "tags": [
          "Valuaciones"
        ],
        "summary": "Obtener una valuación",
        "description": "Devuelve una valuación, la que pediste o la de una de tus Inspecciones 360, igual a como salió ese día, con sus comparables. No gasta cupo.",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "pattern": "^val_[0-9A-Za-z]{16}$"
            },
            "description": "El id de la valuación (val_…), en la ruta.",
            "example": "val_7Qm2xK9pT4sW8vLd"
          }
        ],
        "responses": {
          "200": {
            "description": "El objeto Valuación.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Valuation"
                },
                "examples": {
                  "valuacion": {
                    "summary": "Valuación",
                    "value": {
                      "id": "val_7Qm2xK9pT4sW8vLd",
                      "object": "valuation",
                      "status": "complete",
                      "vehicle": {
                        "type": "car",
                        "year": 2020,
                        "brand": "Toyota",
                        "model": "Corolla",
                        "version": "SE",
                        "mileage_km": 85000,
                        "condition": "good"
                      },
                      "price": {
                        "estimated": 24589,
                        "low": 22622,
                        "high": 26556,
                        "currency": "USD"
                      },
                      "confidence": {
                        "level": "high",
                        "match": "version",
                        "comparables_used": 37
                      },
                      "comparables": [
                        {
                          "source": "market",
                          "status": "listed",
                          "year": 2020,
                          "model": "Corolla",
                          "version": "SE",
                          "mileage_km": 80000,
                          "price": 25081,
                          "adjusted_price": 24581,
                          "outlier": false
                        },
                        {
                          "source": "conduce",
                          "status": "active",
                          "year": 2020,
                          "model": "Corolla",
                          "version": "SE",
                          "mileage_km": 73000,
                          "price": 28900,
                          "adjusted_price": 27700,
                          "outlier": false
                        },
                        {
                          "source": "market",
                          "status": "listed",
                          "year": 2020,
                          "model": "Corolla",
                          "version": "SE",
                          "mileage_km": 70000,
                          "price": 23179,
                          "adjusted_price": 21679,
                          "outlier": false
                        }
                      ],
                      "message": null,
                      "reference": "yummer-48213",
                      "created_at": "2026-10-27T02:01:31Z"
                    },
                    "x-recortes": [
                      {
                        "en": "",
                        "dejar": [
                          "id",
                          "object",
                          "status"
                        ],
                        "texto": "el objeto Valuación completo, igual a como salió ese día"
                      }
                    ]
                  }
                }
              }
            },
            "headers": {
              "RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimit-Limit"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              },
              "RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimit-Reset"
              },
              "X-Request-Id": {
                "$ref": "#/components/headers/X-Request-Id"
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/SinLlave"
          },
          "403": {
            "$ref": "#/components/responses/Suspendido"
          },
          "404": {
            "$ref": "#/components/responses/NoExiste"
          },
          "429": {
            "$ref": "#/components/responses/Limite"
          },
          "500": {
            "$ref": "#/components/responses/FallaNuestra"
          }
        }
      }
    },
    "/inspections": {
      "get": {
        "operationId": "listarInspecciones",
        "x-ancla": "listar-inspecciones",
        "x-variable": "inspections",
        "tags": [
          "Inspecciones 360"
        ],
        "summary": "Listar inspecciones",
        "description": "Las inspecciones de tus vehículos, de la más nueva a la más vieja, por páginas. Filtra por la referencia del conductor, por el serial o desde una fecha. No gasta cupo.",
        "parameters": [
          {
            "name": "reference",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string"
            },
            "description": "Solo las inspecciones de ese conductor.",
            "example": "yummer-48213"
          },
          {
            "name": "vin",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string"
            },
            "description": "Solo las de ese serial (VIN)."
          },
          {
            "name": "inspected_after",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "format": "date-time"
            },
            "description": "Solo las terminadas después de esa fecha, en ISO 8601."
          },
          {
            "name": "limit",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 100,
              "default": 10
            },
            "description": "Cuántas por página, de 1 a 100. Si no lo mandas, 10.",
            "example": 10
          },
          {
            "name": "starting_after",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string"
            },
            "description": "El id de la última que recibiste, para pedir la página siguiente."
          }
        ],
        "responses": {
          "200": {
            "description": "Una lista de objetos Inspección.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/InspectionList"
                },
                "examples": {
                  "lista": {
                    "summary": "Lista",
                    "value": {
                      "object": "list",
                      "data": [
                        {
                          "id": "insp_4Rk9mT2xQ7vB3nHs",
                          "object": "inspection",
                          "status": "completed",
                          "reference": "yummer-48213",
                          "vehicle": {
                            "vin": "JTDBR32E000000000",
                            "year": 2020,
                            "brand": "Toyota",
                            "model": "Corolla",
                            "version": "SE",
                            "mileage_km": 85000
                          },
                          "score": {
                            "technical": 86,
                            "prequalification": 27,
                            "prequalified": true
                          },
                          "rating": "good_condition",
                          "items": [
                            {
                              "key": "first_owner",
                              "label": "¿Es el primer propietario? (N° de propietarios)",
                              "block": "prequalification",
                              "group": "documentos",
                              "result": "no",
                              "owners": 2,
                              "weight": 5,
                              "note": null
                            },
                            {
                              "key": "compresion_motor",
                              "label": "Condición general de la compresión del motor",
                              "block": "technical",
                              "group": "motor",
                              "result": "pass",
                              "weight": 6,
                              "note": null
                            },
                            {
                              "key": "tapiceria",
                              "label": "Tapicería interna (asientos, puertas y tableros)",
                              "block": "technical",
                              "group": "interior",
                              "result": "improve",
                              "weight": 1,
                              "note": "Desgaste en el asiento del conductor"
                            }
                          ],
                          "damages": [
                            {
                              "id": "dmg_1",
                              "view": "left",
                              "description": "Rayón de severidad leve: puerta trasera",
                              "photo_url": "https://conduceapp.com/uploads/verificacion-360/JTDBR32E000000000/v360_damage_3_20261027_141802_8d2e41c7.webp"
                            }
                          ],
                          "obd2": {
                            "scanned_at": "2026-10-27T14:05:12Z",
                            "codes": []
                          },
                          "interview": {
                            "usage": "urban",
                            "collision": false,
                            "stolen_or_recovered": false,
                            "sale_reason": "Cambio de carro",
                            "owner_estimated_price": 25000
                          },
                          "test_drive": {
                            "acceleration": true,
                            "no_abnormal_noises": true,
                            "no_vibrations": true,
                            "abs_responds": true,
                            "braking": true,
                            "overall_feel": true
                          },
                          "observations": {
                            "relevant_info": "Mantenimientos al día en el concesionario.",
                            "technical": "Pastillas de freno delanteras a la mitad."
                          },
                          "photos": [
                            {
                              "kind": "section",
                              "section": "photo_vin",
                              "url": "https://conduceapp.com/uploads/verificacion-360/JTDBR32E000000000/v360_section_0_20261027_141130_5c1f09a2.webp"
                            },
                            {
                              "kind": "section",
                              "section": "photo_odometer",
                              "url": "https://conduceapp.com/uploads/verificacion-360/JTDBR32E000000000/v360_section_1_20261027_141131_e7b3d950.webp"
                            },
                            {
                              "kind": "damage",
                              "section": null,
                              "url": "https://conduceapp.com/uploads/verificacion-360/JTDBR32E000000000/v360_damage_3_20261027_141802_8d2e41c7.webp"
                            }
                          ],
                          "valuation": {
                            "id": "val_9Tc4wE7yU2iO6pAz",
                            "object": "valuation",
                            "status": "complete",
                            "vehicle": {
                              "type": "car",
                              "year": 2020,
                              "brand": "Toyota",
                              "model": "Corolla",
                              "version": "SE",
                              "mileage_km": 85000,
                              "condition": "good"
                            },
                            "price": {
                              "estimated": 24589,
                              "low": 22622,
                              "high": 26556,
                              "currency": "USD"
                            },
                            "confidence": {
                              "level": "high",
                              "match": "version",
                              "comparables_used": 37
                            },
                            "comparables": [
                              {
                                "source": "market",
                                "status": "listed",
                                "year": 2020,
                                "model": "Corolla",
                                "version": "SE",
                                "mileage_km": 80000,
                                "price": 25081,
                                "adjusted_price": 24581,
                                "outlier": false
                              },
                              {
                                "source": "conduce",
                                "status": "active",
                                "year": 2020,
                                "model": "Corolla",
                                "version": "SE",
                                "mileage_km": 73000,
                                "price": 28900,
                                "adjusted_price": 27700,
                                "outlier": false
                              },
                              {
                                "source": "market",
                                "status": "listed",
                                "year": 2020,
                                "model": "Corolla",
                                "version": "SE",
                                "mileage_km": 70000,
                                "price": 23179,
                                "adjusted_price": 21679,
                                "outlier": false
                              }
                            ],
                            "message": null,
                            "reference": "yummer-48213",
                            "created_at": "2026-10-27T14:20:03Z"
                          },
                          "report_url": "https://api.conduceapp.com/v1/inspections/insp_4Rk9mT2xQ7vB3nHs/report",
                          "location": null,
                          "inspected_at": "2026-10-27T14:20:03Z"
                        }
                      ],
                      "has_more": false
                    },
                    "x-recortes": [
                      {
                        "en": "data.0",
                        "dejar": [
                          "id",
                          "object",
                          "reference",
                          "rating",
                          "inspected_at"
                        ],
                        "texto": "el objeto Inspección completo"
                      }
                    ]
                  }
                }
              }
            },
            "headers": {
              "RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimit-Limit"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              },
              "RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimit-Reset"
              },
              "X-Request-Id": {
                "$ref": "#/components/headers/X-Request-Id"
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/SinLlave"
          },
          "403": {
            "$ref": "#/components/responses/Suspendido"
          },
          "422": {
            "$ref": "#/components/responses/ParametroInvalido"
          },
          "429": {
            "$ref": "#/components/responses/Limite"
          },
          "500": {
            "$ref": "#/components/responses/FallaNuestra"
          }
        }
      }
    },
    "/inspections/{id}": {
      "get": {
        "operationId": "obtenerInspeccion",
        "x-ancla": "obtener-inspeccion",
        "x-variable": "inspection",
        "tags": [
          "Inspecciones 360"
        ],
        "summary": "Obtener una inspección",
        "description": "La inspección completa: los 68 puntos con su resultado, los daños con sus fotos, el OBD2 y la valuación de ese día. No gasta cupo.",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "pattern": "^insp_[0-9A-Za-z]{16}$"
            },
            "description": "El id de la inspección (insp_…), en la ruta.",
            "example": "insp_4Rk9mT2xQ7vB3nHs"
          }
        ],
        "responses": {
          "200": {
            "description": "El objeto Inspección.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Inspection"
                },
                "examples": {
                  "inspeccion": {
                    "summary": "Inspección",
                    "value": {
                      "id": "insp_4Rk9mT2xQ7vB3nHs",
                      "object": "inspection",
                      "status": "completed",
                      "reference": "yummer-48213",
                      "vehicle": {
                        "vin": "JTDBR32E000000000",
                        "year": 2020,
                        "brand": "Toyota",
                        "model": "Corolla",
                        "version": "SE",
                        "mileage_km": 85000
                      },
                      "score": {
                        "technical": 86,
                        "prequalification": 27,
                        "prequalified": true
                      },
                      "rating": "good_condition",
                      "items": [
                        {
                          "key": "first_owner",
                          "label": "¿Es el primer propietario? (N° de propietarios)",
                          "block": "prequalification",
                          "group": "documentos",
                          "result": "no",
                          "owners": 2,
                          "weight": 5,
                          "note": null
                        },
                        {
                          "key": "compresion_motor",
                          "label": "Condición general de la compresión del motor",
                          "block": "technical",
                          "group": "motor",
                          "result": "pass",
                          "weight": 6,
                          "note": null
                        },
                        {
                          "key": "tapiceria",
                          "label": "Tapicería interna (asientos, puertas y tableros)",
                          "block": "technical",
                          "group": "interior",
                          "result": "improve",
                          "weight": 1,
                          "note": "Desgaste en el asiento del conductor"
                        }
                      ],
                      "damages": [
                        {
                          "id": "dmg_1",
                          "view": "left",
                          "description": "Rayón de severidad leve: puerta trasera",
                          "photo_url": "https://conduceapp.com/uploads/verificacion-360/JTDBR32E000000000/v360_damage_3_20261027_141802_8d2e41c7.webp"
                        }
                      ],
                      "obd2": {
                        "scanned_at": "2026-10-27T14:05:12Z",
                        "codes": []
                      },
                      "interview": {
                        "usage": "urban",
                        "collision": false,
                        "stolen_or_recovered": false,
                        "sale_reason": "Cambio de carro",
                        "owner_estimated_price": 25000
                      },
                      "test_drive": {
                        "acceleration": true,
                        "no_abnormal_noises": true,
                        "no_vibrations": true,
                        "abs_responds": true,
                        "braking": true,
                        "overall_feel": true
                      },
                      "observations": {
                        "relevant_info": "Mantenimientos al día en el concesionario.",
                        "technical": "Pastillas de freno delanteras a la mitad."
                      },
                      "photos": [
                        {
                          "kind": "section",
                          "section": "photo_vin",
                          "url": "https://conduceapp.com/uploads/verificacion-360/JTDBR32E000000000/v360_section_0_20261027_141130_5c1f09a2.webp"
                        },
                        {
                          "kind": "section",
                          "section": "photo_odometer",
                          "url": "https://conduceapp.com/uploads/verificacion-360/JTDBR32E000000000/v360_section_1_20261027_141131_e7b3d950.webp"
                        },
                        {
                          "kind": "damage",
                          "section": null,
                          "url": "https://conduceapp.com/uploads/verificacion-360/JTDBR32E000000000/v360_damage_3_20261027_141802_8d2e41c7.webp"
                        }
                      ],
                      "valuation": {
                        "id": "val_9Tc4wE7yU2iO6pAz",
                        "object": "valuation",
                        "status": "complete",
                        "vehicle": {
                          "type": "car",
                          "year": 2020,
                          "brand": "Toyota",
                          "model": "Corolla",
                          "version": "SE",
                          "mileage_km": 85000,
                          "condition": "good"
                        },
                        "price": {
                          "estimated": 24589,
                          "low": 22622,
                          "high": 26556,
                          "currency": "USD"
                        },
                        "confidence": {
                          "level": "high",
                          "match": "version",
                          "comparables_used": 37
                        },
                        "comparables": [
                          {
                            "source": "market",
                            "status": "listed",
                            "year": 2020,
                            "model": "Corolla",
                            "version": "SE",
                            "mileage_km": 80000,
                            "price": 25081,
                            "adjusted_price": 24581,
                            "outlier": false
                          },
                          {
                            "source": "conduce",
                            "status": "active",
                            "year": 2020,
                            "model": "Corolla",
                            "version": "SE",
                            "mileage_km": 73000,
                            "price": 28900,
                            "adjusted_price": 27700,
                            "outlier": false
                          },
                          {
                            "source": "market",
                            "status": "listed",
                            "year": 2020,
                            "model": "Corolla",
                            "version": "SE",
                            "mileage_km": 70000,
                            "price": 23179,
                            "adjusted_price": 21679,
                            "outlier": false
                          }
                        ],
                        "message": null,
                        "reference": "yummer-48213",
                        "created_at": "2026-10-27T14:20:03Z"
                      },
                      "report_url": "https://api.conduceapp.com/v1/inspections/insp_4Rk9mT2xQ7vB3nHs/report",
                      "location": null,
                      "inspected_at": "2026-10-27T14:20:03Z"
                    },
                    "x-recortes": [
                      {
                        "en": "",
                        "dejar": [
                          "id",
                          "object",
                          "status",
                          "score",
                          "rating"
                        ],
                        "texto": "el objeto Inspección completo"
                      }
                    ]
                  }
                }
              }
            },
            "headers": {
              "RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimit-Limit"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              },
              "RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimit-Reset"
              },
              "X-Request-Id": {
                "$ref": "#/components/headers/X-Request-Id"
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/SinLlave"
          },
          "403": {
            "$ref": "#/components/responses/Suspendido"
          },
          "404": {
            "$ref": "#/components/responses/NoExiste"
          },
          "429": {
            "$ref": "#/components/responses/Limite"
          },
          "500": {
            "$ref": "#/components/responses/FallaNuestra"
          }
        }
      }
    },
    "/inspections/{id}/report": {
      "get": {
        "operationId": "descargarInforme",
        "x-ancla": "informe-inspeccion",
        "x-archivo": "informe-360.pdf",
        "tags": [
          "Inspecciones 360"
        ],
        "summary": "Descargar el informe",
        "description": "El informe en PDF de la Inspección 360, con el certificado: el mismo que entrega Conduce. Responde application/pdf. Si el informe todavía no llegó, la respuesta es 404 report_not_ready. No gasta cupo.",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "pattern": "^insp_[0-9A-Za-z]{16}$"
            },
            "description": "El id de la inspección (insp_…), en la ruta.",
            "example": "insp_4Rk9mT2xQ7vB3nHs"
          }
        ],
        "responses": {
          "200": {
            "description": "El informe con el certificado.",
            "content": {
              "application/pdf": {
                "schema": {
                  "type": "string",
                  "format": "binary"
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/SinLlave"
          },
          "403": {
            "$ref": "#/components/responses/Suspendido"
          },
          "404": {
            "description": "La inspección no existe, no es tuya o todavía no tiene su informe.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "examples": {
                  "report_not_ready": {
                    "summary": "Informe sin llegar",
                    "value": {
                      "error": {
                        "type": "invalid_request_error",
                        "code": "report_not_ready",
                        "param": null,
                        "message": "El informe PDF de esta inspección todavía no está listo.",
                        "doc_url": "https://docs.conduceapp.com/api#errores"
                      }
                    }
                  }
                }
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/Limite"
          },
          "500": {
            "$ref": "#/components/responses/FallaNuestra"
          }
        }
      }
    },
    "/brands": {
      "get": {
        "operationId": "listarMarcas",
        "x-ancla": "marcas",
        "x-variable": "brands",
        "tags": [
          "Catálogo"
        ],
        "summary": "Listar marcas",
        "description": "Las marcas que la valuadora conoce, con el id que puedes mandar en brand. Cambian poco: guárdalas un día en tu sistema. No gasta cupo.",
        "parameters": [
          {
            "name": "vehicle_type",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "enum": [
                "car",
                "motorcycle"
              ],
              "x-enumDescriptions": {
                "car": "Carro",
                "motorcycle": "Moto"
              },
              "default": "car"
            },
            "description": "car o motorcycle. Si no lo mandas, car.",
            "example": "car"
          }
        ],
        "responses": {
          "200": {
            "description": "Una lista de marcas.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BrandList"
                },
                "examples": {
                  "lista": {
                    "summary": "Lista",
                    "value": {
                      "object": "list",
                      "data": [
                        {
                          "id": "chevrolet",
                          "name": "Chevrolet"
                        },
                        {
                          "id": "ford",
                          "name": "Ford"
                        },
                        {
                          "id": "toyota",
                          "name": "Toyota"
                        }
                      ],
                      "has_more": false
                    },
                    "x-recortes": [
                      {
                        "en": "data",
                        "texto": ""
                      }
                    ]
                  }
                }
              }
            },
            "headers": {
              "RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimit-Limit"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              },
              "RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimit-Reset"
              },
              "X-Request-Id": {
                "$ref": "#/components/headers/X-Request-Id"
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/SinLlave"
          },
          "403": {
            "$ref": "#/components/responses/Suspendido"
          },
          "422": {
            "description": "El tipo de vehículo no es válido.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "examples": {
                  "parameter_invalid": {
                    "summary": "Tipo de vehículo inválido",
                    "value": {
                      "error": {
                        "type": "invalid_request_error",
                        "code": "parameter_invalid",
                        "param": "vehicle_type",
                        "message": "vehicle_type debe ser car o motorcycle.",
                        "doc_url": "https://docs.conduceapp.com/api#errores"
                      }
                    }
                  }
                }
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/Limite"
          },
          "500": {
            "$ref": "#/components/responses/FallaNuestra"
          }
        }
      }
    },
    "/models": {
      "get": {
        "operationId": "listarModelos",
        "x-ancla": "modelos",
        "x-variable": "models",
        "tags": [
          "Catálogo"
        ],
        "summary": "Listar modelos",
        "description": "Los modelos de una marca, del que más publicaciones tiene al que menos. Con year, solo los que tienen publicaciones de ese año, con un año de margen. No gasta cupo.",
        "parameters": [
          {
            "name": "brand",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "La marca: su id o su nombre.",
            "example": "toyota"
          },
          {
            "name": "year",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer"
            },
            "description": "Solo los modelos con publicaciones de ese año, con un año de margen: con 2020, de 2019 a 2021.",
            "example": 2020
          },
          {
            "name": "vehicle_type",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "enum": [
                "car",
                "motorcycle"
              ],
              "x-enumDescriptions": {
                "car": "Carro",
                "motorcycle": "Moto"
              },
              "default": "car"
            },
            "description": "car o motorcycle. Si no lo mandas, car."
          }
        ],
        "responses": {
          "200": {
            "description": "Una lista de modelos.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ModelList"
                },
                "examples": {
                  "lista": {
                    "summary": "Lista",
                    "value": {
                      "object": "list",
                      "data": [
                        {
                          "name": "4Runner"
                        },
                        {
                          "name": "Corolla"
                        },
                        {
                          "name": "Fortuner"
                        }
                      ],
                      "has_more": false
                    },
                    "x-recortes": [
                      {
                        "en": "data",
                        "texto": ""
                      }
                    ]
                  }
                }
              }
            },
            "headers": {
              "RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimit-Limit"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              },
              "RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimit-Reset"
              },
              "X-Request-Id": {
                "$ref": "#/components/headers/X-Request-Id"
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/SinLlave"
          },
          "403": {
            "$ref": "#/components/responses/Suspendido"
          },
          "422": {
            "description": "Falta la marca, un dato no es válido o la marca no está en el catálogo.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "examples": {
                  "brand_not_found": {
                    "summary": "Marca que no existe",
                    "value": {
                      "error": {
                        "type": "invalid_request_error",
                        "code": "brand_not_found",
                        "param": "brand",
                        "message": "No encontramos la marca \"Toyta\". ¿Quisiste decir Toyota?",
                        "doc_url": "https://docs.conduceapp.com/api#errores"
                      }
                    }
                  }
                }
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/Limite"
          },
          "500": {
            "$ref": "#/components/responses/FallaNuestra"
          }
        }
      }
    },
    "/versions": {
      "get": {
        "operationId": "listarVersiones",
        "x-ancla": "versiones-catalogo",
        "x-variable": "versions",
        "tags": [
          "Catálogo"
        ],
        "summary": "Listar versiones",
        "description": "Las versiones de un modelo, hasta 15, con cuántas publicaciones tiene cada una: con más publicaciones, el precio es más preciso. No gasta cupo.",
        "parameters": [
          {
            "name": "brand",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "La marca: su id o su nombre.",
            "example": "toyota"
          },
          {
            "name": "model",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "El modelo.",
            "example": "Corolla"
          },
          {
            "name": "year",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer"
            },
            "description": "Solo las versiones con publicaciones de ese año, con un año de margen: con 2020, de 2019 a 2021.",
            "example": 2020
          },
          {
            "name": "vehicle_type",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "enum": [
                "car",
                "motorcycle"
              ],
              "x-enumDescriptions": {
                "car": "Carro",
                "motorcycle": "Moto"
              },
              "default": "car"
            },
            "description": "car o motorcycle. Si no lo mandas, car."
          }
        ],
        "responses": {
          "200": {
            "description": "Una lista de versiones.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/VersionList"
                },
                "examples": {
                  "lista": {
                    "summary": "Lista",
                    "value": {
                      "object": "list",
                      "data": [
                        {
                          "name": "SE",
                          "comparables": 40
                        },
                        {
                          "name": "LE",
                          "comparables": 10
                        },
                        {
                          "name": "GLI",
                          "comparables": 2
                        }
                      ],
                      "has_more": false
                    }
                  }
                }
              }
            },
            "headers": {
              "RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimit-Limit"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              },
              "RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimit-Reset"
              },
              "X-Request-Id": {
                "$ref": "#/components/headers/X-Request-Id"
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/SinLlave"
          },
          "403": {
            "$ref": "#/components/responses/Suspendido"
          },
          "422": {
            "description": "Falta la marca o el modelo, un dato no es válido o la marca no está en el catálogo.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "examples": {
                  "parameter_missing": {
                    "summary": "Falta un dato",
                    "value": {
                      "error": {
                        "type": "invalid_request_error",
                        "code": "parameter_missing",
                        "param": "model",
                        "message": "Falta model: el modelo, como sale en GET /v1/models.",
                        "doc_url": "https://docs.conduceapp.com/api#errores"
                      }
                    }
                  }
                }
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/Limite"
          },
          "500": {
            "$ref": "#/components/responses/FallaNuestra"
          }
        }
      }
    },
    "/usage": {
      "get": {
        "operationId": "consultarUso",
        "x-ancla": "uso",
        "x-variable": "usage",
        "tags": [
          "Tu cuenta"
        ],
        "summary": "Consultar tu uso",
        "description": "Cuántas valuaciones llevas este mes, cuántas te quedan si tu plan tiene tope y tu límite por minuto. No lleva parámetros y no gasta cupo.",
        "responses": {
          "200": {
            "description": "Tu uso del mes.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Usage"
                },
                "examples": {
                  "sin_tope": {
                    "summary": "Sin tope",
                    "value": {
                      "period": {
                        "start": "2026-10-01T04:00:00Z",
                        "end": "2026-11-01T04:00:00Z"
                      },
                      "valuations": {
                        "used": 312,
                        "limit": null,
                        "remaining": null
                      },
                      "rate_limit": {
                        "per_minute": 60
                      }
                    }
                  },
                  "con_tope": {
                    "summary": "Con tope",
                    "value": {
                      "period": {
                        "start": "2026-10-01T04:00:00Z",
                        "end": "2026-11-01T04:00:00Z"
                      },
                      "valuations": {
                        "used": 312,
                        "limit": 5000,
                        "remaining": 4688
                      },
                      "rate_limit": {
                        "per_minute": 60
                      }
                    }
                  }
                }
              }
            },
            "headers": {
              "RateLimit-Limit": {
                "$ref": "#/components/headers/RateLimit-Limit"
              },
              "RateLimit-Remaining": {
                "$ref": "#/components/headers/RateLimit-Remaining"
              },
              "RateLimit-Reset": {
                "$ref": "#/components/headers/RateLimit-Reset"
              },
              "X-Request-Id": {
                "$ref": "#/components/headers/X-Request-Id"
              },
              "X-Conduce-Quota-Remaining": {
                "$ref": "#/components/headers/X-Conduce-Quota-Remaining"
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/SinLlave"
          },
          "403": {
            "$ref": "#/components/responses/Suspendido"
          },
          "429": {
            "$ref": "#/components/responses/Limite"
          },
          "500": {
            "$ref": "#/components/responses/FallaNuestra"
          }
        }
      }
    }
  },
  "webhooks": {
    "inspection.completed": {
      "post": {
        "summary": "inspection.completed",
        "description": "La inspección quedó lista. Sale cuando llega su informe en PDF o, si el informe tarda, unos minutos después de terminada, con report_url en null. También sale cuando Conduce te asigna una inspección que ya existía.",
        "parameters": [
          {
            "name": "Conduce-Signature",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "t es la hora del envío (unix) y v1, la firma HMAC-SHA256 de t, un punto y el cuerpo, hecha con tu secreto de webhooks (whsec_…). Cada reintento sale con su t nuevo.",
            "example": "t=1793110805,v1=4bd17dfea4f9b7c1e34d78b32d378a345baca18b6e1eafa9790988a30ae7efee"
          },
          {
            "name": "Conduce-Event-Id",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "El id del evento: el mismo de id en el cuerpo.",
            "example": "evt_8Hn3pW5rK2qT6mXa"
          },
          {
            "name": "User-Agent",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string",
              "enum": [
                "Conduce-Webhooks/1"
              ]
            },
            "description": "Siempre Conduce-Webhooks/1."
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/Event"
              },
              "example": {
                "id": "evt_8Hn3pW5rK2qT6mXa",
                "object": "event",
                "type": "inspection.completed",
                "created_at": "2026-10-27T14:20:05Z",
                "data": {
                  "id": "insp_4Rk9mT2xQ7vB3nHs",
                  "object": "inspection",
                  "reference": "yummer-48213",
                  "rating": "good_condition",
                  "inspected_at": "2026-10-27T14:20:03Z",
                  "report_url": "https://api.conduceapp.com/v1/inspections/insp_4Rk9mT2xQ7vB3nHs/report"
                }
              }
            }
          }
        },
        "responses": {
          "2XX": {
            "description": "Lo recibiste. Responde en menos de 10 segundos; si no, reintentamos."
          }
        }
      }
    },
    "inspection.report_ready": {
      "post": {
        "summary": "inspection.report_ready",
        "description": "Llegó el informe en PDF después de inspection.completed, o se reemplazó.",
        "parameters": [
          {
            "name": "Conduce-Signature",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "t es la hora del envío (unix) y v1, la firma HMAC-SHA256 de t, un punto y el cuerpo, hecha con tu secreto de webhooks (whsec_…). Cada reintento sale con su t nuevo.",
            "example": "t=1793110805,v1=4bd17dfea4f9b7c1e34d78b32d378a345baca18b6e1eafa9790988a30ae7efee"
          },
          {
            "name": "Conduce-Event-Id",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "El id del evento: el mismo de id en el cuerpo.",
            "example": "evt_8Hn3pW5rK2qT6mXa"
          },
          {
            "name": "User-Agent",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string",
              "enum": [
                "Conduce-Webhooks/1"
              ]
            },
            "description": "Siempre Conduce-Webhooks/1."
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/Event"
              }
            }
          }
        },
        "responses": {
          "2XX": {
            "description": "Lo recibiste. Responde en menos de 10 segundos; si no, reintentamos."
          }
        }
      }
    },
    "inspection.updated": {
      "post": {
        "summary": "inspection.updated",
        "description": "Conduce corrigió la referencia de la inspección; la de su valuación cambia con ella.",
        "parameters": [
          {
            "name": "Conduce-Signature",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "t es la hora del envío (unix) y v1, la firma HMAC-SHA256 de t, un punto y el cuerpo, hecha con tu secreto de webhooks (whsec_…). Cada reintento sale con su t nuevo.",
            "example": "t=1793110805,v1=4bd17dfea4f9b7c1e34d78b32d378a345baca18b6e1eafa9790988a30ae7efee"
          },
          {
            "name": "Conduce-Event-Id",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "El id del evento: el mismo de id en el cuerpo.",
            "example": "evt_8Hn3pW5rK2qT6mXa"
          },
          {
            "name": "User-Agent",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string",
              "enum": [
                "Conduce-Webhooks/1"
              ]
            },
            "description": "Siempre Conduce-Webhooks/1."
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/Event"
              }
            }
          }
        },
        "responses": {
          "2XX": {
            "description": "Lo recibiste. Responde en menos de 10 segundos; si no, reintentamos."
          }
        }
      }
    },
    "inspection.removed": {
      "post": {
        "summary": "inspection.removed",
        "description": "La inspección ya no es tuya: desde ese momento la API responde 404. Su data trae solo id, object y reference.",
        "parameters": [
          {
            "name": "Conduce-Signature",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "t es la hora del envío (unix) y v1, la firma HMAC-SHA256 de t, un punto y el cuerpo, hecha con tu secreto de webhooks (whsec_…). Cada reintento sale con su t nuevo.",
            "example": "t=1793110805,v1=4bd17dfea4f9b7c1e34d78b32d378a345baca18b6e1eafa9790988a30ae7efee"
          },
          {
            "name": "Conduce-Event-Id",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "El id del evento: el mismo de id en el cuerpo.",
            "example": "evt_8Hn3pW5rK2qT6mXa"
          },
          {
            "name": "User-Agent",
            "in": "header",
            "required": true,
            "schema": {
              "type": "string",
              "enum": [
                "Conduce-Webhooks/1"
              ]
            },
            "description": "Siempre Conduce-Webhooks/1."
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/Event"
              },
              "example": {
                "id": "evt_3Vb7nQ2kL9sW4eRt",
                "object": "event",
                "type": "inspection.removed",
                "created_at": "2026-10-28T16:02:44Z",
                "data": {
                  "id": "insp_4Rk9mT2xQ7vB3nHs",
                  "object": "inspection",
                  "reference": "yummer-48213"
                }
              }
            }
          }
        },
        "responses": {
          "2XX": {
            "description": "Lo recibiste. Responde en menos de 10 segundos; si no, reintentamos."
          }
        }
      }
    }
  },
  "components": {
    "securitySchemes": {
      "llave": {
        "type": "http",
        "scheme": "bearer",
        "bearerFormat": "cnd_live_…",
        "description": "Tu llave secreta, que empieza con cnd_live_. Va en el encabezado Authorization: Bearer cnd_live_…"
      }
    },
    "schemas": {
      "ValuationRequest": {
        "type": "object",
        "required": [
          "year",
          "brand",
          "model",
          "mileage_km",
          "condition"
        ],
        "properties": {
          "vehicle_type": {
            "type": "string",
            "enum": [
              "car",
              "motorcycle"
            ],
            "x-enumDescriptions": {
              "car": "Carro",
              "motorcycle": "Moto"
            },
            "default": "car",
            "description": "Carro o moto. Si no lo mandas, es car."
          },
          "year": {
            "type": "integer",
            "minimum": 1950,
            "description": "Año del modelo, de 1950 al año que viene."
          },
          "brand": {
            "type": "string",
            "maxLength": 100,
            "description": "La marca: su id del catálogo (toyota) o su nombre (Toyota), sin importar mayúsculas ni tildes. Hasta 100 caracteres. Si no está en el catálogo, la respuesta es 422 brand_not_found con las marcas más parecidas."
          },
          "model": {
            "type": "string",
            "maxLength": 255,
            "description": "El modelo, como sale en el catálogo de esa marca. Hasta 255 caracteres."
          },
          "version": {
            "type": "string",
            "maxLength": 255,
            "description": "La versión (SE, XEI, LT…). Con versión el precio es más preciso; sin ella se compara con todo el modelo. Hasta 255 caracteres."
          },
          "mileage_km": {
            "type": "integer",
            "minimum": 0,
            "maximum": 2000000,
            "description": "Kilómetros recorridos, de 0 a 2.000.000. Si el odómetro marca millas, multiplícalas por 1,609."
          },
          "condition": {
            "type": "string",
            "enum": [
              "excellent",
              "very_good",
              "good",
              "fair",
              "needs_repairs"
            ],
            "x-enumDescriptions": {
              "excellent": "Excelente",
              "very_good": "Muy bueno",
              "good": "Bueno",
              "fair": "Regular",
              "needs_repairs": "Necesita reparación"
            },
            "description": "El estado del vehículo."
          },
          "reference": {
            "type": "string",
            "maxLength": 100,
            "description": "Tu referencia para amarrar la valuación a tu sistema, como el número de tu conductor o de su expediente. Hasta 100 caracteres."
          }
        }
      },
      "Valuation": {
        "title": "El objeto Valuación",
        "x-ancla": "objeto-valuacion",
        "type": "object",
        "description": "Una valuación es el precio de mercado de un vehículo en un momento dado, con todo lo que lo respalda. Se guarda: la puedes volver a pedir con su id y no cambia aunque el mercado se mueva.",
        "required": [
          "id",
          "object",
          "status",
          "vehicle",
          "price",
          "confidence",
          "comparables",
          "message",
          "reference",
          "created_at"
        ],
        "properties": {
          "id": {
            "type": "string",
            "pattern": "^val_[0-9A-Za-z]{16}$",
            "description": "Identificador único. Empieza con val_."
          },
          "object": {
            "type": "string",
            "enum": [
              "valuation"
            ],
            "description": "Siempre valuation."
          },
          "status": {
            "type": "string",
            "enum": [
              "complete",
              "insufficient_data"
            ],
            "description": "complete: hay precio. insufficient_data: todavía no hay vehículos parecidos para dar un precio; esa consulta no gasta cupo."
          },
          "vehicle": {
            "type": "object",
            "description": "El vehículo valuado, con la marca como quedó en el catálogo.",
            "required": [
              "type",
              "year",
              "brand",
              "model",
              "version",
              "mileage_km",
              "condition"
            ],
            "properties": {
              "type": {
                "type": "string",
                "enum": [
                  "car",
                  "motorcycle"
                ],
                "description": "car o motorcycle."
              },
              "year": {
                "type": "integer",
                "description": "Año del modelo."
              },
              "brand": {
                "type": "string",
                "description": "La marca, con su nombre del catálogo."
              },
              "model": {
                "type": "string",
                "description": "El modelo."
              },
              "version": {
                "type": [
                  "string",
                  "null"
                ],
                "description": "La versión, si la mandaste."
              },
              "mileage_km": {
                "type": "integer",
                "description": "Kilómetros recorridos."
              },
              "condition": {
                "type": "string",
                "enum": [
                  "excellent",
                  "very_good",
                  "good",
                  "fair",
                  "needs_repairs"
                ],
                "description": "El estado."
              }
            }
          },
          "price": {
            "type": [
              "object",
              "null"
            ],
            "description": "El precio de mercado en dólares, en enteros. null si status es insufficient_data.",
            "required": [
              "estimated",
              "low",
              "high",
              "currency"
            ],
            "properties": {
              "estimated": {
                "type": "integer",
                "description": "El precio estimado: la mediana de los comparables ya ajustados, movida por el estado del vehículo."
              },
              "low": {
                "type": "integer",
                "description": "El piso del rango."
              },
              "high": {
                "type": "integer",
                "description": "El techo del rango."
              },
              "currency": {
                "type": "string",
                "enum": [
                  "USD"
                ],
                "description": "Siempre USD."
              }
            }
          },
          "confidence": {
            "type": "object",
            "description": "Qué tan sólido es el precio.",
            "required": [
              "level",
              "match",
              "comparables_used"
            ],
            "properties": {
              "level": {
                "type": [
                  "string",
                  "null"
                ],
                "enum": [
                  "high",
                  "medium",
                  "low",
                  null
                ],
                "description": "high: la misma versión y 8 comparables o más en el cálculo. low: 1 o 2 comparables. medium: el resto. null si no hay precio."
              },
              "match": {
                "type": [
                  "string",
                  "null"
                ],
                "enum": [
                  "version",
                  "model",
                  null
                ],
                "description": "version: se comparó con la misma versión. model: con todo el modelo. null si no hay precio."
              },
              "comparables_used": {
                "type": "integer",
                "description": "Cuántos comparables entraron al cálculo: los de la lista con outlier en false, aunque la lista se corte en 100."
              }
            }
          },
          "comparables": {
            "type": "array",
            "description": "Cada vehículo que respalda el precio, hasta 100: primero los que entraron al cálculo, del más parecido a tu vehículo en año y kilometraje al menos parecido, y después los que quedaron fuera por salirse de lo normal.",
            "items": {
              "$ref": "#/components/schemas/Comparable"
            }
          },
          "message": {
            "type": [
              "string",
              "null"
            ],
            "description": "Una nota sobre el precio cuando la hay, como «Estimación basada en 2 comparables. Tómala como referencia.». Si no, null."
          },
          "reference": {
            "type": [
              "string",
              "null"
            ],
            "description": "Tu referencia, si la mandaste."
          },
          "created_at": {
            "type": "string",
            "format": "date-time",
            "description": "Cuándo se calculó, en ISO 8601 y UTC."
          }
        },
        "example": {
          "id": "val_7Qm2xK9pT4sW8vLd",
          "object": "valuation",
          "status": "complete",
          "vehicle": {
            "type": "car",
            "year": 2020,
            "brand": "Toyota",
            "model": "Corolla",
            "version": "SE",
            "mileage_km": 85000,
            "condition": "good"
          },
          "price": {
            "estimated": 24589,
            "low": 22622,
            "high": 26556,
            "currency": "USD"
          },
          "confidence": {
            "level": "high",
            "match": "version",
            "comparables_used": 37
          },
          "comparables": [
            {
              "source": "market",
              "status": "listed",
              "year": 2020,
              "model": "Corolla",
              "version": "SE",
              "mileage_km": 80000,
              "price": 25081,
              "adjusted_price": 24581,
              "outlier": false
            },
            {
              "source": "conduce",
              "status": "active",
              "year": 2020,
              "model": "Corolla",
              "version": "SE",
              "mileage_km": 73000,
              "price": 28900,
              "adjusted_price": 27700,
              "outlier": false
            },
            {
              "source": "market",
              "status": "listed",
              "year": 2020,
              "model": "Corolla",
              "version": "SE",
              "mileage_km": 70000,
              "price": 23179,
              "adjusted_price": 21679,
              "outlier": false
            }
          ],
          "message": null,
          "reference": "yummer-48213",
          "created_at": "2026-10-27T02:01:31Z"
        },
        "x-recortes": [
          {
            "en": "comparables",
            "texto": "y los otros 34 comparables"
          }
        ]
      },
      "Comparable": {
        "type": "object",
        "required": [
          "source",
          "status",
          "year",
          "model",
          "version",
          "mileage_km",
          "price",
          "adjusted_price",
          "outlier"
        ],
        "properties": {
          "source": {
            "type": "string",
            "enum": [
              "conduce",
              "market"
            ],
            "description": "conduce: un carro de Conduce. market: una publicación de carros en portales de clasificados y redes sociales de Venezuela."
          },
          "status": {
            "type": "string",
            "enum": [
              "sold",
              "active",
              "inactive",
              "listed"
            ],
            "description": "En Conduce: sold (vendido en Conduce), active (publicado) o inactive (ya no está publicado). En el mercado: listed."
          },
          "year": {
            "type": "integer",
            "description": "Año del modelo."
          },
          "model": {
            "type": "string",
            "description": "El modelo del comparable. Si no había suficientes del modelo que pediste (Corolla Cross) y se comparó con el más cercano (Corolla), aquí lo ves."
          },
          "version": {
            "type": [
              "string",
              "null"
            ],
            "description": "La versión, si se conoce."
          },
          "mileage_km": {
            "type": [
              "integer",
              "null"
            ],
            "description": "Kilómetros recorridos. null si la publicación no trae los km o no son creíbles; ese comparable no se ajusta por km."
          },
          "price": {
            "type": "integer",
            "description": "El precio del comparable con el que trabaja el cálculo, en dólares. En Conduce, el precio del carro; en el mercado, el precio pedido ya llevado a precio de venta."
          },
          "adjusted_price": {
            "type": "integer",
            "description": "price llevado al año y al kilometraje de tu vehículo. Es el que entra al cálculo."
          },
          "outlier": {
            "type": "boolean",
            "description": "true si el precio se salía de lo normal para ese vehículo y no entró al cálculo."
          }
        }
      },
      "Inspection": {
        "title": "El objeto Inspección",
        "x-ancla": "objeto-inspeccion",
        "type": "object",
        "description": "Una Inspección 360 es la revisión de 68 puntos que hace Conduce a un vehículo: 14 de precalificación (documentos, extras e inspección estática) y 54 técnicos (interior, frontal, motor, bajo chasis, laterales, trasera y exterior).\n\nTrae los puntajes, cada punto con su resultado, los daños con su foto, el diagnóstico OBD2 y la valuación del vehículo ese día. Solo ves las inspecciones de tus vehículos.",
        "required": [
          "id",
          "object",
          "status",
          "reference",
          "vehicle",
          "score",
          "rating",
          "items",
          "damages",
          "obd2",
          "interview",
          "test_drive",
          "observations",
          "photos",
          "valuation",
          "report_url",
          "location",
          "inspected_at"
        ],
        "properties": {
          "id": {
            "type": "string",
            "pattern": "^insp_[0-9A-Za-z]{16}$",
            "description": "Identificador único. Empieza con insp_."
          },
          "object": {
            "type": "string",
            "enum": [
              "inspection"
            ],
            "description": "Siempre inspection."
          },
          "status": {
            "type": "string",
            "enum": [
              "completed"
            ],
            "description": "completed: la inspección terminó."
          },
          "reference": {
            "type": [
              "string",
              "null"
            ],
            "description": "La referencia de tu conductor que se anotó al inspeccionar: la misma de tus valuaciones."
          },
          "vehicle": {
            "type": "object",
            "description": "El vehículo inspeccionado.",
            "required": [
              "vin",
              "year",
              "brand",
              "model",
              "version",
              "mileage_km"
            ],
            "properties": {
              "vin": {
                "type": "string",
                "description": "El serial (VIN) de 17 caracteres."
              },
              "year": {
                "type": [
                  "integer",
                  "null"
                ],
                "description": "Año del modelo. null si la inspección no lo trae."
              },
              "brand": {
                "type": [
                  "string",
                  "null"
                ],
                "description": "La marca. null si la inspección no la trae."
              },
              "model": {
                "type": [
                  "string",
                  "null"
                ],
                "description": "El modelo. null si la inspección no lo trae."
              },
              "version": {
                "type": [
                  "string",
                  "null"
                ],
                "description": "La versión."
              },
              "mileage_km": {
                "type": [
                  "integer",
                  "null"
                ],
                "description": "Los kilómetros que marcaba el odómetro. null si la inspección no los trae."
              }
            }
          },
          "score": {
            "type": "object",
            "description": "Los puntajes de la inspección.",
            "required": [
              "technical",
              "prequalification",
              "prequalified"
            ],
            "properties": {
              "technical": {
                "type": "integer",
                "minimum": 0,
                "maximum": 100,
                "description": "Puntaje técnico, de 0 a 100: lo que suman los puntos técnicos que cumplen."
              },
              "prequalification": {
                "type": "integer",
                "minimum": 0,
                "maximum": 30,
                "description": "Puntaje de precalificación, de 0 a 30."
              },
              "prequalified": {
                "type": "boolean",
                "description": "true si la precalificación llegó a 25 o más."
              }
            }
          },
          "rating": {
            "type": [
              "string",
              "null"
            ],
            "enum": [
              "excellent",
              "good_condition",
              "needs_attention",
              "in_progress",
              null
            ],
            "description": "Según el puntaje técnico: excellent (91 a 100), good_condition (80 a 90), needs_attention (1 a 79) o in_progress (puntaje técnico 0). null si la inspección no trae calificación."
          },
          "items": {
            "type": "array",
            "description": "Los 68 puntos del protocolo, cada uno con su resultado.",
            "items": {
              "$ref": "#/components/schemas/Item"
            }
          },
          "damages": {
            "type": "array",
            "description": "Cada daño marcado en el croquis del vehículo, con su foto.",
            "items": {
              "$ref": "#/components/schemas/Damage"
            }
          },
          "obd2": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/Obd2"
              },
              {
                "type": "null"
              }
            ]
          },
          "interview": {
            "$ref": "#/components/schemas/Interview"
          },
          "test_drive": {
            "$ref": "#/components/schemas/TestDrive"
          },
          "observations": {
            "$ref": "#/components/schemas/Observations"
          },
          "photos": {
            "type": "array",
            "description": "Las fotos de la inspección, incluidas las del VIN y del odómetro. Las firmas no salen: solo van en el PDF.",
            "items": {
              "$ref": "#/components/schemas/Photo"
            }
          },
          "valuation": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/Valuation"
              },
              {
                "type": "null"
              }
            ],
            "description": "La valuación del vehículo del día de la inspección o, si Conduce te la asignó después, del día en que te la asignó: el objeto Valuación completo, con sus comparables. Viene incluida y no gasta cupo. null si no se pudo valuar."
          },
          "report_url": {
            "type": [
              "string",
              "null"
            ],
            "description": "El informe en PDF con el certificado: ver Descargar el informe. null mientras el informe no ha llegado."
          },
          "location": {
            "type": [
              "string",
              "null"
            ],
            "description": "La ciudad donde se hizo. Por ahora siempre viene en null: el campo queda listo para cuando la tengamos."
          },
          "inspected_at": {
            "type": "string",
            "format": "date-time",
            "description": "Cuándo terminó la inspección, en ISO 8601 y UTC."
          }
        },
        "example": {
          "id": "insp_4Rk9mT2xQ7vB3nHs",
          "object": "inspection",
          "status": "completed",
          "reference": "yummer-48213",
          "vehicle": {
            "vin": "JTDBR32E000000000",
            "year": 2020,
            "brand": "Toyota",
            "model": "Corolla",
            "version": "SE",
            "mileage_km": 85000
          },
          "score": {
            "technical": 86,
            "prequalification": 27,
            "prequalified": true
          },
          "rating": "good_condition",
          "items": [
            {
              "key": "first_owner",
              "label": "¿Es el primer propietario? (N° de propietarios)",
              "block": "prequalification",
              "group": "documentos",
              "result": "no",
              "owners": 2,
              "weight": 5,
              "note": null
            },
            {
              "key": "compresion_motor",
              "label": "Condición general de la compresión del motor",
              "block": "technical",
              "group": "motor",
              "result": "pass",
              "weight": 6,
              "note": null
            },
            {
              "key": "tapiceria",
              "label": "Tapicería interna (asientos, puertas y tableros)",
              "block": "technical",
              "group": "interior",
              "result": "improve",
              "weight": 1,
              "note": "Desgaste en el asiento del conductor"
            }
          ],
          "damages": [
            {
              "id": "dmg_1",
              "view": "left",
              "description": "Rayón de severidad leve: puerta trasera",
              "photo_url": "https://conduceapp.com/uploads/verificacion-360/JTDBR32E000000000/v360_damage_3_20261027_141802_8d2e41c7.webp"
            }
          ],
          "obd2": {
            "scanned_at": "2026-10-27T14:05:12Z",
            "codes": []
          },
          "interview": {
            "usage": "urban",
            "collision": false,
            "stolen_or_recovered": false,
            "sale_reason": "Cambio de carro",
            "owner_estimated_price": 25000
          },
          "test_drive": {
            "acceleration": true,
            "no_abnormal_noises": true,
            "no_vibrations": true,
            "abs_responds": true,
            "braking": true,
            "overall_feel": true
          },
          "observations": {
            "relevant_info": "Mantenimientos al día en el concesionario.",
            "technical": "Pastillas de freno delanteras a la mitad."
          },
          "photos": [
            {
              "kind": "section",
              "section": "photo_vin",
              "url": "https://conduceapp.com/uploads/verificacion-360/JTDBR32E000000000/v360_section_0_20261027_141130_5c1f09a2.webp"
            },
            {
              "kind": "section",
              "section": "photo_odometer",
              "url": "https://conduceapp.com/uploads/verificacion-360/JTDBR32E000000000/v360_section_1_20261027_141131_e7b3d950.webp"
            },
            {
              "kind": "damage",
              "section": null,
              "url": "https://conduceapp.com/uploads/verificacion-360/JTDBR32E000000000/v360_damage_3_20261027_141802_8d2e41c7.webp"
            }
          ],
          "valuation": {
            "id": "val_9Tc4wE7yU2iO6pAz",
            "object": "valuation",
            "status": "complete",
            "vehicle": {
              "type": "car",
              "year": 2020,
              "brand": "Toyota",
              "model": "Corolla",
              "version": "SE",
              "mileage_km": 85000,
              "condition": "good"
            },
            "price": {
              "estimated": 24589,
              "low": 22622,
              "high": 26556,
              "currency": "USD"
            },
            "confidence": {
              "level": "high",
              "match": "version",
              "comparables_used": 37
            },
            "comparables": [
              {
                "source": "market",
                "status": "listed",
                "year": 2020,
                "model": "Corolla",
                "version": "SE",
                "mileage_km": 80000,
                "price": 25081,
                "adjusted_price": 24581,
                "outlier": false
              },
              {
                "source": "conduce",
                "status": "active",
                "year": 2020,
                "model": "Corolla",
                "version": "SE",
                "mileage_km": 73000,
                "price": 28900,
                "adjusted_price": 27700,
                "outlier": false
              },
              {
                "source": "market",
                "status": "listed",
                "year": 2020,
                "model": "Corolla",
                "version": "SE",
                "mileage_km": 70000,
                "price": 23179,
                "adjusted_price": 21679,
                "outlier": false
              }
            ],
            "message": null,
            "reference": "yummer-48213",
            "created_at": "2026-10-27T14:20:03Z"
          },
          "report_url": "https://api.conduceapp.com/v1/inspections/insp_4Rk9mT2xQ7vB3nHs/report",
          "location": null,
          "inspected_at": "2026-10-27T14:20:03Z"
        },
        "x-recortes": [
          {
            "en": "items",
            "texto": "y los otros 65 puntos"
          },
          {
            "en": "valuation",
            "dejar": [
              "id",
              "object",
              "status"
            ],
            "texto": "el objeto Valuación completo"
          }
        ]
      },
      "Item": {
        "type": "object",
        "required": [
          "key",
          "label",
          "block",
          "group",
          "result",
          "weight",
          "note"
        ],
        "properties": {
          "key": {
            "type": "string",
            "description": "El punto: compresion_motor, tapiceria, frenos…"
          },
          "label": {
            "type": "string",
            "description": "Su nombre, en español."
          },
          "block": {
            "type": "string",
            "enum": [
              "prequalification",
              "technical"
            ],
            "description": "prequalification (14 puntos) o technical (54)."
          },
          "group": {
            "type": "string",
            "enum": [
              "documentos",
              "extras",
              "estatica",
              "interior",
              "frontal",
              "motor",
              "bajo_chasis",
              "laterales",
              "trasera",
              "exterior"
            ],
            "description": "documentos, extras o estatica en la precalificación; interior, frontal, motor, bajo_chasis, laterales, trasera o exterior en los técnicos."
          },
          "result": {
            "type": [
              "string",
              "null"
            ],
            "enum": [
              "pass",
              "improve",
              "fail",
              "yes",
              "no",
              null
            ],
            "description": "En los técnicos: pass (cumple), improve (por mejorar) o fail (no cumple). En la precalificación: yes o no. null si ese punto no se contestó (inspección hecha antes de asignártela)."
          },
          "owners": {
            "type": [
              "integer",
              "null"
            ],
            "description": "Solo en first_owner: cuántos dueños ha tenido el vehículo. Su result es yes si fue uno solo. null si ese punto no se contestó (inspección hecha antes de asignártela)."
          },
          "weight": {
            "type": "integer",
            "description": "Lo que pesa en el puntaje."
          },
          "note": {
            "type": [
              "string",
              "null"
            ],
            "description": "Lo que anotó el inspector, si anotó algo."
          }
        }
      },
      "Damage": {
        "type": "object",
        "required": [
          "id",
          "view",
          "description",
          "photo_url"
        ],
        "properties": {
          "id": {
            "type": "string",
            "pattern": "^dmg_[0-9]+$",
            "description": "Identificador del daño dentro de la inspección: dmg_1, dmg_2…"
          },
          "view": {
            "type": [
              "string",
              "null"
            ],
            "enum": [
              "front",
              "rear",
              "left",
              "right",
              "top",
              null
            ],
            "description": "front, rear, left, right o top: la vista del croquis. null si no se marcó."
          },
          "description": {
            "type": "string",
            "description": "El tipo de daño, su severidad si se marcó y la nota del inspector si anotó algo, como «Rayón de severidad leve: puerta trasera»."
          },
          "photo_url": {
            "type": [
              "string",
              "null"
            ],
            "description": "La foto del daño. El enlace es público, como en la app: se abre sin tu llave y no vence. null si el daño no tiene foto."
          }
        }
      },
      "Obd2": {
        "type": "object",
        "description": "El diagnóstico electrónico OBD2 que se le hizo al vehículo con la inspección. null si no se escaneó.",
        "required": [
          "scanned_at",
          "codes"
        ],
        "properties": {
          "scanned_at": {
            "type": "string",
            "format": "date-time",
            "description": "Cuándo se escaneó."
          },
          "codes": {
            "type": "array",
            "description": "Los códigos de falla. Vacía si no hay fallas.",
            "items": {
              "type": "object",
              "required": [
                "code",
                "description",
                "severity",
                "status"
              ],
              "properties": {
                "code": {
                  "type": "string",
                  "description": "El código, como P0420."
                },
                "description": {
                  "type": "string",
                  "description": "Qué significa."
                },
                "severity": {
                  "type": "string",
                  "enum": [
                    "critical",
                    "warning",
                    "info"
                  ],
                  "description": "critical, warning o info."
                },
                "status": {
                  "type": "string",
                  "enum": [
                    "active",
                    "pending"
                  ],
                  "description": "active: la falla está presente. pending: la computadora la detectó y todavía no la confirma."
                }
              }
            }
          }
        }
      },
      "Interview": {
        "type": "object",
        "description": "Lo que contó el dueño del vehículo en la entrevista. Solo trae lo que se contestó.",
        "properties": {
          "usage": {
            "type": [
              "string",
              "null"
            ],
            "enum": [
              "highway",
              "urban",
              "cargo",
              null
            ],
            "description": "highway (carretera), urban (ciudad) o cargo (carga). null si la respuesta no es una de esas."
          },
          "collision": {
            "type": "boolean",
            "description": "true si el vehículo tuvo una colisión."
          },
          "collision_parts": {
            "type": [
              "string",
              "null"
            ],
            "description": "Las partes que se afectaron en la colisión. null si el campo quedó vacío."
          },
          "stolen_or_recovered": {
            "type": "boolean",
            "description": "true si fue robado o recuperado."
          },
          "sale_reason": {
            "type": [
              "string",
              "null"
            ],
            "description": "Por qué lo vende. null si el campo quedó vacío."
          },
          "owner_estimated_price": {
            "type": [
              "number",
              "null"
            ],
            "description": "El precio que el dueño cree que vale, en dólares. null si no se anotó."
          }
        }
      },
      "TestDrive": {
        "type": "object",
        "description": "La prueba de manejo: cada punto en true si salió bien y en false si falló. Solo trae lo que se probó.",
        "properties": {
          "acceleration": {
            "type": "boolean",
            "description": "Aceleración."
          },
          "no_abnormal_noises": {
            "type": "boolean",
            "description": "Sin ruidos anormales."
          },
          "no_vibrations": {
            "type": "boolean",
            "description": "Sin vibraciones."
          },
          "abs_responds": {
            "type": "boolean",
            "description": "El ABS responde."
          },
          "braking": {
            "type": "boolean",
            "description": "Frenado correcto."
          },
          "overall_feel": {
            "type": "boolean",
            "description": "Sensación general."
          }
        }
      },
      "Observations": {
        "type": "object",
        "description": "Las observaciones del inspector. Solo trae las que tienen texto.",
        "properties": {
          "relevant_info": {
            "type": "string",
            "description": "Información relevante."
          },
          "technical": {
            "type": "string",
            "description": "Observación técnica."
          },
          "driving": {
            "type": "string",
            "description": "Observación de manejo."
          }
        }
      },
      "Photo": {
        "type": "object",
        "required": [
          "kind",
          "section",
          "url"
        ],
        "properties": {
          "kind": {
            "type": "string",
            "enum": [
              "section",
              "damage"
            ],
            "description": "section: una foto de la inspección. damage: la foto de un daño."
          },
          "section": {
            "type": [
              "string",
              "null"
            ],
            "description": "A qué parte de la inspección pertenece, como photo_vin (el VIN), photo_odometer (el odómetro) o photo_general. null en las fotos de daños."
          },
          "url": {
            "type": "string",
            "description": "La foto. El enlace es público, como en la app: se abre sin tu llave y no vence."
          }
        }
      },
      "Event": {
        "title": "El objeto evento",
        "type": "object",
        "required": [
          "id",
          "object",
          "type",
          "created_at",
          "data"
        ],
        "properties": {
          "id": {
            "type": "string",
            "pattern": "^evt_[0-9A-Za-z]{16}$",
            "description": "Identificador del aviso. Empieza con evt_: úsalo para no procesar dos veces el mismo."
          },
          "object": {
            "type": "string",
            "enum": [
              "event"
            ],
            "description": "Siempre event."
          },
          "type": {
            "type": "string",
            "enum": [
              "inspection.completed",
              "inspection.report_ready",
              "inspection.updated",
              "inspection.removed"
            ],
            "description": "Qué pasó: inspection.completed, inspection.report_ready, inspection.updated o inspection.removed."
          },
          "created_at": {
            "type": "string",
            "format": "date-time",
            "description": "Cuándo pasó, en ISO 8601 y UTC."
          },
          "data": {
            "type": "object",
            "description": "Un resumen de la inspección: pide el objeto completo con su id. En inspection.removed trae solo id, object y reference.",
            "required": [
              "id",
              "object",
              "reference"
            ],
            "properties": {
              "id": {
                "type": "string",
                "pattern": "^insp_[0-9A-Za-z]{16}$",
                "description": "El id de la inspección."
              },
              "object": {
                "type": "string",
                "enum": [
                  "inspection"
                ],
                "description": "Siempre inspection."
              },
              "reference": {
                "type": [
                  "string",
                  "null"
                ],
                "description": "La referencia de tu conductor."
              },
              "rating": {
                "type": [
                  "string",
                  "null"
                ],
                "enum": [
                  "excellent",
                  "good_condition",
                  "needs_attention",
                  "in_progress",
                  null
                ],
                "description": "La calificación: la misma de rating en el objeto Inspección, que puede venir en null."
              },
              "inspected_at": {
                "type": "string",
                "format": "date-time",
                "description": "Cuándo terminó la inspección."
              },
              "report_url": {
                "type": [
                  "string",
                  "null"
                ],
                "description": "El informe en PDF, o null si todavía no llegó."
              }
            }
          }
        },
        "example": {
          "id": "evt_8Hn3pW5rK2qT6mXa",
          "object": "event",
          "type": "inspection.completed",
          "created_at": "2026-10-27T14:20:05Z",
          "data": {
            "id": "insp_4Rk9mT2xQ7vB3nHs",
            "object": "inspection",
            "reference": "yummer-48213",
            "rating": "good_condition",
            "inspected_at": "2026-10-27T14:20:03Z",
            "report_url": "https://api.conduceapp.com/v1/inspections/insp_4Rk9mT2xQ7vB3nHs/report"
          }
        }
      },
      "Usage": {
        "type": "object",
        "required": [
          "period",
          "valuations",
          "rate_limit"
        ],
        "properties": {
          "period": {
            "type": "object",
            "description": "El mes en curso, en hora de Venezuela: va del día 1 a las 00:00 (04:00 en UTC) al día 1 del mes siguiente.",
            "required": [
              "start",
              "end"
            ],
            "properties": {
              "start": {
                "type": "string",
                "format": "date-time",
                "description": "Dónde empieza, en UTC."
              },
              "end": {
                "type": "string",
                "format": "date-time",
                "description": "Dónde termina, en UTC."
              }
            }
          },
          "valuations": {
            "type": "object",
            "description": "Tus valuaciones del mes.",
            "required": [
              "used",
              "limit",
              "remaining"
            ],
            "properties": {
              "used": {
                "type": "integer",
                "description": "Las que llevas: solo las de POST /v1/valuations que dieron precio."
              },
              "limit": {
                "type": [
                  "integer",
                  "null"
                ],
                "description": "Tu tope del mes, o null si tu plan no tiene tope."
              },
              "remaining": {
                "type": [
                  "integer",
                  "null"
                ],
                "description": "Las que te quedan, o null si tu plan no tiene tope."
              }
            }
          },
          "rate_limit": {
            "type": "object",
            "description": "Tu límite de peticiones.",
            "required": [
              "per_minute"
            ],
            "properties": {
              "per_minute": {
                "type": "integer",
                "description": "Peticiones por minuto."
              }
            }
          }
        }
      },
      "Error": {
        "type": "object",
        "required": [
          "error"
        ],
        "properties": {
          "error": {
            "type": "object",
            "required": [
              "type",
              "code",
              "param",
              "message",
              "doc_url"
            ],
            "properties": {
              "type": {
                "type": "string",
                "enum": [
                  "invalid_request_error",
                  "authentication_error",
                  "permission_error",
                  "rate_limit_error",
                  "api_error"
                ],
                "description": "La familia del error: invalid_request_error, authentication_error, permission_error, rate_limit_error o api_error."
              },
              "code": {
                "type": "string",
                "enum": [
                  "invalid_json",
                  "body_too_large",
                  "parameter_missing",
                  "parameter_invalid",
                  "brand_not_found",
                  "resource_missing",
                  "report_not_ready",
                  "api_key_missing",
                  "api_key_invalid",
                  "client_suspended",
                  "rate_limited",
                  "monthly_quota_exceeded",
                  "api_error"
                ],
                "description": "El error exacto, para tu código: parameter_missing, parameter_invalid, brand_not_found, monthly_quota_exceeded…"
              },
              "param": {
                "type": [
                  "string",
                  "null"
                ],
                "description": "El parámetro con el problema, o null si no es de un parámetro."
              },
              "message": {
                "type": "string",
                "description": "Qué pasó, en español, para que lo leas tú."
              },
              "doc_url": {
                "type": "string",
                "description": "La parte de esta documentación que lo explica."
              }
            }
          }
        },
        "example": {
          "error": {
            "type": "invalid_request_error",
            "code": "parameter_missing",
            "param": "mileage_km",
            "message": "Falta mileage_km: el kilometraje, en km.",
            "doc_url": "https://docs.conduceapp.com/api#errores"
          }
        }
      },
      "ValuationList": {
        "type": "object",
        "required": [
          "object",
          "data",
          "has_more"
        ],
        "properties": {
          "object": {
            "type": "string",
            "enum": [
              "list"
            ],
            "description": "Siempre list."
          },
          "data": {
            "type": "array",
            "description": "Las valuaciones de esta página.",
            "items": {
              "$ref": "#/components/schemas/Valuation"
            }
          },
          "has_more": {
            "type": "boolean",
            "description": "true si hay más después de esta página: pídela con starting_after."
          }
        }
      },
      "InspectionList": {
        "type": "object",
        "required": [
          "object",
          "data",
          "has_more"
        ],
        "properties": {
          "object": {
            "type": "string",
            "enum": [
              "list"
            ],
            "description": "Siempre list."
          },
          "data": {
            "type": "array",
            "description": "Las inspecciones de esta página.",
            "items": {
              "$ref": "#/components/schemas/Inspection"
            }
          },
          "has_more": {
            "type": "boolean",
            "description": "true si hay más después de esta página: pídela con starting_after."
          }
        }
      },
      "BrandList": {
        "type": "object",
        "required": [
          "object",
          "data",
          "has_more"
        ],
        "properties": {
          "object": {
            "type": "string",
            "enum": [
              "list"
            ],
            "description": "Siempre list."
          },
          "data": {
            "type": "array",
            "description": "Las marcas, por nombre.",
            "items": {
              "type": "object",
              "required": [
                "id",
                "name"
              ],
              "properties": {
                "id": {
                  "type": "string",
                  "description": "El id de la marca, para mandarlo en brand."
                },
                "name": {
                  "type": "string",
                  "description": "Su nombre."
                }
              }
            }
          },
          "has_more": {
            "type": "boolean",
            "description": "Siempre false: el catálogo viene completo, sin starting_after."
          }
        }
      },
      "ModelList": {
        "type": "object",
        "required": [
          "object",
          "data",
          "has_more"
        ],
        "properties": {
          "object": {
            "type": "string",
            "enum": [
              "list"
            ],
            "description": "Siempre list."
          },
          "data": {
            "type": "array",
            "description": "Los modelos de esa marca, del que más publicaciones tiene al que menos.",
            "items": {
              "type": "object",
              "required": [
                "name"
              ],
              "properties": {
                "name": {
                  "type": "string",
                  "description": "El modelo."
                }
              }
            }
          },
          "has_more": {
            "type": "boolean",
            "description": "Siempre false: el catálogo viene completo, sin starting_after."
          }
        }
      },
      "VersionList": {
        "type": "object",
        "required": [
          "object",
          "data",
          "has_more"
        ],
        "properties": {
          "object": {
            "type": "string",
            "enum": [
              "list"
            ],
            "description": "Siempre list."
          },
          "data": {
            "type": "array",
            "description": "Hasta 15 versiones, de la que más publicaciones tiene a la que menos.",
            "items": {
              "type": "object",
              "required": [
                "name",
                "comparables"
              ],
              "properties": {
                "name": {
                  "type": "string",
                  "description": "La versión."
                },
                "comparables": {
                  "type": "integer",
                  "description": "Publicaciones de esa versión (aproximado)."
                }
              }
            }
          },
          "has_more": {
            "type": "boolean",
            "description": "Siempre false: la lista viene de una vez, sin starting_after."
          }
        }
      }
    },
    "responses": {
      "JsonIlegible": {
        "description": "El cuerpo no es un JSON válido.",
        "content": {
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/Error"
            },
            "examples": {
              "invalid_json": {
                "summary": "JSON ilegible",
                "value": {
                  "error": {
                    "type": "invalid_request_error",
                    "code": "invalid_json",
                    "param": null,
                    "message": "El cuerpo no es un objeto JSON válido. Revisa comillas, comas y llaves.",
                    "doc_url": "https://docs.conduceapp.com/api#errores"
                  }
                }
              }
            }
          }
        }
      },
      "SinLlave": {
        "description": "Falta la llave, no es válida o fue revocada.",
        "content": {
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/Error"
            },
            "examples": {
              "api_key_missing": {
                "summary": "Sin llave",
                "value": {
                  "error": {
                    "type": "authentication_error",
                    "code": "api_key_missing",
                    "param": null,
                    "message": "Falta la llave de la API. Mándala en la cabecera Authorization: Bearer <tu llave>.",
                    "doc_url": "https://docs.conduceapp.com/api#autenticacion"
                  }
                }
              },
              "api_key_invalid": {
                "summary": "Llave inválida",
                "value": {
                  "error": {
                    "type": "authentication_error",
                    "code": "api_key_invalid",
                    "param": null,
                    "message": "La llave de la API no es válida o fue revocada.",
                    "doc_url": "https://docs.conduceapp.com/api#autenticacion"
                  }
                }
              }
            }
          }
        }
      },
      "Suspendido": {
        "description": "Tu acceso está suspendido.",
        "content": {
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/Error"
            },
            "examples": {
              "client_suspended": {
                "summary": "Acceso suspendido",
                "value": {
                  "error": {
                    "type": "permission_error",
                    "code": "client_suspended",
                    "param": null,
                    "message": "Tu acceso a la API está suspendido. Escríbenos para reactivarlo.",
                    "doc_url": "https://docs.conduceapp.com/api#autenticacion"
                  }
                }
              }
            }
          }
        }
      },
      "NoExiste": {
        "description": "No existe, o no es tuyo.",
        "content": {
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/Error"
            },
            "examples": {
              "valuacion": {
                "summary": "Valuación que no existe",
                "value": {
                  "error": {
                    "type": "invalid_request_error",
                    "code": "resource_missing",
                    "param": null,
                    "message": "No existe una valuación con ese id.",
                    "doc_url": "https://docs.conduceapp.com/api#errores"
                  }
                }
              },
              "inspeccion": {
                "summary": "Inspección que no existe",
                "value": {
                  "error": {
                    "type": "invalid_request_error",
                    "code": "resource_missing",
                    "param": null,
                    "message": "No existe una inspección con ese id.",
                    "doc_url": "https://docs.conduceapp.com/api#errores"
                  }
                }
              }
            }
          }
        }
      },
      "ParametroInvalido": {
        "description": "Un parámetro no es válido.",
        "content": {
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/Error"
            },
            "examples": {
              "parameter_invalid": {
                "summary": "Dato inválido",
                "value": {
                  "error": {
                    "type": "invalid_request_error",
                    "code": "parameter_invalid",
                    "param": "limit",
                    "message": "limit debe ser un entero entre 1 y 100.",
                    "doc_url": "https://docs.conduceapp.com/api#errores"
                  }
                }
              }
            }
          }
        }
      },
      "Limite": {
        "description": "Pasaste el límite de peticiones por minuto.",
        "headers": {
          "Retry-After": {
            "$ref": "#/components/headers/Retry-After"
          }
        },
        "content": {
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/Error"
            },
            "examples": {
              "rate_limited": {
                "summary": "Límite por minuto",
                "value": {
                  "error": {
                    "type": "rate_limit_error",
                    "code": "rate_limited",
                    "param": null,
                    "message": "Pasaste el límite de 60 peticiones por minuto. Espera 41 segundos y vuelve a intentar.",
                    "doc_url": "https://docs.conduceapp.com/api#limites"
                  }
                }
              }
            }
          }
        }
      },
      "FallaNuestra": {
        "description": "Falla de Conduce.",
        "content": {
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/Error"
            },
            "examples": {
              "api_error": {
                "summary": "Falla de Conduce",
                "value": {
                  "error": {
                    "type": "api_error",
                    "code": "api_error",
                    "param": null,
                    "message": "Tuvimos un problema de nuestro lado. Vuelve a intentar.",
                    "doc_url": "https://docs.conduceapp.com/api#errores"
                  }
                }
              }
            }
          }
        }
      }
    },
    "headers": {
      "RateLimit-Limit": {
        "description": "Peticiones por minuto de tu llave.",
        "schema": {
          "type": "integer"
        },
        "example": 60
      },
      "RateLimit-Remaining": {
        "description": "Las que te quedan en este minuto.",
        "schema": {
          "type": "integer"
        },
        "example": 58
      },
      "RateLimit-Reset": {
        "description": "Segundos para que el minuto se renueve.",
        "schema": {
          "type": "integer"
        },
        "example": 41
      },
      "X-Conduce-Quota-Remaining": {
        "description": "Valuaciones que te quedan este mes. Solo viene si tu plan tiene tope; entonces sale en cada respuesta autenticada, menos en un 429 rate_limited.",
        "schema": {
          "type": "integer"
        },
        "example": 4688
      },
      "Retry-After": {
        "description": "Solo con 429 rate_limited: los segundos que debes esperar antes de reintentar. monthly_quota_exceeded no lo trae: el cupo vuelve el día 1 del mes, en hora de Venezuela.",
        "schema": {
          "type": "integer"
        },
        "example": 41
      },
      "X-Request-Id": {
        "description": "El id de la petición. Si nos escribes por un problema, mándanoslo.",
        "schema": {
          "type": "string",
          "pattern": "^req_[0-9A-Za-z]{16}$"
        },
        "example": "req_9fK2mQ7xL1pR3dZw"
      }
    }
  }
}
