KARGO · API

API de Kargo

API REST y servidor MCP para integrar sistemas externos y agentes de IA con el taller: clientes, equipos, solicitudes de servicio, órdenes de trabajo, agenda, inspecciones, cotizaciones, mantenimiento preventivo y búsqueda de refacciones.

Empezar en tres pasos

  1. Crea una credencial. En la app: Configuración → Integraciones → Nueva integración. Elige un nombre y los alcances. La llave (kgo_live_…) se muestra una sola vez: guárdala en el gestor de secretos de tu sistema.
  2. Comprueba que funciona.
curl https://api.kargo.mx/v1/me \
  -H "Authorization: Bearer $KARGO_API_KEY"
  1. Haz tu primera consulta.
curl "https://api.kargo.mx/v1/equipment?q=hyster&limit=10" \
  -H "Authorization: Bearer $KARGO_API_KEY"

Autenticación

Manda la llave en Authorization: Bearer kgo_live_…. Para clientes que no pueden poner esa cabecera, X-API-Key hace lo mismo. Nunca la mandes en la URL: terminaría en los registros de cada servidor por el que pase.

Cada llave pertenece a un taller y sólo ve sus datos. Revocarla en la app surte efecto en la siguiente petición. Para rotarla sin cortar el servicio: crea una llave nueva, actualiza tu sistema y revoca la anterior.

Existen dos tipos de credencial:

Alcances

AlcanceQué permiteEscribe
customers:readClientes, sus datos de contacto fiscal y sus ubicaciones.no
customers:writeDar de alta clientes nuevos (entran como borrador para completar después).sí
equipment:readFlotilla de clientes y del taller, y el historial del horómetro.no
fleet:readQué equipos propios están disponibles, rentados, en reparación o en tránsito. Sin precios.no
requests:readSolicitudes de servicio registradas por clientes.no
requests:writeRegistrar lo que pide un cliente. Es el primer paso de todo servicio.sí
orders:readÓrdenes, técnicos y su disponibilidad por día.no
orders:writeAbrir órdenes de trabajo y moverlas en la agenda. Compromete al taller con el cliente.sí
inspections:readRevisiones, checklist y los hallazgos con su severidad.no
quotes:readCotizaciones y totales. Incluye importes: no se la des a quien no deba verlos.no
preventive:readPronóstico por equipo y avisos de servicio.no
preventive:writePosponer un aviso de servicio con motivo y fecha.sí
parts:readCatálogo de refacciones de la tienda: por número de pieza, equivalencia o nombre. Sin precios.no

No existe ningún alcance de administración: una integración no crea llaves, no cambia roles ni mueve precios.

Respuestas y errores

Toda respuesta correcta es un objeto con data y, en las listas, meta:

{ "data": { "id": "…", "number": "OT-20261107-0001" } }

Todo error tiene la misma forma. Programa contra error.code, que es estable; el mensaje es para una persona y puede mejorarse sin aviso:

{ "error": { "code": "order_closed", "message": "La orden ya está cerrada o cancelada.", "request_id": "req_8f3a…" } }

Cada respuesta trae X-Request-Id. Cítalo si reportas un problema: con él se encuentra la petición en la bitácora.

EstadoCódigos frecuentesQué hacer
400invalid_jsonEl cuerpo no es JSON.
401unauthorized, invalid_api_keyFalta la llave, es inválida, venció o fue revocada.
403insufficient_scope, forbidden, human_confirmation_requiredLa credencial no puede hacerlo. details.required_scope dice qué alcance falta.
404*_not_found, route_not_foundNo existe, o pertenece a otro taller.
409order_closed, order_changed_elsewhere, request_in_progressEl estado cambió. Vuelve a leer y decide.
413 / 415payload_too_large, unsupported_media_typeEl cuerpo pasa de 256 KB o no es application/json.
422validation_failed, unknown_parameter, invalid_cursor y las reglas del tallerdetails.issues lista cada campo inválido.
429rate_limitedEspera Retry-After segundos.
5xxinternal_error, upstream_unavailable, catalog_unavailableReintenta con espera creciente; sigue fallando → reporta el request_id.

Un parámetro desconocido es un error, no se ignora: ?statuss=open (con la errata) responde 422 en vez de devolver todo sin filtrar.

Paginación y sincronización

Las listas devuelven hasta limit registros (1–200, por omisión 50) y meta.next_cursor. Pásalo tal cual como cursor para la página siguiente; null significa que no hay más. El cursor es opaco: no intentes construirlo.

Para sincronizar cambios no repases todo: guarda el mayor updated_at que viste y pídelo con updated_since. Con ese filtro el orden es por modificación ascendente, justo el que necesita quien procesa en el orden en que ocurrieron las cosas. Más allá de 10,000 registros con cursor se rechaza; updated_since no tiene ese tope.

Idempotencia

Toda operación que escribe acepta la cabecera Idempotency-Key con cualquier cadena única por operación (un UUID sirve). Si tu petición se cae a medias y la repites con la misma clave, recibes la respuesta original (Idempotent-Replayed: true) en vez de abrir una segunda orden. Usar la misma clave con una petición distinta responde 422 idempotency_key_reused. Las claves se recuerdan 48 horas.

Límites

Cada credencial tiene un tope de peticiones por minuto (se ve en GET /me; 120 por omisión) y algunas operaciones que consultan servicios de terceros tienen uno propio más bajo. Al pasarte, la respuesta es 429 con Retry-After.

Servidor MCP

El mismo conjunto de operaciones está disponible como herramientas MCP para agentes de IA (Claude, ChatGPT, Cursor y cualquier cliente compatible), con la misma credencial, los mismos alcances y las mismas reglas: lo que la API REST niega, el agente tampoco puede hacerlo.

Claude Code:

claude mcp add --transport http kargo https://mcp.kargo.mx/mcp \
  --header "Authorization: Bearer $KARGO_API_KEY"

Cualquier cliente con archivo de configuración:

{
  "mcpServers": {
    "kargo": {
      "type": "http",
      "url": "https://mcp.kargo.mx/mcp",
      "headers": { "Authorization": "Bearer kgo_live_…" }
    }
  }
}

