El módulo de fitment resuelve la pregunta "¿este producto aplica a este vehículo?" — típico de refacciones automotrices, donde un mismo SKU puede ser compatible con múltiples combinaciones de marca, modelo, año y submodelo.
La estructura tiene dos niveles:
Catálogo (FitmentCatalog): define la jerarquía de niveles de compatibilidad para tu vertical (por ejemplo, Make → Model → Year). Un catálogo puede marcarse como isDefault.
Nodo (FitmentNode): un valor concreto dentro de un nivel del catálogo (por ejemplo, Make = "Nissan", con un Model hijo "Sentra"). Los nodos forman un árbol vía parentId/parentLevel.
Un producto se asocia a combinaciones de nodos mediante fitmentConfig (dentro del payload del producto — ver Actualizar un producto); este dominio expone los endpoints para administrar catálogos/nodos y para consultar compatibilidad (search, check).
Shape de `dimensions[]` no verificado campo a campo
Los endpoints de búsqueda y verificación de compatibilidad (/fitment/search, /fitment/check/{sku}) reciben un arreglo dimensions[] que referencia niveles y valores del catálogo, pero la auditoría no confirmó la forma exacta de cada elemento del arreglo. Confírmala contra una respuesta real de GET /products/fitment/catalogs/{id}/nodes (los mismos level/value que devuelve ese endpoint son los que se usan para construir dimensions[]) antes de integrar.
{ "code": "bad-request", "message": "Level orders must be sequential starting from 0" }
Permiso requerido:products:create
Actualiza un catálogo (parcial)
catalogIdstringrequired
ID del catálogo.
namestring
Nuevo nombre.
levelsarray
Reemplaza los niveles. Debe incluir al menos uno.
isDefaultboolean
Marca/desmarca como catálogo predeterminado.
{ "name": "Refacciones automotrices MX y CA", "isDefault": true }
404
{ "code": "not-found", "message": "Fitment catalog not found" }
400
{ "code": "bad-request", "message": "At least one level is required" }
Permiso requerido:products:read
RBAC: este endpoint de escritura pide READ, no UPDATE
A diferencia del resto de las operaciones de escritura de este dominio, PUT /products/fitment/catalogs/{catalogId} está gateado con el permiso products:read en el código fuente auditado, sin un permiso products:update adicional. Es una inconsistencia de RBAC confirmada en el código, no un error de esta documentación — repórtala a soporte si tu integración depende de separar lectura y escritura de catálogos por rol.
[ { "sku": "REF-PASTILLA-FRENO-01", "title": "Juego de pastillas de freno delanteras", "matchScore": 1 }]
400
{ "code": "bad-request", "message": "Catalog ID is required" }
Permiso requerido: ninguno adicional — solo autenticación (Authorization válido y tenantId resuelto). No se confirmó un requirePermission() explícito para este endpoint más allá del gate estándar por método HTTP.
Verifica si un producto específico es compatible con una combinación de dimensiones
{ "code": "not-found", "message": "Product REF-PASTILLA-FRENO-01 not found" }
Permiso requerido: mismo caso que /fitment/search — sin requirePermission() explícito adicional, solo autenticación.
Shape de respuesta parcialmente verificado
isCompatible y matchScore en POST /products/fitment/check/{sku} están confirmados; campos adicionales que la respuesta pudiera incluir (por ejemplo, el detalle de qué dimensión no coincidió) no fueron verificados campo a campo.
Campo requerido faltante o inválido (nombre/tipo/niveles del catálogo, niveles duplicados o no consecutivos, jerarquía de nodo inconsistente), falta un parámetro de consulta requerido (level, q), o data viene vacío en la importación.
not-found
404
No existe el catálogo, nodo o producto solicitado.
auth:invalid_token
401
La API key es inválida o fue revocada.
auth:permission_denied
403
La API key no tiene el permiso requerido para esta operación.