{"activeVersionTag":"latest","latestAvailableVersionTag":"latest","collection":{"info":{"_postman_id":"3699259d-ae2b-49b6-b95f-24c8bed09c53","name":"cloudFleet API","description":"La API de cloudFleet es una API REST basada en solicitudes y respuestas HTTP-JSON y le permite consultar, crear, modificar y eliminar recursos e información de su cuenta en el sistema. Esta página documenta los endpoints REST disponibles e incluye tanto los códigos HTTP como algunos ejemplos de peticiones y respuestas.\n\nTodos los endpoints que ve documentados aquí están disponibles al ejecutar nuestra colección de Postman.\n\n---\n\n# Base URL\n\nLa URL base para todos los endpoints de la API es el siguiente:\n\n`https://fleet.cloudfleet.com/api/v1/`\n\n---\n\n# Supported HTTP verbs\n\nLa API de cloudFleet soporta los siguientes verbos, de acuerdo a lo que requiera hacer:\n\n| Verbo | Descripción |\n| --- | --- |\n| GET | Obtener la información de un recurso |\n| POST | Crear un nuevo recurso en el sistema |\n| PUT | Modifica completamente un recurso |\n| PATCH | Modifica parcialmente (de acuerdo al payload) un recurso |\n| DELETE | Elimina completamente un recurso del sistema |\n\n---\n\n# Supported Media Type & CharSet\n\nLa comunicación con la API de cloudFleet soporta únicamente el formato JSON y el CharSet UTF-8, los cuales deben ser indicados en el header `Content-Type`.\n\n``` html\nContent-Type: application/json; charset=utf-8\n\n ```\n\n---\n\n# Supported DateTime format\n\nTanto en las peticiones como en las respuestas, la API de cloudFleet maneja las fechas como un string en el formato [ISO 8601](https://es.wikipedia.org/wiki/ISO_8601).\n\n``` javascript\n{\n    ...\n    \"createdAt\": \"2019-03-20T22:16:33.9700000Z\"\n    ...\n}\n\n ```\n\n> **Importante**: La API en sus respuestas siempre devolverá las fechas en UTC-0 \n  \n\n---\n\n# Responses\n\n## Códigos HTTP exitosos\n\nCada endpoint de la API retorna un único código HTTP exitoso de respuesta, dependiendo de la acción/verbo puede ser:\n\n| Código | Descripción |\n| --- | --- |\n| 200 | Petición exitosa y se devuelve el objeto requerido en el `body` de la respuesta |\n| 201 | Objeto creado exitosamente. Se devuelve el mismo objeto enviado con alguna información adicional importante, como el `id` con el que se puede consultar posteriormente. En el header de respuesta `Location` encontrará la URL a la que puede hacer una petición GET para conocer la información guardada |\n| 204 | La modificación/eliminación ha sido exitosa y el servidor no requiere devolver una respuesta |\n\nEl siguiente ejemplo sería el `body` de respuesta exitosa al realizar una petición POST al endpoint de `/persons`\n\n``` javascript\n{\n    \"id\": 12,\n    \"personalId\": \"999689578429\",\n    \"name\": \"John\",\n    \"lastName\": \"Smith\",\n    \"address\": \"Carrera 9 #8 - 7\",\n    \"cityName\": \"Medellín\",\n    \"position\": \"Pruebas\",\n    \"positionTypeName\": \"other\",\n    \"employmentDate\": \"2016-09-15T15:53:00\",\n    \"categoryName\": \"Propios\",\n    \"email\": \"John.Smith16@empresa.com.co\",\n    \"landlinePhone\": \"1234567\",\n    \"mobilePhone\": \"1234567890\"\n}\n\n ```\n\n## Códigos HTTP de error\n\nDependiendo del fallo en la petición, cada endpoint puede retornar diferentes códigos HTTP de error en la respuesta:\n\n| Código | Descripción |\n| --- | --- |\n| 401 | Petición no autorizada |\n| 403 | El usuario de la petición no dispone de los permisos requeridos para realizarla |\n| 404 | Error validando los campos que son requeridos en el payload |\n| 409 | Errores de validación de los campos en el payload, como el formato específico de algunos campos o valores que deben existir previamente en el sistema |\n| 415 | Error en el [Media Type soportado por la API](#supported-media-type-and-charset) |\n| 429 | Se ha excedido la [Tasa Límite de peticiones de la API](#api-rate-limit) |\n| 500 | Error inesperado en el servidor al procesar la petición |\n\nUn ejemplo de código de error HTTP `409-Conflict` puede ser:\n\n``` javascript\n{\n  \"error\": {\n    \"message\": \"The specified Workload is not valid. It must be 'high', 'middle' or 'low'\"\n  }\n}\n\n ```\n\n# Rate Limit\n\nEn el uso de la API se tiene un límite de **30 peticiones por minuto**. En todas las respuestas, la API le informa el estado actual del consumo de este límite a través de 3 Headers:\n\n- **X-RateLimit-Limit**. Indica el límite actual de peticiones por minuto\n    \n- **X-RateLimit-Remaining**. Cantidad de requests que quedan para superar el límite\n    \n- **X-RateLimit-Reset**. Cantidad de segundos que falta para que se reinicie el contador de requests\n    \n\nUn ejemplo de estos Headers sería:\n\n```\nX-RateLimit-Limit: 30\nX-RateLimit-Remaining: 13\nX-RateLimit-Reset: 20\n\n ```\n\nEsto significaría que actualmente se tiene un **límite de 30 peticiones por minuto**, que con este request quedarían **faltando 13 peticiones** para cumplir dicho límite y que **en 20 segundos se reiniciará el límite** para volver a tener las 30 peticiones por minuto.\n\nSi por alguna razón se supera el límite permitido de requests por minuto, las respuestas subsecuentes retornarán con el código HTTP **429 (\"TooManyRequests\")** y no se procesará ningún dato enviado. Una vez se alcanza el límite y se obtiene esta respuesta HTTP, devolvemos un nuevo Header llamado **Retry-After**, el cual le informa la cantidad de segundos que debe esperar para poder continuar con el consumo de los servicios.\n\nPor ejemplo, un `Retry-After: 34` indicaría que deberá esperar 34 segundos para volver a consumir los servicios de la API.\n\n## Buenas prácticas para el API Rate Limit\n\nLos límites de consumo de la API son la forma de garantizar la disponibilidad de la misma a todos nuestros usuarios. Para evitar el bloqueo de su API Key por un uso indebido o no controlado, le sugerimos tener presente:\n\n1. Si los llamados los está realizando a través de algún ciclo, es recomendable hacer un tipo de sleep entre una petición y otra, de al menos 2 segundos.\n    \n2. Optimice su código para evitar llamados innecesarios, por ejemplo, usando algún recurso de caché para almacenar de manera local datos de uso frecuente.\n    \n3. Obtenga y analice la información en los Headers de Respuesta **X-RateLimit-Remaining** y **X-RateLimit-Reset** para tener control del tiempo y frecuencia de uso de la API y evitar una Respuesta de código HTTP 429.\n    \n4. Si sus llamados han sido limitados (reciben una respuesta de código HTTP 429), utilice la información del Header de Respuesta Retry-After para hacer que su proceso espere la cantidad de segundos necesaria antes de hacer un nuevo llamado.\n    \n\nConsideramos que la única implementación necesaria en su código es validar el momento en que se supere el límite y reciba una respuesta HTTP 429, en la que deberá implementar la espera necesaria para continuar los llamados a la API. El siguiente pseudocódigo indica una forma simple de hacerlo:\n\n```\nresponse = request.get(endpointURL)\nif response.status equals 429:\n    log('Rate limited exceeded')\n    wait(response.retry-after)\n    retry(endpointURL)\n\n ```\n\n# Pagination\n\nPara optimizar las Repuestas, es posible que los servicios que devuelven una lista de elementos esten paginados, mostrando una cantidad máxima de **50 elementos por página** y así evitar enviar en una única Repuesta los cientos de elementos posibles.\n\nLa paginación de la API se informa a través de los Headers de Repuesta `X-NextPage` y `X-PrevPage`, los cuales contendrían la URL a través de la cual se puede acceder a la siguiente o anterior página de información de la Repuesta, respectivamente.\n\nPor ejemplo: la URL del servicio para Listar Ordenes de Trabajo, filtrando por las de estado \"cerradas\", sería la siguiente:\n\n```\nhttps://fleet.cloudfleet.com/api/v1/work-orders/?status=closed\n\n ```\n\nEn la respuesta, si la cantidad de Ordendes de Trabajo cerradas supera la cantidad de 50, encontraríamos el Header `X-NextPage` con la URL a utilizar si quisiéramos ir a la siguiente página. Así:\n\n```\nX-NextPage: \"https://fleet.cloudfleet.com/api/v1/work-orders/?status=closed&page=2\"\n\n ```\n\nSi se hace una petición a esta URL, en la Repuesta encontraríamos el Header `X-PrevPage` con la URL para consultar la página anterior y, si aún hay más páginas porque son más de 100 Ordenes de Trabajo cerradas, también estaría el Header `X-NextPage` con la URL de la página siguiente. Así:\n\n```\nX-PrevPage: \"https://fleet.cloudfleet.com/api/v1/work-orders/?status=closed&page=1\"\nX-NextPage: \"https://fleet.cloudfleet.com/api/v1/work-orders/?status=closed&page=3\"\n\n ```\n\n# Authentication\n\nTodo enpoint de nuestra API requiere el header `Authorization` en el estándar **Bearer** y debe contener el `API-key`.\n\n## Cómo obtener el API-key\n\n1. Genera el `API-key` desde la aplicación web. Para conocer cómo hacerlo, puede visitar la [documentación correspondiente](https://soporte.cloudfleet.com/docs/cloudFleet/seguridad/usuarios/api_keys/#crear-api-keys).\n    \n2. Usa el `API-key` generada en el header `Authorization` de la petición.\n    \n\n``` html\nAuthorization: Bearer {{API-key}}\n\n ```\n\n> **Importante**: Este `API-key` es el acceso que tiene un usuario para comunicarse con la API, por lo que aconsejamos nunca dejarla visible en el código y almacenarla en un lugar seguro, ya que cualquier persona con acceso a ella podría vulnerar su información. \n  \n\n# WebHooks\n\nCree integraciones en tiempo real con los WebHooks de cloudFleet.\n\n## ¿Qué son los WebHooks?\n\nUn WebHook es un mecanismo que tienen las aplicaciones de poder llamar o conectarse con  \naplicaciones externas ante la ocurrencia de un evento específico dentro de la aplicación.  \nEn este llamado, cloudFleet envía todos los datos relacionados sobre el evento que ocurrió.\n\nLo que se logra con esta técnica, es evitar preguntar a las Api’s de cloudFleet cada poco tiempo si algo ocurrió en tu cuenta. En cambio, si configuras un WebHook para un evento puntual, es cloudFleet el que llamará tu aplicación en tiempo real. Es una forma mucho más optima de hacer integraciones.\n\nSi lo piensas bien, es un llamado de API, pero al revés, es cloudFleet el que llama tu aplicación. Por esta razón también se conocen como “web callback“\n\nPor ejemplo, cloudFleet puede llamar tu aplicación cuando una Orden de Trabajo sea creada y enviar toda la información de la Orden de Trabajo, como por ejemplo el número, la identificación del vehículo, los datos de agrupación, el proveedor, etc. También enviar una notificación en tiempo real cuando un vehículo se cree o se modifique, y enviar la información completa del vehículo.\n\n## Comience a usar WebHooks con su integración solo tres pasos:\n\n- Cree una aplicación/script/programa en una Url que sea pública. Esto lo llamaremos Endpoint.\n    \n- Registre esta Url junto con un evento específico dentro de cloudFleet\n    \n- Activa tu aplicación haciendo que responda a una petición que envía cloudFleet.\n    \n\n## Construir tu Endpoint\n\nEl primer paso para agregar webhooks a su integración de cloudFleet es crear tu propio Endpoint  \npersonalizado. Crear un Endpoint de webhook en su servidor no es diferente de crear una página  \nen su servidor. Con PHP, puede crear un nuevo archivo .php; con .Net o Java puede crear un  \ncontrolador API, una aplicación MVC o un simple script aspx o jsp.\n\nEs importante aclarar que los WebHooks son independientes a la tecnología o framework que usas para desarrollar.  \nCualquier lenguaje de programación que sea capaz de recibir una solicitud Http, puede funcionar con WebHooks.\n\n## Consideraciones clave\n\nPara cada evento, cloudFleet envía una petición **POST** con los datos del WebHook a tu Endpoint en formato **JSON**.  \ncloudFleet sabrá si el mensaje fue entregado o no de acuerdo a la respuesta Http que devuelva tu Endpoint.\n\n### Devuelve un código de estado 2xx rápidamente (Muy rápidamente)\n\nPara acusar recibo de un evento, tu Endpoint debe devolver un **código Http 2xx** **antes de 10 segundos**. Todos los códigos de respuesta fuera de este rango,  \nincluidos los códigos Http 3xx, indican a cloudFleet que no recibió el evento.\n\nSi cloudFleet no recibe un código Http 2xx, el intento de notificación se repite. Después de varios errores al enviar la notificación durante varios días,  \ncloudFleet marca el evento como fallido y deja de intentar enviarlo a su punto final.\n\n**Importante**\n\nDebido a que el acuse de recibo de la notificación de webhook es muy importante, su punto final debe devolver un código Http 2xx antes de que cualquier lógica compleja pueda causar un tiempo de espera.\n\nPor ejemplo: Si al momento de recibir el mensaje de cloudFleet usted tiene que ir a su sistema de inventarios, verificar las extisntecias de una parte, luego  \nmontar una compra para que sea aprobada por una persona y por último enviar un mail a proveedor, probablemente todos los WebHooks van a ser rechazados, ya  \nque esto tomaría mucho tiempo.\n\nNuestra sugerencia es que encole o ponga en una base de datos los mensajes que llegan y que eso sea una de las pocas cosa que haga tu programa del Endpoint.  \nParalelamente existirá otro programa que está verificando esa cola o tabla para procesarlos y en este punto no importa que tantas cosas deba hacer con el mensaje  \nni cuanto tiempo se tome en ser procesado.\n\n**Los Webhooks son datos que fluyen en una sola vía**. Es cloudFleet quien envía los datos a tu Endpoint y cloudFleet no va ha  \nrecibir ningún dato o acción por parte del Endpoint, lo único que verifica es si el mensaje fue aceptado o no mediante los códigos de respuesta Http.\n\n### Comprueba que tu Endpoint funciona\n\nEs muy importante que hayas realizado muchas pruebas sobre tu programa. Puedes ayudarte de herramientas como Postman o cUrl o SoapUI\n\nDebes de tener en cuenta lo siguiente:\n\n- Tu programa puede ser llamado muchas veces, apróximadamente 2 request por segundo en caso de que tengas varios mensajes por ser entregados.\n    \n- Los mensajes que recibas pueden tener una gran cantidad de catacteres. Te recomendamos no ponerle límite a la estructura donde los almacenes en caso de que sea en una base de datos.\n    \n- Implementa un Log donde puedas dejar rastro de las peticiones recibias y su posterior procesamiento.\n    \n- Lee en la petición el Header que identifica el mensaje (Guid) con el fin de evitar procesar dos veces el mismo mensaje.\n    \n- Verifica la firma del mensaje para que te asegures de que este fue enviado por cloudFleet.\n    \n\n## Reintentos\n\nSi tu Endpoint devuelve un código Http diferente a 2xx, cloudFleet marcará ese mensaje como no entregado y lo reintentará varias  \nveces hasta que sea exitoso o hasta que se supere el número máximo de reintentos permitidos que actualmente está en **25 reintentos**.\n\nCuando se haya superado el máximo de reintentos, este mensaje dejará de enviarse. Si otras transacciones para el mismo evento tampoco pueden  \nser entregadas en un lapso de algunos días, el Endpoint se desabilitará automáticamente y un correo de notificación le será enviado.\n\nCon cada reintento se irán incrementando los tiempos de envío. De acuerdo a la siguiente tabla:\n\n| \\# Reintento | Espera para próximo envío |\n| --- | --- |\n| 1 | 1 minuto |\n| 2 | 2 minutos |\n| 3 | 5 minutos |\n| 4 | 10 minutos |\n| 5 | 30 minutos |\n| 6 y siguientes | 60 minutos |\n\n## Controla eventos duplicados\n\nOcasionalmente cloudFleet podría enviar el mismo evento mas de una vez. Te recomendamos que registres cada evento que recibas y guardes  \nsu ID, el cuál se encuentra en el header del request llamado **X-CloudFleet-WebHook-MessageUID**. Al guardar cada evento procesado exitosamente,  \npodrás buscar con cada evento entrante si este ya fue procesado y podrás descartarlo.\n\n## Orden de los eventos\n\ncloudFleet gestiona tus mensajes en orden de llegada (FIFO: First In First Out), sin embargo hay varias condiciones en las que podrías no recibir  \nlos eventos en este mismo orden. Por ejemplo, si hubo una creación de un vehículo y luego una modificación, se generan dos eventos: Creación y Modificación,  \npero si el Endpoint no pudo recibir el evento de creación por algún error interno, pero si el de modificación, y luego de que hayas corregido el error  \neste pudo recibir el evento de creación, en este caso se procesaron los mensajes en orden diferente.\n\n## Seguridad\n\nRecomendamos que tu Endpoint funcione con **HTTPS**, para garantizar que el mensaje viaje encriptado entre punta y punta de la comunicación, pero esto no es  \nobligatorio, también puedes usar HTTP. También se recomienda que hagas una verificación de la firma del evento, el cual se encuentra en el header del request en una  \nvariable llamada **X-CloudFleet-WebHook-Signature**.\n\nPara calulcar la firma y poderla comparar contra el encabezado, lo que debes hacer es procesar el body del request (todo el Json de la petición)  \ny pasarla por un algoritmo de Hash llamado **HMAC SHA256**. Si el valor devuelto por esta función es igual al del ecabezado, es porque  \nambos usaron el mismo **Secreto** que fue configurado previamente en cloudFleet, por lo tanto el evento es legítimo.\n\nEsto puede prevenir a otras aplicaciones enviar mensajes en nombre de cloudFleet y causar algún daño en tus datos.\n\n## Eventos\n\nEl nombre del evento está confirmado por dos partes: El tipo de objeto que devuelve y la acción que se realizó, ambos separados por un punto.  \nPor ejemplo: _vehicle.updated_ es un evento que se genera cuando se modifica un vehículo. Con el nombre se puede determinar que el objeto que encontraremos  \nen el body es de tipo \"vehiculo\".\n\nLos eventos que actualmente existen son:\n\n- _Orden de trabajo creada:_ Ocurre cuando se crea una Orden de Trabajo para un vehículo. El nombre de este evento es **work_order.created**\n    \n- Orden de trabajo cerrada técnicamente: Ocurre cuando una Orden de Trabajo se cierra técnicamente. El nombre de este evento es **work_order.technical_completion**\n    \n- Orden de trabajo cerrada: Ocurre cuando una Orden de Trabajo se cierra definitivamente. El nombre de este evento es **work_order.closed**\n    \n- Orden de trabajo anulada: Ocurre cuando se anula una Orden de Trabajo. El nombre de este evento es **work_order.voided**\n    \n- Odómetro registrado: Ocurre cuando a un vehículo se le actualiza el odómetro por uno nuevo. El nombre de este evento es **odometer.created**\n    \n- Horómetro registrado: Ocurre cuando a un vehículo se le actualiza las horas de uso por uno nuevo. El nombre de este evento es **hourmeter.created**\n    \n\nEl nombre del objeto lo pueden obtener en el header de la petición llamado **X-CloudFleet-WebHook-Object**, esto es útil para saber  \nde entrada contra que clase se va ha deserializar el contenido de la petición.\n\n# Contenido del WebHook\n\nTodos los mensajes enviados a tu Endpoint, tienen la siguiente estructura:\n\n``` json\n{\n   \"event\": {},\n   \"content\": {}\n}\n\n ```\n\nEl objeto _event_ contiene la información relacionada con el evento en sí.  \nSus propiedades son las siguientes:\n\n| Propiedad | Descripción |\n| --- | --- |\n| name | Es el nombre del evento. Compuesto por el objeto y la acción separados por un punto |\n| urlObject | Es la URL de la API de cloudFleet con la cual se obtuvo todo el objeto devuelto en la propiedad _content_ |\n| apiVersion | Es la versión de la API la cual se utilizó para genear el contenido. Esta versión también se puede visualizar en la Url de la propiedad _urlObject_. Cuando estas configurando los WebHooks tu decides que versión de API quieres utilizar para cada evento. |\n| issuedAt | Es la fecha en la cual se generó el evento. Es un string con formato ISO8601 y siempre viene en UTC-0 |\n| attempt | Es el número del intento de esa petición |\n\nEjemplo:\n\n``` json\n\"event\": {\n    \"name\": \"work_order.created\",\n    \"urlObject\": \"https://fleet.cloudfleet.com/api/v1/work-orders/120\",\n    \"apiVersion\": \"v1\",\n    \"issuedAt\": \"2020-04-20T12:42:24.3607153Z\",\n    \"attempt\": 1\n  }\n\n ```\n\nEl objeto _content_ contiene los datos del objeto sobre cual se generó el evento  \nEs decir, si el evento fue sobre una orden de trabajo, el objeto es una orden de trabajo,  \nsi, el evento fue sobre un vehículo, el objeto será un vehículo.\n\nEso significa que el objeto \"content\" puede contener diferentes objetos dependiendo del evento  \nque se genere. Como se comentó antes en este documento, para facilitar la deserialización de este objeto,  \nse incluye en la cabecera del request el nombre del objeto en la variable **X-CloudFleet-WebHook-Object**.\n\n## Ejemplo de WebHook para una Orden de Trabajos creada\n\n``` json\n{\n  \"event\": {\n    \"name\": \"work_order.created\",\n    \"urlObject\": \"https://fleet.cloudfleet.com/api/v1/work-orders/120\",\n    \"apiVersion\": \"v1\",\n    \"issuedAt\": \"2020-04-20T12:42:24.3607153Z\",\n    \"attempt\": 1\n  },\n  \"content\": {\n    \"number\": 120,\n    \"vehicleCode\": \"ABC236\",\n    \"workshopDate\": \"2014-11-27T18:59:00.0000000Z\",\n    \"startDate\": \"2014-11-27T19:16:11.9330000Z\",\n    \"estimatedFinishDate\": \"2014-11-27T22:58:00.0000000Z\",\n    \"status\": \"closed\",\n    \"odometer\": 46879,\n    \"hourmeter\": null,\n    \"vendor\": {\n      \"id\": 58838,\n      \"name\": \"Taller Interno\"\n    },\n    \"reason\": null,\n    \"detectedIssue\": null,\n    \"paymentCondition\": null,\n    \"warranty\": null,\n    \"comments\": null,\n    \"driver\": null,\n    \"maintenanceLabels\": null,\n    \"type\": null,\n    \"city\": null,\n    \"costCenter\": null,\n    \"primaryGroup\": null,\n    \"secundaryGroup\": null,\n    \"createdAt\": \"2014-11-27T19:00:38.0000000Z\",\n    \"createdBy\": {\n      \"id\": 19718,\n      \"name\": \"Juan Perez\"\n    },\n    \"affectsMaintenanceSchedule\": true,\n    \"affectsVehicleAvailability\": true,\n    \"updatedAt\": \"2014-12-16T16:24:00.0000000Z\",\n    \"updatedBy\": {\n      \"id\": 19718,\n      \"name\": \"Juan Perez\"\n    },\n    \"totalCostLabors\": 241200,\n    \"totalCostParts\": 1500000,\n    \"totalCost\": 1741200,\n    \"technicalCompletionDate\": \"2014-12-16T16:24:00.0000000Z\",\n    \"finalCompletionDate\": \"2014-12-16T16:24:00.0000000Z\",\n    \"lastSystemTechnicalCompletionDate\": null,\n    \"lastSystemFinalCompletionDate\": \"2014-12-16T16:24:00.0000000Z\",\n    \"labors\": [\n      {\n        \"id\": 961876,\n        \"workOrderNumber\": 120,\n        \"name\": \"Ajustar Aceite motor\",\n        \"code\": null,\n        \"maintenanceType\": {\n          \"name\": \"Correctivo\",\n          \"code\": \"C\"\n        },\n        \"unitCost\": 25000,\n        \"qty\": 1,\n        \"discount\": 0,\n        \"tax\": 16,\n        \"totalCost\": 29000,\n        \"vendor\": {\n          \"id\": 68002,\n          \"identification\": \"123342332\",\n          \"name\": \"Saldarriaga & cia\"\n        },\n        \"system\": {\n          \"id\": 3891,\n          \"name\": \"Lubricación y Filtros\",\n          \"code\": null\n        },\n        \"subsystem\": {\n          \"id\": 21191,\n          \"name\": \"ACEITE MOTOR\",\n          \"code\": null\n        },\n        \"ledgerAccount\": null,\n        \"invoice\": null,\n        \"comment\": \"El vehiculo presenta fuga de aceite carter\",\n        \"createdAt\": \"2014-11-27T19:00:39.0000000Z\"\n      },\n      {\n        \"id\": 961877,\n        \"workOrderNumber\": 120,\n        \"name\": \"Ajustar Patin tensor correa ventilador\",\n        \"code\": null,\n        \"maintenanceType\": {\n          \"name\": \"Correctivo\",\n          \"code\": \"C\"\n        },\n        \"unitCost\": 45000,\n        \"qty\": 1,\n        \"discount\": 0,\n        \"tax\": 16,\n        \"totalCost\": 52200,\n        \"vendor\": {\n          \"id\": 68002,\n          \"identification\": \"123342332\",\n          \"name\": \"Saldarriaga & cia\"\n        },\n        \"system\": {\n          \"id\": 3893,\n          \"name\": \"Motor\",\n          \"code\": null\n        },\n        \"subsystem\": {\n          \"id\": 21196,\n          \"name\": \"CORREAS, MANGUERAS, ABRAZADERAS Y POLEAS\",\n          \"code\": null\n        },\n        \"ledgerAccount\": null,\n        \"invoice\": null,\n        \"comment\": null,\n        \"createdAt\": \"2014-11-27T19:01:40.0000000Z\"\n      }\n    ],\n    \"parts\": [\n      {\n        \"id\": 795832,\n        \"workOrderNumber\": 120,\n        \"laborId\": 961892,\n        \"name\": \"Inyector 12435\",\n        \"code\": \"21341312\",\n        \"unitCost\": 1500000,\n        \"qty\": 1,\n        \"discount\": 0,\n        \"tax\": 0,\n        \"totalCost\": 1500000,\n        \"vendor\": {\n          \"id\": 58838,\n          \"identification\": null,\n          \"name\": \"Taller Interno\"\n        },\n        \"ledgerAccount\": null,\n        \"invoice\": null,\n        \"comment\": null,\n        \"createdAt\": \"2014-11-27T19:08:26.0000000Z\"\n      }\n    ]\n  }\n}\n\n ```\n\n## Resumen de Headers\n\nCada petición que cloudFleet realiza a tu Endpoint tiene varios Headers que te ayudarán a controlar mejor tus eventos. Esta  \nes una lista de las variables incluidas:\n\n| Header Name | Descripción |\n| --- | --- |\n| X-CloudFleet-WebHook-MessageUID | Es un GUID (UID), que identifica a cada evento, es único y pertenece al evento mas no al intento, es decir si un evento se reitenta 10 veces, tendrá el mismo valor en esta variable |\n| X-CloudFleet-WebHook-Signature | Es un string computado con HMAC SHA 256 usando el secreto preconfigurado desde la IG de cloudFleet, normalmente no mayor a 100 caracteres, que contiene la firma del mensaje |\n| X-CloudFleet-WebHook-Object | Es el tipo de objeto que está en la propiedad _content_ del body |\n| X-CloudFleet-WebHook-AccountUID | Es un GUID (UID) que representa el código de cuenta en cloudFleet. Puede ser útil para aquellas empresas que tengan varias cuentas y deseen clasificar sus mensajes de acuerdo a la cuenta. |\n\n# Changes log\n\n### Mayo 05 de 2019\n\n- Se agrega la propiedad `status` a los servicios Obtener Orden de Trabajo y Listar Ordenes de Trabajo.\n    \n\n### Junio 13 de 2019\n\n- Se crean métodos para Crear, Obtener y Listar Novedades de Mantenimiento\n    \n\n### Junio 14 de 2019\n\n- Se agregan las propiedades `updatedAt` y `updatedBy` a los servicios de Obtener Orden de Trabajo y Listar Ordenes de Trabajo.\n    \n\n### Julio 08 de 2019\n\n- Se crea método para Listar Tiempos de Mantenimiento\n    \n\n### Julio 25 de 2019\n\n- Se crean métodos para aplicar Cierre Técnico y Cierre Final a Ordenes de Trabajo\n    \n\n### Septiembre 23 de 2019\n\n- Se adiciona método para crear checklist basado en nombres de variables\n    \n\n### Octubre 16 de 2019\n\n- Implementación del [Rate Limit](#rate-limit) a toda la API\n    \n- Se crean métodos para Obtener un Viaje y Obtener los Gastos de un Viaje\n    \n\n### Febrero 24 de 2020\n\n- Implementación de la nueva versión del _endpoint_ para [Listar Ordenes de Trabajo (V2)](https://developer.cloudfleet.com/#e441719c-6104-47aa-b47d-e6214a9c2704), dejando como obsoleta la versión anterior (V1).\n    \n- En la nueva versión del _endpoint_ de [Listar Ordenes de Trabajo](https://developer.cloudfleet.com/#e441719c-6104-47aa-b47d-e6214a9c2704) se realizaron los siguientes cambios:\n    \n    - Ya se permite buscar no solo por un código de Vehículo, sino que se admite un listado separado por comas\n        \n    - Ya se permite buscar no solo por un estado, sino que se admite un listado separado por comas\n        \n    - Ya se permite buscar no solo por un tipo, sino que se admite un listado separado por comas\n        \n    - Anteriormente, por defecto, se excluían las Ordenes de Trabajo anuladas; ya la obtención (y exclusión) de éstas se hace a través del campo **status** con la mejora de resibir un listado separado por comas\n        \n    - Dado que ya se pueden obtener Ordenes de Trabajo anuladas, en el objeto de respuesta se devuelve la información de anulación en una nueva propiedad llamada **voided**, que contendría quien la anuló, cuándo se anuló y el motivo de anulación\n        \n    - La propiedad que se tenía pra listar las Etiquetas de Mantenimiento (**maintenanceLabels**) ya no solo devuelve el listado de los nombres de Etiquetas, sino que ya devuelve un listado (array JSON) que contiene en cada ítem un objeto con el nombre, el código y cuándo se marcó la Orden de Trabajo con cada Etiqueta\n        \n\n### Julio 29 de 2020\n\n- Se crean métodos para Obtener Checklist por Número y Listar Checklist por variables de búsqueda\n    \n\n### Agosto 28 de 2020\n\n- Se crean métodos para Crear Trabajo y Obtener Trabajo por ID\n    \n\n### Junio 22 de 2021\n\n- Se crea método para agregar imágenes a un Checklist\n    \n\n### Junio 24 de 2021\n\n- Se crea método para listar Trabajos de Solicitud\n    \n- Se crean métodos para modificación parcial de Trabajos y de Repuestos de Solicitud\n    \n\n### Agosto 25 de 2021\n\n- Se crea método para buscar Documentos de Vehículos","schema":"https://schema.getpostman.com/json/collection/v2.0.0/collection.json","isPublicCollection":false,"owner":"6956890","team":305883,"collectionId":"3699259d-ae2b-49b6-b95f-24c8bed09c53","publishedId":"S17nUAtR","public":true,"publicUrl":"https://developer.cloudfleet.com","privateUrl":"https://go.postman.co/documentation/6956890-3699259d-ae2b-49b6-b95f-24c8bed09c53","customColor":{"top-bar":"FFFFFF","right-sidebar":"222222","highlight":"3CAD13"},"documentationLayout":"classic-double-column","version":"8.12.3","publishDate":"2019-03-19T14:40:09.000Z","activeVersionTag":"latest","documentationTheme":"light","metaTags":{},"logos":{}},"statusCode":200},"environments":[{"name":"Public","id":"201a24a1-57bb-424e-82b7-291b69e6232c","owner":"3042167","values":[{"key":"url-fleet","value":"https://fleet.cloudfleet.com","enabled":true},{"key":"url-tire","value":"https://tire.cloudfleet.com","enabled":true},{"key":"API-key","value":"{{API-key}}","enabled":true}],"published":true}],"user":{"authenticated":false,"permissions":{"publish":false}},"run":{"button":{"js":"https://run.pstmn.io/button.js","css":"https://run.pstmn.io/button.css"}},"web":"https://www.getpostman.com/","team":{"logo":"https://res.cloudinary.com/postman/image/upload/t_team_logo_pubdoc/v1/team/71ed5a3b44b77469b31ff6a5bf81d9ab0b1543170843ad904c07252450b12548","favicon":"https://res.cloudinary.com/postman/image/upload/v1552685652/team/x1jnkhqktnlu1v1zc406.ico"},"isEnvFetchError":false,"languages":"[{\"key\":\"csharp\",\"label\":\"C#\",\"variant\":\"HttpClient\"},{\"key\":\"csharp\",\"label\":\"C#\",\"variant\":\"RestSharp\"},{\"key\":\"curl\",\"label\":\"cURL\",\"variant\":\"cURL\"},{\"key\":\"dart\",\"label\":\"Dart\",\"variant\":\"http\"},{\"key\":\"go\",\"label\":\"Go\",\"variant\":\"Native\"},{\"key\":\"http\",\"label\":\"HTTP\",\"variant\":\"HTTP\"},{\"key\":\"java\",\"label\":\"Java\",\"variant\":\"OkHttp\"},{\"key\":\"java\",\"label\":\"Java\",\"variant\":\"Unirest\"},{\"key\":\"javascript\",\"label\":\"JavaScript\",\"variant\":\"Fetch\"},{\"key\":\"javascript\",\"label\":\"JavaScript\",\"variant\":\"jQuery\"},{\"key\":\"javascript\",\"label\":\"JavaScript\",\"variant\":\"XHR\"},{\"key\":\"c\",\"label\":\"C\",\"variant\":\"libcurl\"},{\"key\":\"nodejs\",\"label\":\"NodeJs\",\"variant\":\"Axios\"},{\"key\":\"nodejs\",\"label\":\"NodeJs\",\"variant\":\"Native\"},{\"key\":\"nodejs\",\"label\":\"NodeJs\",\"variant\":\"Request\"},{\"key\":\"nodejs\",\"label\":\"NodeJs\",\"variant\":\"Unirest\"},{\"key\":\"objective-c\",\"label\":\"Objective-C\",\"variant\":\"NSURLSession\"},{\"key\":\"ocaml\",\"label\":\"OCaml\",\"variant\":\"Cohttp\"},{\"key\":\"php\",\"label\":\"PHP\",\"variant\":\"cURL\"},{\"key\":\"php\",\"label\":\"PHP\",\"variant\":\"Guzzle\"},{\"key\":\"php\",\"label\":\"PHP\",\"variant\":\"HTTP_Request2\"},{\"key\":\"php\",\"label\":\"PHP\",\"variant\":\"pecl_http\"},{\"key\":\"powershell\",\"label\":\"PowerShell\",\"variant\":\"RestMethod\"},{\"key\":\"python\",\"label\":\"Python\",\"variant\":\"http.client\"},{\"key\":\"python\",\"label\":\"Python\",\"variant\":\"Requests\"},{\"key\":\"r\",\"label\":\"R\",\"variant\":\"httr\"},{\"key\":\"r\",\"label\":\"R\",\"variant\":\"RCurl\"},{\"key\":\"ruby\",\"label\":\"Ruby\",\"variant\":\"Net::HTTP\"},{\"key\":\"shell\",\"label\":\"Shell\",\"variant\":\"Httpie\"},{\"key\":\"shell\",\"label\":\"Shell\",\"variant\":\"wget\"},{\"key\":\"swift\",\"label\":\"Swift\",\"variant\":\"URLSession\"}]","languageSettings":[{"key":"csharp","label":"C#","variant":"HttpClient"},{"key":"csharp","label":"C#","variant":"RestSharp"},{"key":"curl","label":"cURL","variant":"cURL"},{"key":"dart","label":"Dart","variant":"http"},{"key":"go","label":"Go","variant":"Native"},{"key":"http","label":"HTTP","variant":"HTTP"},{"key":"java","label":"Java","variant":"OkHttp"},{"key":"java","label":"Java","variant":"Unirest"},{"key":"javascript","label":"JavaScript","variant":"Fetch"},{"key":"javascript","label":"JavaScript","variant":"jQuery"},{"key":"javascript","label":"JavaScript","variant":"XHR"},{"key":"c","label":"C","variant":"libcurl"},{"key":"nodejs","label":"NodeJs","variant":"Axios"},{"key":"nodejs","label":"NodeJs","variant":"Native"},{"key":"nodejs","label":"NodeJs","variant":"Request"},{"key":"nodejs","label":"NodeJs","variant":"Unirest"},{"key":"objective-c","label":"Objective-C","variant":"NSURLSession"},{"key":"ocaml","label":"OCaml","variant":"Cohttp"},{"key":"php","label":"PHP","variant":"cURL"},{"key":"php","label":"PHP","variant":"Guzzle"},{"key":"php","label":"PHP","variant":"HTTP_Request2"},{"key":"php","label":"PHP","variant":"pecl_http"},{"key":"powershell","label":"PowerShell","variant":"RestMethod"},{"key":"python","label":"Python","variant":"http.client"},{"key":"python","label":"Python","variant":"Requests"},{"key":"r","label":"R","variant":"httr"},{"key":"r","label":"R","variant":"RCurl"},{"key":"ruby","label":"Ruby","variant":"Net::HTTP"},{"key":"shell","label":"Shell","variant":"Httpie"},{"key":"shell","label":"Shell","variant":"wget"},{"key":"swift","label":"Swift","variant":"URLSession"}],"languageOptions":[{"label":"C# - HttpClient","value":"csharp - HttpClient - C#"},{"label":"C# - RestSharp","value":"csharp - RestSharp - C#"},{"label":"cURL - cURL","value":"curl - cURL - cURL"},{"label":"Dart - http","value":"dart - http - Dart"},{"label":"Go - Native","value":"go - Native - Go"},{"label":"HTTP - HTTP","value":"http - HTTP - HTTP"},{"label":"Java - OkHttp","value":"java - OkHttp - Java"},{"label":"Java - Unirest","value":"java - Unirest - Java"},{"label":"JavaScript - Fetch","value":"javascript - Fetch - JavaScript"},{"label":"JavaScript - jQuery","value":"javascript - jQuery - JavaScript"},{"label":"JavaScript - XHR","value":"javascript - XHR - JavaScript"},{"label":"C - libcurl","value":"c - libcurl - C"},{"label":"NodeJs - Axios","value":"nodejs - Axios - NodeJs"},{"label":"NodeJs - Native","value":"nodejs - Native - NodeJs"},{"label":"NodeJs - Request","value":"nodejs - Request - NodeJs"},{"label":"NodeJs - Unirest","value":"nodejs - Unirest - NodeJs"},{"label":"Objective-C - NSURLSession","value":"objective-c - NSURLSession - Objective-C"},{"label":"OCaml - Cohttp","value":"ocaml - Cohttp - OCaml"},{"label":"PHP - cURL","value":"php - cURL - PHP"},{"label":"PHP - Guzzle","value":"php - Guzzle - PHP"},{"label":"PHP - HTTP_Request2","value":"php - HTTP_Request2 - PHP"},{"label":"PHP - pecl_http","value":"php - pecl_http - PHP"},{"label":"PowerShell - RestMethod","value":"powershell - RestMethod - PowerShell"},{"label":"Python - http.client","value":"python - http.client - Python"},{"label":"Python - Requests","value":"python - Requests - Python"},{"label":"R - httr","value":"r - httr - R"},{"label":"R - RCurl","value":"r - RCurl - R"},{"label":"Ruby - Net::HTTP","value":"ruby - Net::HTTP - Ruby"},{"label":"Shell - Httpie","value":"shell - Httpie - Shell"},{"label":"Shell - wget","value":"shell - wget - Shell"},{"label":"Swift - URLSession","value":"swift - URLSession - Swift"}],"layoutOptions":[{"value":"classic-single-column","label":"Single Column"},{"value":"classic-double-column","label":"Double Column"}],"versionOptions":[],"environmentOptions":[{"value":"0","label":"No Environment"},{"label":"Public","value":"3042167-201a24a1-57bb-424e-82b7-291b69e6232c"}],"canonicalUrl":"https://developer.cloudfleet.com/view/metadata/S17nUAtR"}