Para un agente, crea la credencial como tipo agent: así no puede ejecutar las operaciones sensibles sin una persona. Las herramientas de escritura aceptan además idempotency_key.

HerramientaOperación RESTAlcance
whoamiGET /mecualquiera
list_customersGET /customerscustomers:read
get_customerGET /customers/{id}customers:read
create_customerPOST /customerscustomers:write
list_customer_locationsGET /customers/{id}/locationscustomers:read
list_equipmentGET /equipmentequipment:read
get_equipmentGET /equipment/{id}equipment:read
list_hour_meter_readingsGET /equipment/{id}/hour-meter-readingsequipment:read
list_service_requestsGET /service-requestsrequests:read
get_service_requestGET /service-requests/{id}requests:read
create_service_requestPOST /service-requestsrequests:write
list_service_ordersGET /service-ordersorders:read
get_service_orderGET /service-orders/{id}orders:read
open_service_orderPOST /service-ordersorders:write · sensible
schedule_service_orderPOST /service-orders/{id}/scheduleorders:write · sensible
list_techniciansGET /techniciansorders:read
technician_availabilityGET /availability/techniciansorders:read
fleet_availabilityGET /availability/fleetfleet:read
list_inspectionsGET /inspectionsinspections:read
get_inspectionGET /inspections/{id}inspections:read
list_quotesGET /quotesquotes:read
get_quoteGET /quotes/{id}quotes:read
list_preventive_forecastsGET /preventive/forecastspreventive:read
postpone_preventive_alertPOST /preventive/alerts/{id}/postponepreventive:write · sensible
search_partsGET /parts/searchparts:read

Referencia de operaciones

Servicio

GET /health

Estado del servicio · sin credencial · health.get

No pide credencial: es para monitoreo (UptimeRobot, el balanceador, un check de tu integración). Responde 200 con status: ok, o 503 con status: degraded si la base de datos no contesta.

Ejemplo

curl "https://api.kargo.mx/v1/health"

Respuesta — data

CampoTipoDescripción
statusok | degraded
versiontexto
databaseok | unavailable
timetexto

GET /me

Quién es esta credencial · cualquier credencial · MCP whoami · me.get

Integración, taller, alcances y límite de peticiones. Sirve para comprobar que la llave funciona y qué puede hacer antes de usarla.

Ejemplo

curl "https://api.kargo.mx/v1/me" \
  -H "Authorization: Bearer $KARGO_API_KEY"

Respuesta — data

CampoTipoDescripción
integrationobjeto
tenant_iduuid
scopeslista de texto
rate_limit_per_minutenúmero

Clientes

GET /customers

Listar clientes · alcance customers:read · MCP list_customers · customers.list

Clientes del taller, del más reciente al más antiguo. q busca en razón social, nombre corto, RFC y clave externa.

Parámetros

NombreDóndeTipoRequeridoDescripción
limitconsultaenteronoCuántos registros devolver (1–200).
cursorconsultatextonoValor meta.next_cursor de la respuesta anterior para pedir la página siguiente.
updated_sinceconsultafecha y hora (ISO 8601)noSólo registros modificados desde esa fecha (ISO 8601). Con este filtro el orden es por modificación ascendente: es la forma de sincronizar cambios sin repasar todo.
qconsultatextonoTexto a buscar en razón social, nombre corto, RFC o clave externa.
statusconsultaactive | inactive | archivedno
kindconsultacustomer | prospect | supplier | othernoprospect = en borrador, sin expediente fiscal completo.

Ejemplo

curl "https://api.kargo.mx/v1/customers?limit=50" \
  -H "Authorization: Bearer $KARGO_API_KEY"

Respuesta — Cada elemento de data

CampoTipoDescripción
iduuid
legal_nametextoRazón social o nombre completo.
display_nametexto | nullNombre corto con el que se le conoce en el taller.
kindcustomer | prospect | supplier | otherprospect = dado de alta en borrador, falta completar su expediente fiscal.
statusactive | inactive | archived
rfctexto | null
external_customer_codetexto | nullClave del cliente en otro sistema (ERP, CRM), si la integración la guarda.
sourcetextoDe dónde llegó el cliente: manual, registro_import, odoo_import, api_import.
created_attextoAlta (ISO 8601).
updated_attextoÚltima modificación (ISO 8601).

GET /customers/{id}

Consultar un cliente · alcance customers:read · MCP get_customer · customers.get

Consultar un cliente

Parámetros

NombreDóndeTipoRequeridoDescripción
idrutauuidsíIdentificador del cliente.

Ejemplo

curl "https://api.kargo.mx/v1/customers/<id>" \
  -H "Authorization: Bearer $KARGO_API_KEY"

Respuesta — data

CampoTipoDescripción
iduuid
legal_nametextoRazón social o nombre completo.
display_nametexto | nullNombre corto con el que se le conoce en el taller.
kindcustomer | prospect | supplier | otherprospect = dado de alta en borrador, falta completar su expediente fiscal.
statusactive | inactive | archived
rfctexto | null
external_customer_codetexto | nullClave del cliente en otro sistema (ERP, CRM), si la integración la guarda.
sourcetextoDe dónde llegó el cliente: manual, registro_import, odoo_import, api_import.
created_attextoAlta (ISO 8601).
updated_attextoÚltima modificación (ISO 8601).

POST /customers

Registrar un cliente · alcance customers:write · MCP create_customer · customers.create

Da de alta un cliente como prospecto en borrador: el taller completa después su expediente fiscal. Si mandas external_customer_code y ya existe un cliente con esa clave, devuelve ése (200) en vez de duplicarlo: es la forma de sincronizar desde otro sistema sin crear repetidos.

Cuerpo (JSON)

CampoTipoRequeridoDescripción
legal_nametextosíRazón social o nombre completo.
display_nametextonoNombre corto. Por omisión, la razón social.
rfctextonoRFC de 12 o 13 caracteres.
external_customer_codetextonoClave del cliente en tu sistema. Evita duplicados al sincronizar.

Ejemplo

curl -X POST "https://api.kargo.mx/v1/customers" \
  -H "Authorization: Bearer $KARGO_API_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: $(uuidgen)" \
  -d '{ "legal_name": "Molinos del Pacífico SA de CV" }'

Respuesta — data

CampoTipoDescripción
iduuid
legal_nametextoRazón social o nombre completo.
display_nametexto | nullNombre corto con el que se le conoce en el taller.
kindcustomer | prospect | supplier | otherprospect = dado de alta en borrador, falta completar su expediente fiscal.
statusactive | inactive | archived
rfctexto | null
external_customer_codetexto | nullClave del cliente en otro sistema (ERP, CRM), si la integración la guarda.
sourcetextoDe dónde llegó el cliente: manual, registro_import, odoo_import, api_import.
created_attextoAlta (ISO 8601).
updated_attextoÚltima modificación (ISO 8601).

GET /customers/{id}/locations

Ubicaciones de un cliente · alcance customers:read · MCP list_customer_locations · customers.locations

Sucursales y plantas del cliente, con dirección, coordenadas y cómo entrar. serviceable=false marca domicilios fiscales u oficinas a donde no se manda técnico.

Parámetros

NombreDóndeTipoRequeridoDescripción
idrutauuidsíIdentificador del cliente.
limitconsultaenteronoCuántos registros devolver (1–200).
cursorconsultatextonoValor meta.next_cursor de la respuesta anterior para pedir la página siguiente.

Ejemplo

curl "https://api.kargo.mx/v1/customers/<id>/locations?limit=50" \
  -H "Authorization: Bearer $KARGO_API_KEY"

Respuesta — Cada elemento de data

CampoTipoDescripción
iduuid
nametextoNombre de la ubicación: «Planta Industrial», «Sur Culiacán».
location_typetexto | null
formatted_addresstexto | null
streettexto | null
neighborhoodtexto | null
citytexto | null
statetexto | null
postal_codetexto | null
latitudenúmero | null
longitudenúmero | null
contact_nametexto | null
contact_phonetexto | nullFormato E.164: +526671234567.
access_notestexto | nullCómo entrar: caseta, horario, a quién preguntar.
access_hourstexto | null
is_primarybooleano
serviceablebooleanofalse = domicilio fiscal u oficina: el taller no manda técnicos ahí.
statustexto

Equipos

GET /equipment

Listar equipos · alcance equipment:read · MCP list_equipment · equipment.list

Equipos de clientes y del taller. q busca por número económico, serie, marca o modelo.

Parámetros

NombreDóndeTipoRequeridoDescripción
limitconsultaenteronoCuántos registros devolver (1–200).
cursorconsultatextonoValor meta.next_cursor de la respuesta anterior para pedir la página siguiente.
updated_sinceconsultafecha y hora (ISO 8601)noSólo registros modificados desde esa fecha (ISO 8601). Con este filtro el orden es por modificación ascendente: es la forma de sincronizar cambios sin repasar todo.
qconsultatextonoNúmero económico, serie, marca o modelo.
customer_idconsultauuidnoSólo los equipos de ese cliente.
statusconsultaactive | inactive | archivedno
owner_typeconsultatenant | customernotenant = flotilla propia del taller.

Ejemplo

curl "https://api.kargo.mx/v1/equipment?limit=50" \
  -H "Authorization: Bearer $KARGO_API_KEY"

Respuesta — Cada elemento de data

CampoTipoDescripción
iduuid
internal_numbertextoNúmero económico. Único por cliente y ubicación, no por taller.
customer_iduuid | nullnull = equipo propio del taller.
owner_typetenant | customer
manufacturertexto | null
modeltexto | null
serial_numbertexto | null
equipment_typetexto | nullforklift, reach_truck, pallet_stacker...
power_sourcetexto | nulllpg, diesel, gasoline, electric, dual, other.
model_yearnúmero | null
capacity_lbnúmero | null
meter_typetexto | null
statusactive | inactive | archived
location_iduuid | null
locationtexto | nullDónde está DENTRO de su ubicación: nave, andén, bodega.
next_service_hoursnúmero | nullHorómetro en el que toca el siguiente servicio preventivo.
last_service_hoursnúmero | null
last_service_attexto | null
created_attextoAlta (ISO 8601).
updated_attextoÚltima modificación (ISO 8601).

GET /equipment/{id}

Consultar un equipo · alcance equipment:read · MCP get_equipment · equipment.get

Ficha del equipo con su cliente y la última lectura del horómetro.

Parámetros

NombreDóndeTipoRequeridoDescripción
idrutauuidsíIdentificador del equipo.

Ejemplo

curl "https://api.kargo.mx/v1/equipment/<id>" \
  -H "Authorization: Bearer $KARGO_API_KEY"

Respuesta — data

CampoTipoDescripción
iduuid
internal_numbertextoNúmero económico. Único por cliente y ubicación, no por taller.
customer_iduuid | nullnull = equipo propio del taller.
owner_typetenant | customer
manufacturertexto | null
modeltexto | null
serial_numbertexto | null
equipment_typetexto | nullforklift, reach_truck, pallet_stacker...
power_sourcetexto | nulllpg, diesel, gasoline, electric, dual, other.
model_yearnúmero | null
capacity_lbnúmero | null
meter_typetexto | null
statusactive | inactive | archived
location_iduuid | null
locationtexto | nullDónde está DENTRO de su ubicación: nave, andén, bodega.
next_service_hoursnúmero | nullHorómetro en el que toca el siguiente servicio preventivo.
last_service_hoursnúmero | null
last_service_attexto | null
created_attextoAlta (ISO 8601).
updated_attextoÚltima modificación (ISO 8601).
customerobjeto | null
latest_hour_meterobjeto | null

GET /equipment/{id}/hour-meter-readings

Historial del horómetro · alcance equipment:read · MCP list_hour_meter_readings · equipment.hour_meter_readings

Lecturas del horómetro, la más reciente primero. No incluye las anuladas.

Parámetros

NombreDóndeTipoRequeridoDescripción
idrutauuidsíIdentificador del equipo.
limitconsultaenteronoCuántos registros devolver (1–200).
cursorconsultatextonoValor meta.next_cursor de la respuesta anterior para pedir la página siguiente.

Ejemplo

curl "https://api.kargo.mx/v1/equipment/<id>/hour-meter-readings?limit=50" \
  -H "Authorization: Bearer $KARGO_API_KEY"

Respuesta — Cada elemento de data

CampoTipoDescripción
iduuid
equipment_iduuid
reading_hoursnúmeroHoras que marcaba el horómetro.
previous_reading_hoursnúmero | null
hours_deltanúmero | nullHoras trabajadas desde la lectura anterior.
captured_attextoMomento de la captura (ISO 8601).
sourcetexto | null
is_anomalybooleanotrue = la lectura retrocede o salta de forma inexplicable.

Solicitudes

GET /service-requests

Listar solicitudes de servicio · alcance requests:read · MCP list_service_requests · service_requests.list

Lo que han pedido los clientes, lo más reciente primero. Cada solicitud trae el cliente y el equipo en customer y equipment.

Parámetros

NombreDóndeTipoRequeridoDescripción
limitconsultaenteronoCuántos registros devolver (1–200).
cursorconsultatextonoValor meta.next_cursor de la respuesta anterior para pedir la página siguiente.
updated_sinceconsultafecha y hora (ISO 8601)noSólo registros modificados desde esa fecha (ISO 8601). Con este filtro el orden es por modificación ascendente: es la forma de sincronizar cambios sin repasar todo.
statusconsultanew | triage | scheduled | quoted | converted | cancelledno
customer_idconsultauuidno
equipment_idconsultauuidno

Ejemplo

curl "https://api.kargo.mx/v1/service-requests?limit=50" \
  -H "Authorization: Bearer $KARGO_API_KEY"

Respuesta — Cada elemento de data

CampoTipoDescripción
iduuid
numbertextoFolio SOL-AAAAMMDD-NNNN.
request_typerepair | preventive | inspection | visit | quote | other
statusnew | triage | scheduled | quoted | converted | cancelledLo mueve la base, no el cliente de la API: converted aparece cuando se abre la orden.
prioritylow | normal | high | urgent
channeltexto | nullwhatsapp, phone, email, portal, in_person, advisor, recurring, system.
descriptiontexto
customer_iduuid | null
equipment_iduuid | null
location_iduuid | null
contact_nametexto | null
contact_phonetexto | null
scheduled_attexto | nullFecha acordada con el cliente (compromiso comercial, no el plan interno del taller).
requested_attextoCuándo la pidió el cliente (ISO 8601).
created_attextoAlta (ISO 8601).
updated_attextoÚltima modificación (ISO 8601).

GET /service-requests/{id}

Consultar una solicitud · alcance requests:read · MCP get_service_request · service_requests.get

Consultar una solicitud

Parámetros

NombreDóndeTipoRequeridoDescripción
idrutauuidsí

Ejemplo

curl "https://api.kargo.mx/v1/service-requests/<id>" \
  -H "Authorization: Bearer $KARGO_API_KEY"

Respuesta — data

CampoTipoDescripción
iduuid
numbertextoFolio SOL-AAAAMMDD-NNNN.
request_typerepair | preventive | inspection | visit | quote | other
statusnew | triage | scheduled | quoted | converted | cancelledLo mueve la base, no el cliente de la API: converted aparece cuando se abre la orden.
prioritylow | normal | high | urgent
channeltexto | nullwhatsapp, phone, email, portal, in_person, advisor, recurring, system.
descriptiontexto
customer_iduuid | null
equipment_iduuid | null
location_iduuid | null
contact_nametexto | null
contact_phonetexto | null
scheduled_attexto | nullFecha acordada con el cliente (compromiso comercial, no el plan interno del taller).
requested_attextoCuándo la pidió el cliente (ISO 8601).
created_attextoAlta (ISO 8601).
updated_attextoÚltima modificación (ISO 8601).

POST /service-requests

Registrar una solicitud de servicio · alcance requests:write · MCP create_service_request · service_requests.create

Registra lo que pide un cliente. Todo servicio empieza aquí: de la solicitud se deriva después la visita, el preventivo o la orden. El folio SOL-… lo asigna la base. Con Idempotency-Key un reintento devuelve la misma solicitud en vez de crear otra. No hace falta conocer el equipo: puede registrarse sólo con la descripción y completarse después.

Cuerpo (JSON)

CampoTipoRequeridoDescripción
descriptiontextosíQué reporta el cliente, en sus palabras.
request_typerepair | preventive | inspection | visit | quote | otherno
prioritylow | normal | high | urgentno
channelwhatsapp | phone | email | portal | in_person | systemnoPor dónde llegó la solicitud.
customer_iduuidno
equipment_iduuidno
location_iduuidnoUbicación del cliente donde está el equipo.
contact_nametextonoCon quién hablar.
contact_phonetextonoTeléfono en formato E.164.
scheduled_atfecha y hora (ISO 8601)noFecha que el cliente y el taller acordaron, si la hay.

Ejemplo

curl -X POST "https://api.kargo.mx/v1/service-requests" \
  -H "Authorization: Bearer $KARGO_API_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: $(uuidgen)" \
  -d '{ "description": "Falla en frenos, el montacargas no frena en pendiente" }'

Respuesta — data

CampoTipoDescripción
iduuid
numbertextoFolio SOL-AAAAMMDD-NNNN.
request_typerepair | preventive | inspection | visit | quote | other
statusnew | triage | scheduled | quoted | converted | cancelledLo mueve la base, no el cliente de la API: converted aparece cuando se abre la orden.
prioritylow | normal | high | urgent
channeltexto | nullwhatsapp, phone, email, portal, in_person, advisor, recurring, system.
descriptiontexto
customer_iduuid | null
equipment_iduuid | null
location_iduuid | null
contact_nametexto | null
contact_phonetexto | null
scheduled_attexto | nullFecha acordada con el cliente (compromiso comercial, no el plan interno del taller).
requested_attextoCuándo la pidió el cliente (ISO 8601).
created_attextoAlta (ISO 8601).
updated_attextoÚltima modificación (ISO 8601).

Órdenes de trabajo

GET /service-orders

Listar órdenes de trabajo · alcance orders:read · MCP list_service_orders · service_orders.list

Órdenes de trabajo, la más reciente primero. Cada una trae el cliente y el equipo en customer y equipment.

Parámetros

NombreDóndeTipoRequeridoDescripción
limitconsultaenteronoCuántos registros devolver (1–200).
cursorconsultatextonoValor meta.next_cursor de la respuesta anterior para pedir la página siguiente.
updated_sinceconsultafecha y hora (ISO 8601)noSólo registros modificados desde esa fecha (ISO 8601). Con este filtro el orden es por modificación ascendente: es la forma de sincronizar cambios sin repasar todo.
statusconsultaopen | assigned | in_progress | on_hold | testing | completed | cancelledno
order_kindconsultadiagnostic | repair | preventive | internal | warrantyno
customer_idconsultauuidno
equipment_idconsultauuidno
assigned_toconsultauuidnouser_id del técnico. Ver GET /technicians.
scheduled_fromconsultafecha (AAAA-MM-DD)noProgramadas desde ese día (AAAA-MM-DD), inclusive.
scheduled_toconsultafecha (AAAA-MM-DD)noProgramadas hasta ese día, inclusive.

Ejemplo

curl "https://api.kargo.mx/v1/service-orders?limit=50" \
  -H "Authorization: Bearer $KARGO_API_KEY"

Respuesta — Cada elemento de data

CampoTipoDescripción
iduuid
numbertextoFolio OT-AAAAMMDD-NNNN. Hereda el de su solicitud cuando nace de una.
statusopen | assigned | in_progress | on_hold | testing | completed | cancelled
prioritylow | normal | high | urgent
order_kinddiagnostic | repair | preventive | internal | warrantydiagnostic = visita a revisar; repair = trabajo ya autorizado.
origin_kindtextoQué la originó: request, quote_authorized, contract, preventive_plan, warranty, internal, emergency.
descriptiontexto | null
customer_iduuid | null
equipment_iduuid | null
request_iduuid | null
assigned_touuid | nulluser_id del técnico. Ver GET /technicians.
scheduled_datetexto | nullDía planeado (AAAA-MM-DD). null = en el backlog sin programar.
scheduled_blockmorning | afternoon | all_day | null
estimated_hoursnúmero | null
promised_datetexto | nullFecha prometida al cliente.
service_locationtexto | null
location_iduuid | null
site_addresstexto | null
blocked_reasontexto | nullSi está on_hold: por qué (esperando refacción, al cliente, a un proveedor...).
started_attexto | null
completed_attexto | null
created_attextoAlta (ISO 8601).
updated_attextoÚltima modificación (ISO 8601).

GET /service-orders/{id}

Consultar una orden de trabajo · alcance orders:read · MCP get_service_order · service_orders.get

Consultar una orden de trabajo

Parámetros

NombreDóndeTipoRequeridoDescripción
idrutauuidsí

Ejemplo

curl "https://api.kargo.mx/v1/service-orders/<id>" \
  -H "Authorization: Bearer $KARGO_API_KEY"

Respuesta — data

CampoTipoDescripción
iduuid
numbertextoFolio OT-AAAAMMDD-NNNN. Hereda el de su solicitud cuando nace de una.
statusopen | assigned | in_progress | on_hold | testing | completed | cancelled
prioritylow | normal | high | urgent
order_kinddiagnostic | repair | preventive | internal | warrantydiagnostic = visita a revisar; repair = trabajo ya autorizado.
origin_kindtextoQué la originó: request, quote_authorized, contract, preventive_plan, warranty, internal, emergency.
descriptiontexto | null
customer_iduuid | null
equipment_iduuid | null
request_iduuid | null
assigned_touuid | nulluser_id del técnico. Ver GET /technicians.
scheduled_datetexto | nullDía planeado (AAAA-MM-DD). null = en el backlog sin programar.
scheduled_blockmorning | afternoon | all_day | null
estimated_hoursnúmero | null
promised_datetexto | nullFecha prometida al cliente.
service_locationtexto | null
location_iduuid | null
site_addresstexto | null
blocked_reasontexto | nullSi está on_hold: por qué (esperando refacción, al cliente, a un proveedor...).
started_attexto | null
completed_attexto | null
created_attextoAlta (ISO 8601).
updated_attextoÚltima modificación (ISO 8601).

POST /service-orders

Abrir una orden de trabajo · alcance orders:write · sensible: bloqueada para credenciales agent · MCP open_service_order · service_orders.create

Abre una orden para un equipo. Por omisión es una visita de diagnóstico: la orden de reparación nace después, cuando el cliente autoriza una cotización. El folio OT-… lo asigna la base. Compromete al taller con el cliente, por eso una credencial de tipo agent no puede ejecutarla.

Cuerpo (JSON)

CampoTipoRequeridoDescripción
equipment_iduuidsíEquipo al que se le abre la orden. Tiene que pertenecer al taller y estar activo.
descriptiontextosíQué se va a hacer o qué se reportó.
prioritylow | normal | high | urgentno
order_kinddiagnostic | repair | preventive | internal | warrantyno
origin_kindrequest | internal | emergencynoemergency exige authorization_note.
authorization_notetextonoQuién autorizó una emergencia y por qué.
location_iduuidnoUbicación donde se hará el trabajo. Tiene que ser atendible.

Ejemplo

curl -X POST "https://api.kargo.mx/v1/service-orders" \
  -H "Authorization: Bearer $KARGO_API_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: $(uuidgen)" \
  -d '{ "equipment_id": "<uuid>", "description": "Falla en frenos, el montacargas no frena en pendiente" }'

Respuesta — data

CampoTipoDescripción
iduuid
numbertextoFolio OT-AAAAMMDD-NNNN. Hereda el de su solicitud cuando nace de una.
statusopen | assigned | in_progress | on_hold | testing | completed | cancelled
prioritylow | normal | high | urgent
order_kinddiagnostic | repair | preventive | internal | warrantydiagnostic = visita a revisar; repair = trabajo ya autorizado.
origin_kindtextoQué la originó: request, quote_authorized, contract, preventive_plan, warranty, internal, emergency.
descriptiontexto | null
customer_iduuid | null
equipment_iduuid | null
request_iduuid | null
assigned_touuid | nulluser_id del técnico. Ver GET /technicians.
scheduled_datetexto | nullDía planeado (AAAA-MM-DD). null = en el backlog sin programar.
scheduled_blockmorning | afternoon | all_day | null
estimated_hoursnúmero | null
promised_datetexto | nullFecha prometida al cliente.
service_locationtexto | null
location_iduuid | null
site_addresstexto | null
blocked_reasontexto | nullSi está on_hold: por qué (esperando refacción, al cliente, a un proveedor...).
started_attexto | null
completed_attexto | null
created_attextoAlta (ISO 8601).
updated_attextoÚltima modificación (ISO 8601).

POST /service-orders/{id}/schedule

Programar o reasignar una orden · alcance orders:write · sensible: bloqueada para credenciales agent · MCP schedule_service_order · service_orders.schedule

Mueve la orden en la agenda: día, turno y técnico, en una sola operación. scheduled_date es obligatorio: null la manda al backlog (sin programar). assigned_to ausente deja al técnico como está, null lo quita y un user_id lo asigna (el estado pasa solo de open a assigned). Manda expected_updated_at con el updated_at que leíste para no pisar un cambio de alguien más: si cambió, responde 409 order_changed_elsewhere. Una orden cerrada o cancelada no se reprograma.

Parámetros

NombreDóndeTipoRequeridoDescripción
idrutauuidsí

Cuerpo (JSON)

CampoTipoRequeridoDescripción
scheduled_datefecha (AAAA-MM-DD) | nullsíDía (AAAA-MM-DD) o null para mandarla al backlog.
scheduled_blockmorning | afternoon | all_daynoTurno. Si no lo mandas se conserva el actual.
assigned_touuid | nullnouser_id del técnico, null para quitarlo, ausente para no tocarlo.
expected_updated_atfecha y hora (ISO 8601)noupdated_at que leíste: si la orden cambió desde entonces, se rechaza.

Ejemplo

curl -X POST "https://api.kargo.mx/v1/service-orders/<id>/schedule" \
  -H "Authorization: Bearer $KARGO_API_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: $(uuidgen)" \
  -d '{ "scheduled_date": "2026-11-10" }'

Respuesta — data

CampoTipoDescripción
iduuid
numbertextoFolio OT-AAAAMMDD-NNNN. Hereda el de su solicitud cuando nace de una.
statusopen | assigned | in_progress | on_hold | testing | completed | cancelled
prioritylow | normal | high | urgent
order_kinddiagnostic | repair | preventive | internal | warrantydiagnostic = visita a revisar; repair = trabajo ya autorizado.
origin_kindtextoQué la originó: request, quote_authorized, contract, preventive_plan, warranty, internal, emergency.
descriptiontexto | null
customer_iduuid | null
equipment_iduuid | null
request_iduuid | null
assigned_touuid | nulluser_id del técnico. Ver GET /technicians.
scheduled_datetexto | nullDía planeado (AAAA-MM-DD). null = en el backlog sin programar.
scheduled_blockmorning | afternoon | all_day | null
estimated_hoursnúmero | null
promised_datetexto | nullFecha prometida al cliente.
service_locationtexto | null
location_iduuid | null
site_addresstexto | null
blocked_reasontexto | nullSi está on_hold: por qué (esperando refacción, al cliente, a un proveedor...).
started_attexto | null
completed_attexto | null
created_attextoAlta (ISO 8601).
updated_attextoÚltima modificación (ISO 8601).

Disponibilidad

GET /technicians

Listar técnicos asignables · alcance orders:read · MCP list_technicians · technicians.list

Mecánicos y jefes de taller a quienes se les puede asignar una orden. El id es el valor de assigned_to.

Ejemplo

curl "https://api.kargo.mx/v1/technicians" \
  -H "Authorization: Bearer $KARGO_API_KEY"

Respuesta — Cada elemento de data

CampoTipoDescripción
iduuiduser_id: el valor que recibe assigned_to.
nametexto
roletextomechanic, mechanic_trainee o workshop_manager.

GET /availability/technicians

Carga de los técnicos en un día · alcance orders:read · MCP technician_availability · availability.technicians

Cuántas órdenes abiertas y cuántas horas estimadas tiene cada técnico ese día. Sirve para decidir a quién asignarle algo sin abrir la agenda. Una orden sin horas estimadas cuenta como 0 h, así que estimated_hours es un piso, no un total garantizado.

Parámetros

NombreDóndeTipoRequeridoDescripción
dateconsultafecha (AAAA-MM-DD)noDía a consultar (AAAA-MM-DD). Por omisión, hoy en Culiacán.

Ejemplo

curl "https://api.kargo.mx/v1/availability/technicians" \
  -H "Authorization: Bearer $KARGO_API_KEY"

Respuesta — Cada elemento de data

CampoTipoDescripción
iduuiduser_id: el valor que recibe assigned_to.
nametexto
roletextomechanic, mechanic_trainee o workshop_manager.
datetexto
orders_countnúmeroÓrdenes programadas ese día y todavía abiertas.
estimated_hoursnúmeroSuma de horas estimadas de esas órdenes (las que no traen estimado cuentan 0).
orderslista de objeto

GET /availability/fleet

Disponibilidad de la flotilla propia · alcance fleet:read · MCP fleet_availability · availability.fleet

Equipos propios del taller con su etapa: disponible, rentado, en revisión, en reparación, en tránsito, de baja o vendido. Sin precios ni datos del cliente. Si está rentado, contract_end dice cuándo regresa.

Parámetros

NombreDóndeTipoRequeridoDescripción
stageconsultaavailable | rented | in_review | repair | in_transit | retired | soldno
for_rentconsultatrue | falsenotrue = sólo los que se ofrecen en renta.
limitconsultaenteronoCuántos registros devolver (1–200).
cursorconsultatextonoValor meta.next_cursor de la respuesta anterior para pedir la página siguiente.

Ejemplo

curl "https://api.kargo.mx/v1/availability/fleet?limit=50" \
  -H "Authorization: Bearer $KARGO_API_KEY"

Respuesta — Cada elemento de data

CampoTipoDescripción
equipment_iduuid
internal_numbertexto
manufacturertexto | null
modeltexto | null
serial_numbertexto | null
equipment_typetexto | null
power_sourcetexto | null
capacity_lbnúmero | null
stageavailable | rented | in_review | repair | in_transit | retired | sold
for_rentbooleano
for_salebooleano
reservedbooleanotrue = apartado para un cliente aunque todavía esté en patio.
contract_endtexto | nullSi está rentado: cuándo vence la renta.
inbound_etatexto | nullSi viene en camino: fecha estimada de llegada.

Inspecciones

GET /inspections

Listar inspecciones · alcance inspections:read · MCP list_inspections · inspections.list

Revisiones de equipos, la más reciente primero. Cada una trae el cliente y el equipo.

Parámetros

NombreDóndeTipoRequeridoDescripción
limitconsultaenteronoCuántos registros devolver (1–200).
cursorconsultatextonoValor meta.next_cursor de la respuesta anterior para pedir la página siguiente.
updated_sinceconsultafecha y hora (ISO 8601)noSólo registros modificados desde esa fecha (ISO 8601). Con este filtro el orden es por modificación ascendente: es la forma de sincronizar cambios sin repasar todo.
statusconsultaopen | closed | cancelledno
equipment_idconsultauuidno
customer_idconsultauuidno
service_order_idconsultauuidno

Ejemplo

curl "https://api.kargo.mx/v1/inspections?limit=50" \
  -H "Authorization: Bearer $KARGO_API_KEY"

Respuesta — Cada elemento de data

CampoTipoDescripción
iduuid
numbertexto | null
statusopen | closed | cancelled
inspection_typetexto | null
operation_typetexto | null
location_kindworkshop | field | null
equipment_iduuid | null
customer_iduuid | null
service_order_iduuid | null
request_iduuid | null
reported_failure_notetexto | nullLo que reportó el cliente.
summary_notetexto | null
site_addresstexto | null
started_attexto | null
closed_attexto | null
approved_attexto | null
created_attextoAlta (ISO 8601).
updated_attextoÚltima modificación (ISO 8601).

GET /inspections/{id}

Consultar una inspección con sus hallazgos · alcance inspections:read · MCP get_inspection · inspections.get

La inspección y sus hallazgos, con severidad (urgent / recommended), qué se encontró, qué se recomienda y qué pasa si no se corrige.

Parámetros

NombreDóndeTipoRequeridoDescripción
idrutauuidsí

Ejemplo

curl "https://api.kargo.mx/v1/inspections/<id>" \
  -H "Authorization: Bearer $KARGO_API_KEY"

Respuesta — data

CampoTipoDescripción
iduuid
numbertexto | null
statusopen | closed | cancelled
inspection_typetexto | null
operation_typetexto | null
location_kindworkshop | field | null
equipment_iduuid | null
customer_iduuid | null
service_order_iduuid | null
request_iduuid | null
reported_failure_notetexto | nullLo que reportó el cliente.
summary_notetexto | null
site_addresstexto | null
started_attexto | null
closed_attexto | null
approved_attexto | null
created_attextoAlta (ISO 8601).
updated_attextoÚltima modificación (ISO 8601).
findingslista de objeto

Cotizaciones

GET /quotes

Listar cotizaciones · alcance quotes:read · MCP list_quotes · quotes.list

Cotizaciones con los totales de su versión vigente en current. Incluye importes: sólo para credenciales que deban verlos.

Parámetros

NombreDóndeTipoRequeridoDescripción
limitconsultaenteronoCuántos registros devolver (1–200).
cursorconsultatextonoValor meta.next_cursor de la respuesta anterior para pedir la página siguiente.
updated_sinceconsultafecha y hora (ISO 8601)noSólo registros modificados desde esa fecha (ISO 8601). Con este filtro el orden es por modificación ascendente: es la forma de sincronizar cambios sin repasar todo.
statusconsultadraft | shared | partially_authorized | authorized | declined | expired | cancelledno
customer_idconsultauuidno
service_order_idconsultauuidno

Ejemplo

curl "https://api.kargo.mx/v1/quotes?limit=50" \
  -H "Authorization: Bearer $KARGO_API_KEY"

Respuesta — Cada elemento de data

CampoTipoDescripción
iduuid
numbertextoFolio COT-AAAAMMDD-NNNN.
kindservice | parts | mixed
statusdraft | shared | partially_authorized | authorized | declined | expired | cancelled
customer_iduuid | null
equipment_iduuid | null
service_order_iduuid | null
inspection_iduuid | null
current_versionnúmero
currency_codetexto
notestexto | null
created_attextoAlta (ISO 8601).
updated_attextoÚltima modificación (ISO 8601).
currentobjeto | null

GET /quotes/{id}

Consultar una cotización · alcance quotes:read · MCP get_quote · quotes.get

La cotización con los totales de su versión vigente y el historial de versiones.

Parámetros

NombreDóndeTipoRequeridoDescripción
idrutauuidsí

Ejemplo

curl "https://api.kargo.mx/v1/quotes/<id>" \
  -H "Authorization: Bearer $KARGO_API_KEY"

Respuesta — data

CampoTipoDescripción
iduuid
numbertextoFolio COT-AAAAMMDD-NNNN.
kindservice | parts | mixed
statusdraft | shared | partially_authorized | authorized | declined | expired | cancelled
customer_iduuid | null
equipment_iduuid | null
service_order_iduuid | null
inspection_iduuid | null
current_versionnúmero
currency_codetexto
notestexto | null
created_attextoAlta (ISO 8601).
updated_attextoÚltima modificación (ISO 8601).
currentobjeto | null
versionslista de objeto

Mantenimiento preventivo

GET /preventive/forecasts

Pronóstico de mantenimiento preventivo · alcance preventive:read · MCP list_preventive_forecasts · preventive.list

Un renglón por equipo en seguimiento: cuándo le toca su siguiente servicio y qué se decidió con el aviso. El sistema detecta; una persona decide. Los más urgentes salen primero.

Parámetros

NombreDóndeTipoRequeridoDescripción
limitconsultaenteronoCuántos registros devolver (1–200).
cursorconsultatextonoValor meta.next_cursor de la respuesta anterior para pedir la página siguiente.
statusconsultaok | soon | overdue | lost | no_data | no_baselinenoPronóstico del equipo.
alert_statusconsultapending | scheduled | postponed | done | dismissednoQué se decidió con el aviso.
customer_idconsultauuidno
equipment_idconsultauuidno

Ejemplo

curl "https://api.kargo.mx/v1/preventive/forecasts?limit=50" \
  -H "Authorization: Bearer $KARGO_API_KEY"

Respuesta — Cada elemento de data

CampoTipoDescripción
equipment_iduuid
internal_numbertexto
manufacturertexto | null
modeltexto | null
customer_iduuid | null
customer_nametexto | null
statusok | soon | overdue | lost | no_data | no_baselinePronóstico: overdue = ya pasó la meta; soon = se acerca; lost = seguimiento perdido; no_data y no_baseline = faltan lecturas o meta.
usage_patterncontinuous | seasonal
interval_hoursnúmero | null
target_hoursnúmero | null
last_reading_hoursnúmero | null
last_reading_attexto | null
rate_per_daynúmero | nullHoras de uso por día, según las últimas lecturas.
remaining_hoursnúmero | null
estimated_datetexto | null
days_since_readingnúmero | null
alert_iduuid | nullExiste cuando el aviso ya se generó. Es el {id} de postpone.
alert_kindtexto | null
alert_statuspending | scheduled | postponed | done | dismissed | null
postponed_untiltexto | null
postpone_reasontexto | null
service_order_iduuid | null
order_numbertexto | null
covered_by_workshopbooleanotrue = un contrato vigente incluye el preventivo: corre por cuenta del taller.
computed_attexto | null

POST /preventive/alerts/{id}/postpone

Posponer un aviso de preventivo · alcance preventive:write · sensible: bloqueada para credenciales agent · MCP postpone_preventive_alert · preventive.postpone

Pospone el aviso con motivo y fecha: vuelve a la bandeja ese día. El {id} es el alert_id del pronóstico. Decide cuándo se le da servicio a un equipo, así que una credencial de tipo agent no puede ejecutarla.

Parámetros

NombreDóndeTipoRequeridoDescripción
idrutauuidsíalert_id del pronóstico.

Cuerpo (JSON)

CampoTipoRequeridoDescripción
reasontextosíPor qué se pospone. Queda en la bitácora.
untilfecha (AAAA-MM-DD)síHasta cuándo (AAAA-MM-DD). Tiene que ser una fecha futura.

Ejemplo

curl -X POST "https://api.kargo.mx/v1/preventive/alerts/<id>/postpone" \
  -H "Authorization: Bearer $KARGO_API_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: $(uuidgen)" \
  -d '{ "reason": "Esperando la refacción del cliente", "until": "2026-11-10" }'

Respuesta — data

CampoTipoDescripción
equipment_iduuid
internal_numbertexto
manufacturertexto | null
modeltexto | null
customer_iduuid | null
customer_nametexto | null
statusok | soon | overdue | lost | no_data | no_baselinePronóstico: overdue = ya pasó la meta; soon = se acerca; lost = seguimiento perdido; no_data y no_baseline = faltan lecturas o meta.
usage_patterncontinuous | seasonal
interval_hoursnúmero | null
target_hoursnúmero | null
last_reading_hoursnúmero | null
last_reading_attexto | null
rate_per_daynúmero | nullHoras de uso por día, según las últimas lecturas.
remaining_hoursnúmero | null
estimated_datetexto | null
days_since_readingnúmero | null
alert_iduuid | nullExiste cuando el aviso ya se generó. Es el {id} de postpone.
alert_kindtexto | null
alert_statuspending | scheduled | postponed | done | dismissed | null
postponed_untiltexto | null
postpone_reasontexto | null
service_order_iduuid | null
order_numbertexto | null
covered_by_workshopbooleanotrue = un contrato vigente incluye el preventivo: corre por cuenta del taller.
computed_attexto | null

Refacciones

Buscar refacciones · alcance parts:read · MCP search_parts · parts.search

Busca en el catálogo de la tienda por número de parte, equivalencia o nombre. Encuentra por el número grabado en la pieza aunque sea de otra marca, y dice por cuál campo encontró. Deliberadamente sin precio: el precio depende del cliente y del momento, y se cotiza desde una orden.

Parámetros

NombreDóndeTipoRequeridoDescripción
qconsultatextosíNúmero de parte, equivalencia o nombre de la pieza.
modeconsultatodo | parte | pieza | equiponoparte = número de parte; pieza = nombre; equipo = refacciones de un modelo; todo = cualquiera.
limitconsultaenteronoCuántos resultados (1–20).
with_stockconsultatrue | falsenotrue consulta si hay existencia de cada pieza.

Ejemplo

curl "https://api.kargo.mx/v1/parts/search?q=montacargas&limit=10" \
  -H "Authorization: Bearer $KARGO_API_KEY"

Respuesta — Cada elemento de data

CampoTipoDescripción
product_idtexto
titletexto
skutexto | nullNúmero de parte.
brandtexto | null
thumbnailtexto | null
in_stockbooleano | nullnull = no se pudo determinar.
matched_bycross_reference | sku | name | nullPor qué apareció. cross_reference = equivale al número que se buscó.
matched_referenceobjeto | null