{"openapi":"3.0.0","paths":{"/health":{"get":{"description":"Estado detallado, dependencia por dependencia","operationId":"HealthController_check","parameters":[],"responses":{"200":{"description":"Health status","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HealthCheckDto"}}}},"503":{"description":"Postgres o Redis no disponibles","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HealthCheckDto"}}}}},"summary":"Full health check","tags":["Health"]}},"/health/ready":{"get":{"description":"¿Puede el servicio atender tráfico?","operationId":"HealthController_ready","parameters":[],"responses":{"200":{"description":"Service is ready"},"503":{"description":"Postgres o Redis no disponibles"}},"summary":"Readiness probe","tags":["Health"]}},"/health/live":{"get":{"description":"No toca dependencias: solo dice si el proceso está vivo","operationId":"HealthController_live","parameters":[],"responses":{"200":{"description":"Service is alive"}},"summary":"Liveness probe","tags":["Health"]}},"/api/Security/GetGraphXServerAPIToken":{"post":{"operationId":"SecurityController_getGraphXServerAPIToken","parameters":[],"responses":{"200":{"description":""}},"summary":"Emite un token a partir de credenciales legacy (deprecado)","tags":["Legacy V1 - Security"]}},"/api/ProductMockupRequest/GetProductListForCustomer":{"get":{"operationId":"ProductMockupRequestController_getProductListForCustomer","parameters":[{"name":"CustomerName","required":true,"in":"query","schema":{"type":"string"}},{"name":"Page","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Lista paginada de productos del cliente","tags":["Legacy V1 - Product Mockup Request"]}},"/api/ProductMockupRequest/GetProductPartsByProductID":{"post":{"operationId":"ProductMockupRequestController_getProductPartsByProductID","parameters":[],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Partes de un producto","tags":["Legacy V1 - Product Mockup Request"]}},"/api/ProductMockupRequest/GetProductPartDetails":{"get":{"operationId":"ProductMockupRequestController_getProductPartDetails","parameters":[{"name":"ProductPartId","required":true,"in":"query","schema":{"type":"string"}},{"name":"supplierId","required":true,"in":"query","schema":{"type":"string"}},{"name":"CompanyName","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Detalle de una parte de producto","tags":["Legacy V1 - Product Mockup Request"]}},"/api/ProductMockupRequest/GetProductViews":{"get":{"operationId":"ProductMockupRequestController_getProductViews","parameters":[{"name":"ProductPartId","required":true,"in":"query","schema":{"type":"string"}},{"name":"supplierId","required":true,"in":"query","schema":{"type":"string"}},{"name":"CompanyName","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Vistas de una parte de producto","tags":["Legacy V1 - Product Mockup Request"]}},"/api/ProductMockupRequest/GetProductViewSpecs":{"post":{"operationId":"ProductMockupRequestController_getProductViewSpecs","parameters":[],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Geometría de las vistas pedidas","tags":["Legacy V1 - Product Mockup Request"]}},"/api/ProductMockupRequest/GetMappedSupplierLocationsForProduct":{"get":{"operationId":"ProductMockupRequestController_getMappedSupplierLocationsForProduct","parameters":[{"name":"ProductId","required":true,"in":"query","schema":{"type":"string"}},{"name":"supplierId","required":true,"in":"query","schema":{"type":"string"}},{"name":"companyname","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Locations de proveedor mapeadas por vista","tags":["Legacy V1 - Product Mockup Request"]}},"/api/ProductMockupRequest/GetSuppliersForCompany":{"get":{"operationId":"ProductMockupRequestController_getSuppliersForCompany","parameters":[{"name":"companyname","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Proveedores disponibles para la compañía","tags":["Legacy V1 - Product Mockup Request"]}},"/api/ProductMockupRequest/GetProductMockupRequestExternal":{"post":{"operationId":"ProductMockupRequestController_getProductMockupRequestExternal","parameters":[],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Crea una orden de mockup de vista simple","tags":["Legacy V1 - Product Mockup Request"]}},"/api/ProductMockupRequest/CreateMockupOrderForMultipleViews":{"post":{"operationId":"ProductMockupRequestController_createMockupOrderForMultipleViews","parameters":[],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Crea una orden de mockup multi-vista","tags":["Legacy V1 - Product Mockup Request"]}},"/api/ProductMockupRequest/GetProductMockupRequestStatus":{"post":{"operationId":"ProductMockupRequestController_getProductMockupRequestStatus","parameters":[],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Estado de una orden de mockup","tags":["Legacy V1 - Product Mockup Request"]}},"/api/ProductMockupRequest/GetStatusForMultipleViewMockup":{"post":{"operationId":"ProductMockupRequestController_getStatusForMultipleViewMockup","parameters":[],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Estado de una orden multi-vista, con regeneración","tags":["Legacy V1 - Product Mockup Request"]}},"/api/ProductMockupRequest/GetProductLineMockupRequestExternal":{"post":{"operationId":"ProductMockupRequestController_getProductLineMockupRequestExternal","parameters":[],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Crea una orden de mockup de product line","tags":["Legacy V1 - Product Mockup Request"]}},"/api/ProductMockupRequest/GetProductLineMockupRequestStatus":{"post":{"operationId":"ProductMockupRequestController_getProductLineMockupRequestStatus","parameters":[],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Estado de una orden de mockup de product line","tags":["Legacy V1 - Product Mockup Request"]}},"/api/ProductLine/GetAllProductLines":{"get":{"operationId":"ProductLineController_getAllProductLines","parameters":[{"name":"customerName","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Product lines del cliente","tags":["Legacy V1 - Product Line"]}},"/api/ProductLine/GetAllProductColors":{"get":{"operationId":"ProductLineController_getAllProductColors","parameters":[{"name":"customerName","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Colores base disponibles","tags":["Legacy V1 - Product Line"]}},"/api/ProductLine/create":{"post":{"operationId":"ProductLineController_createProductLine","parameters":[],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Crea una product line (endpoint nuevo en V1)","tags":["Legacy V1 - Product Line"]}},"/api/Product/CreateLocationAlias":{"post":{"operationId":"LocationAliasController_create","parameters":[],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Crea un alias de location (contrato legacy)","tags":["V1 · Location aliases (compat)"]}},"/api/Product/UpdateLocationAlias":{"post":{"operationId":"LocationAliasController_update","parameters":[],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Actualiza alias de locations (contrato legacy)","tags":["V1 · Location aliases (compat)"]}},"/api/Product/DeleteLocationAlias":{"post":{"operationId":"LocationAliasController_remove","parameters":[],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Borra un alias de location (contrato legacy)","tags":["V1 · Location aliases (compat)"]}},"/api/Product/FetchAllLocationAlias":{"get":{"operationId":"LocationAliasController_list","parameters":[{"name":"companyName","required":false,"in":"query","schema":{"example":"PCNA Virtuals","type":"string"}},{"name":"productViewId","required":true,"in":"query","schema":{"example":251872,"type":"number"}},{"name":"locationId","required":true,"in":"query","schema":{"example":25508,"type":"number"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Lista los alias de una location (contrato legacy)","tags":["V1 · Location aliases (compat)"]}},"/v2/product-views/{productViewId}/locations/{locationId}/aliases":{"get":{"operationId":"LocationAliasesController_list","parameters":[{"name":"productViewId","required":true,"in":"path","description":"Id de la vista de producto","schema":{"example":251872,"type":"number"}},{"name":"locationId","required":true,"in":"path","description":"Supplier location id (the `supplierLocationid` of GetMappedSupplierLocationsForProduct)","schema":{"example":25508,"type":"number"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/LocationAliasListResponseDto"}}}},"400":{"description":"`GXS.VALIDATION_FAILED` — Validation failed","content":{"application/problem+json":{"schema":{"type":"object","required":["type","title","status","detail","instance","code","traceId"],"properties":{"type":{"type":"string","format":"uri"},"title":{"type":"string"},"status":{"type":"integer"},"detail":{"type":"string"},"instance":{"type":"string"},"code":{"type":"string"},"traceId":{"type":"string"},"errors":{"type":"array","items":{"type":"object","required":["field","code","message"],"properties":{"field":{"type":"string"},"code":{"type":"string"},"message":{"type":"string"}}}}}},"examples":{"GXS.VALIDATION_FAILED":{"value":{"type":"https://graphxserver.io/problems/validation-failed","title":"Validation failed","status":400,"detail":"Validation failed","instance":"/v2/…","code":"GXS.VALIDATION_FAILED","traceId":"4bf92f3577b34da6a3ce929d0e0e4736"}}}}}},"401":{"description":"`GXS.UNAUTHENTICATED` — Authentication required","content":{"application/problem+json":{"schema":{"type":"object","required":["type","title","status","detail","instance","code","traceId"],"properties":{"type":{"type":"string","format":"uri"},"title":{"type":"string"},"status":{"type":"integer"},"detail":{"type":"string"},"instance":{"type":"string"},"code":{"type":"string"},"traceId":{"type":"string"},"errors":{"type":"array","items":{"type":"object","required":["field","code","message"],"properties":{"field":{"type":"string"},"code":{"type":"string"},"message":{"type":"string"}}}}}},"examples":{"GXS.UNAUTHENTICATED":{"value":{"type":"https://graphxserver.io/problems/unauthenticated","title":"Authentication required","status":401,"detail":"Authentication required","instance":"/v2/…","code":"GXS.UNAUTHENTICATED","traceId":"4bf92f3577b34da6a3ce929d0e0e4736"}}}}}},"403":{"description":"`GXS.FORBIDDEN` — Forbidden","content":{"application/problem+json":{"schema":{"type":"object","required":["type","title","status","detail","instance","code","traceId"],"properties":{"type":{"type":"string","format":"uri"},"title":{"type":"string"},"status":{"type":"integer"},"detail":{"type":"string"},"instance":{"type":"string"},"code":{"type":"string"},"traceId":{"type":"string"},"errors":{"type":"array","items":{"type":"object","required":["field","code","message"],"properties":{"field":{"type":"string"},"code":{"type":"string"},"message":{"type":"string"}}}}}},"examples":{"GXS.FORBIDDEN":{"value":{"type":"https://graphxserver.io/problems/forbidden","title":"Forbidden","status":403,"detail":"Forbidden","instance":"/v2/…","code":"GXS.FORBIDDEN","traceId":"4bf92f3577b34da6a3ce929d0e0e4736"}}}}}},"404":{"description":"`GXSIO.LOCATION_NOT_FOUND` — Location not found","content":{"application/problem+json":{"schema":{"type":"object","required":["type","title","status","detail","instance","code","traceId"],"properties":{"type":{"type":"string","format":"uri"},"title":{"type":"string"},"status":{"type":"integer"},"detail":{"type":"string"},"instance":{"type":"string"},"code":{"type":"string"},"traceId":{"type":"string"},"errors":{"type":"array","items":{"type":"object","required":["field","code","message"],"properties":{"field":{"type":"string"},"code":{"type":"string"},"message":{"type":"string"}}}}}},"examples":{"GXSIO.LOCATION_NOT_FOUND":{"value":{"type":"https://graphxserver.io/problems/gxsio/location-not-found","title":"Location not found","status":404,"detail":"Location not found","instance":"/v2/…","code":"GXSIO.LOCATION_NOT_FOUND","traceId":"4bf92f3577b34da6a3ce929d0e0e4736"}}}}}},"502":{"description":"`GXS.UPSTREAM_FAILED` — Upstream service error","content":{"application/problem+json":{"schema":{"type":"object","required":["type","title","status","detail","instance","code","traceId"],"properties":{"type":{"type":"string","format":"uri"},"title":{"type":"string"},"status":{"type":"integer"},"detail":{"type":"string"},"instance":{"type":"string"},"code":{"type":"string"},"traceId":{"type":"string"},"errors":{"type":"array","items":{"type":"object","required":["field","code","message"],"properties":{"field":{"type":"string"},"code":{"type":"string"},"message":{"type":"string"}}}}}},"examples":{"GXS.UPSTREAM_FAILED":{"value":{"type":"https://graphxserver.io/problems/upstream-failed","title":"Upstream service error","status":502,"detail":"Upstream service error","instance":"/v2/…","code":"GXS.UPSTREAM_FAILED","traceId":"4bf92f3577b34da6a3ce929d0e0e4736"}}}}}}},"security":[{"bearer":[]}],"summary":"Lista los alias de una location","tags":["v2 · Location aliases"]},"post":{"operationId":"LocationAliasesController_create","parameters":[{"name":"productViewId","required":true,"in":"path","description":"Id de la vista de producto","schema":{"example":251872,"type":"number"}},{"name":"locationId","required":true,"in":"path","description":"Supplier location id (the `supplierLocationid` of GetMappedSupplierLocationsForProduct)","schema":{"example":25508,"type":"number"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateLocationAliasDto"}}}},"responses":{"201":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/LocationAliasResponseDto"}}}},"400":{"description":"`GXS.VALIDATION_FAILED` — Validation failed","content":{"application/problem+json":{"schema":{"type":"object","required":["type","title","status","detail","instance","code","traceId"],"properties":{"type":{"type":"string","format":"uri"},"title":{"type":"string"},"status":{"type":"integer"},"detail":{"type":"string"},"instance":{"type":"string"},"code":{"type":"string"},"traceId":{"type":"string"},"errors":{"type":"array","items":{"type":"object","required":["field","code","message"],"properties":{"field":{"type":"string"},"code":{"type":"string"},"message":{"type":"string"}}}}}},"examples":{"GXS.VALIDATION_FAILED":{"value":{"type":"https://graphxserver.io/problems/validation-failed","title":"Validation failed","status":400,"detail":"Validation failed","instance":"/v2/…","code":"GXS.VALIDATION_FAILED","traceId":"4bf92f3577b34da6a3ce929d0e0e4736"}}}}}},"401":{"description":"`GXS.UNAUTHENTICATED` — Authentication required","content":{"application/problem+json":{"schema":{"type":"object","required":["type","title","status","detail","instance","code","traceId"],"properties":{"type":{"type":"string","format":"uri"},"title":{"type":"string"},"status":{"type":"integer"},"detail":{"type":"string"},"instance":{"type":"string"},"code":{"type":"string"},"traceId":{"type":"string"},"errors":{"type":"array","items":{"type":"object","required":["field","code","message"],"properties":{"field":{"type":"string"},"code":{"type":"string"},"message":{"type":"string"}}}}}},"examples":{"GXS.UNAUTHENTICATED":{"value":{"type":"https://graphxserver.io/problems/unauthenticated","title":"Authentication required","status":401,"detail":"Authentication required","instance":"/v2/…","code":"GXS.UNAUTHENTICATED","traceId":"4bf92f3577b34da6a3ce929d0e0e4736"}}}}}},"403":{"description":"`GXS.FORBIDDEN` — Forbidden","content":{"application/problem+json":{"schema":{"type":"object","required":["type","title","status","detail","instance","code","traceId"],"properties":{"type":{"type":"string","format":"uri"},"title":{"type":"string"},"status":{"type":"integer"},"detail":{"type":"string"},"instance":{"type":"string"},"code":{"type":"string"},"traceId":{"type":"string"},"errors":{"type":"array","items":{"type":"object","required":["field","code","message"],"properties":{"field":{"type":"string"},"code":{"type":"string"},"message":{"type":"string"}}}}}},"examples":{"GXS.FORBIDDEN":{"value":{"type":"https://graphxserver.io/problems/forbidden","title":"Forbidden","status":403,"detail":"Forbidden","instance":"/v2/…","code":"GXS.FORBIDDEN","traceId":"4bf92f3577b34da6a3ce929d0e0e4736"}}}}}},"404":{"description":"`GXSIO.LOCATION_NOT_FOUND` — Location not found","content":{"application/problem+json":{"schema":{"type":"object","required":["type","title","status","detail","instance","code","traceId"],"properties":{"type":{"type":"string","format":"uri"},"title":{"type":"string"},"status":{"type":"integer"},"detail":{"type":"string"},"instance":{"type":"string"},"code":{"type":"string"},"traceId":{"type":"string"},"errors":{"type":"array","items":{"type":"object","required":["field","code","message"],"properties":{"field":{"type":"string"},"code":{"type":"string"},"message":{"type":"string"}}}}}},"examples":{"GXSIO.LOCATION_NOT_FOUND":{"value":{"type":"https://graphxserver.io/problems/gxsio/location-not-found","title":"Location not found","status":404,"detail":"Location not found","instance":"/v2/…","code":"GXSIO.LOCATION_NOT_FOUND","traceId":"4bf92f3577b34da6a3ce929d0e0e4736"}}}}}},"409":{"description":"`GXSIO.LOCATION_ALIAS_NAME_CONFLICT` — Location alias name already in use<br>`GXSIO.LOCATION_NAME_TAKEN_ON_MAP` — Location name already used on the product view","content":{"application/problem+json":{"schema":{"type":"object","required":["type","title","status","detail","instance","code","traceId"],"properties":{"type":{"type":"string","format":"uri"},"title":{"type":"string"},"status":{"type":"integer"},"detail":{"type":"string"},"instance":{"type":"string"},"code":{"type":"string"},"traceId":{"type":"string"},"errors":{"type":"array","items":{"type":"object","required":["field","code","message"],"properties":{"field":{"type":"string"},"code":{"type":"string"},"message":{"type":"string"}}}}}},"examples":{"GXSIO.LOCATION_ALIAS_NAME_CONFLICT":{"value":{"type":"https://graphxserver.io/problems/gxsio/location-alias-name-conflict","title":"Location alias name already in use","status":409,"detail":"Location alias name already in use","instance":"/v2/…","code":"GXSIO.LOCATION_ALIAS_NAME_CONFLICT","traceId":"4bf92f3577b34da6a3ce929d0e0e4736"}},"GXSIO.LOCATION_NAME_TAKEN_ON_MAP":{"value":{"type":"https://graphxserver.io/problems/gxsio/location-name-taken-on-map","title":"Location name already used on the product view","status":409,"detail":"Location name already used on the product view","instance":"/v2/…","code":"GXSIO.LOCATION_NAME_TAKEN_ON_MAP","traceId":"4bf92f3577b34da6a3ce929d0e0e4736"}}}}}},"502":{"description":"`GXS.UPSTREAM_FAILED` — Upstream service error","content":{"application/problem+json":{"schema":{"type":"object","required":["type","title","status","detail","instance","code","traceId"],"properties":{"type":{"type":"string","format":"uri"},"title":{"type":"string"},"status":{"type":"integer"},"detail":{"type":"string"},"instance":{"type":"string"},"code":{"type":"string"},"traceId":{"type":"string"},"errors":{"type":"array","items":{"type":"object","required":["field","code","message"],"properties":{"field":{"type":"string"},"code":{"type":"string"},"message":{"type":"string"}}}}}},"examples":{"GXS.UPSTREAM_FAILED":{"value":{"type":"https://graphxserver.io/problems/upstream-failed","title":"Upstream service error","status":502,"detail":"Upstream service error","instance":"/v2/…","code":"GXS.UPSTREAM_FAILED","traceId":"4bf92f3577b34da6a3ce929d0e0e4736"}}}}}}},"security":[{"bearer":[]}],"summary":"Crea un alias para una location","tags":["v2 · Location aliases"]}},"/v2/location-aliases/{id}":{"patch":{"operationId":"LocationAliasesController_update","parameters":[{"name":"id","required":true,"in":"path","schema":{"example":10,"type":"number"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateLocationAliasDto"}}}},"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/LocationAliasResponseDto"}}}},"400":{"description":"`GXS.VALIDATION_FAILED` — Validation failed","content":{"application/problem+json":{"schema":{"type":"object","required":["type","title","status","detail","instance","code","traceId"],"properties":{"type":{"type":"string","format":"uri"},"title":{"type":"string"},"status":{"type":"integer"},"detail":{"type":"string"},"instance":{"type":"string"},"code":{"type":"string"},"traceId":{"type":"string"},"errors":{"type":"array","items":{"type":"object","required":["field","code","message"],"properties":{"field":{"type":"string"},"code":{"type":"string"},"message":{"type":"string"}}}}}},"examples":{"GXS.VALIDATION_FAILED":{"value":{"type":"https://graphxserver.io/problems/validation-failed","title":"Validation failed","status":400,"detail":"Validation failed","instance":"/v2/…","code":"GXS.VALIDATION_FAILED","traceId":"4bf92f3577b34da6a3ce929d0e0e4736"}}}}}},"401":{"description":"`GXS.UNAUTHENTICATED` — Authentication required","content":{"application/problem+json":{"schema":{"type":"object","required":["type","title","status","detail","instance","code","traceId"],"properties":{"type":{"type":"string","format":"uri"},"title":{"type":"string"},"status":{"type":"integer"},"detail":{"type":"string"},"instance":{"type":"string"},"code":{"type":"string"},"traceId":{"type":"string"},"errors":{"type":"array","items":{"type":"object","required":["field","code","message"],"properties":{"field":{"type":"string"},"code":{"type":"string"},"message":{"type":"string"}}}}}},"examples":{"GXS.UNAUTHENTICATED":{"value":{"type":"https://graphxserver.io/problems/unauthenticated","title":"Authentication required","status":401,"detail":"Authentication required","instance":"/v2/…","code":"GXS.UNAUTHENTICATED","traceId":"4bf92f3577b34da6a3ce929d0e0e4736"}}}}}},"403":{"description":"`GXS.FORBIDDEN` — Forbidden","content":{"application/problem+json":{"schema":{"type":"object","required":["type","title","status","detail","instance","code","traceId"],"properties":{"type":{"type":"string","format":"uri"},"title":{"type":"string"},"status":{"type":"integer"},"detail":{"type":"string"},"instance":{"type":"string"},"code":{"type":"string"},"traceId":{"type":"string"},"errors":{"type":"array","items":{"type":"object","required":["field","code","message"],"properties":{"field":{"type":"string"},"code":{"type":"string"},"message":{"type":"string"}}}}}},"examples":{"GXS.FORBIDDEN":{"value":{"type":"https://graphxserver.io/problems/forbidden","title":"Forbidden","status":403,"detail":"Forbidden","instance":"/v2/…","code":"GXS.FORBIDDEN","traceId":"4bf92f3577b34da6a3ce929d0e0e4736"}}}}}},"404":{"description":"`GXSIO.LOCATION_ALIAS_NOT_FOUND` — Location alias not found","content":{"application/problem+json":{"schema":{"type":"object","required":["type","title","status","detail","instance","code","traceId"],"properties":{"type":{"type":"string","format":"uri"},"title":{"type":"string"},"status":{"type":"integer"},"detail":{"type":"string"},"instance":{"type":"string"},"code":{"type":"string"},"traceId":{"type":"string"},"errors":{"type":"array","items":{"type":"object","required":["field","code","message"],"properties":{"field":{"type":"string"},"code":{"type":"string"},"message":{"type":"string"}}}}}},"examples":{"GXSIO.LOCATION_ALIAS_NOT_FOUND":{"value":{"type":"https://graphxserver.io/problems/gxsio/location-alias-not-found","title":"Location alias not found","status":404,"detail":"Location alias not found","instance":"/v2/…","code":"GXSIO.LOCATION_ALIAS_NOT_FOUND","traceId":"4bf92f3577b34da6a3ce929d0e0e4736"}}}}}},"409":{"description":"`GXSIO.LOCATION_ALIAS_NAME_CONFLICT` — Location alias name already in use<br>`GXSIO.LOCATION_NAME_TAKEN_ON_MAP` — Location name already used on the product view","content":{"application/problem+json":{"schema":{"type":"object","required":["type","title","status","detail","instance","code","traceId"],"properties":{"type":{"type":"string","format":"uri"},"title":{"type":"string"},"status":{"type":"integer"},"detail":{"type":"string"},"instance":{"type":"string"},"code":{"type":"string"},"traceId":{"type":"string"},"errors":{"type":"array","items":{"type":"object","required":["field","code","message"],"properties":{"field":{"type":"string"},"code":{"type":"string"},"message":{"type":"string"}}}}}},"examples":{"GXSIO.LOCATION_ALIAS_NAME_CONFLICT":{"value":{"type":"https://graphxserver.io/problems/gxsio/location-alias-name-conflict","title":"Location alias name already in use","status":409,"detail":"Location alias name already in use","instance":"/v2/…","code":"GXSIO.LOCATION_ALIAS_NAME_CONFLICT","traceId":"4bf92f3577b34da6a3ce929d0e0e4736"}},"GXSIO.LOCATION_NAME_TAKEN_ON_MAP":{"value":{"type":"https://graphxserver.io/problems/gxsio/location-name-taken-on-map","title":"Location name already used on the product view","status":409,"detail":"Location name already used on the product view","instance":"/v2/…","code":"GXSIO.LOCATION_NAME_TAKEN_ON_MAP","traceId":"4bf92f3577b34da6a3ce929d0e0e4736"}}}}}},"422":{"description":"`GXSIO.LOCATION_ALIAS_DEFAULT_REQUIRED` — A location needs a default alias","content":{"application/problem+json":{"schema":{"type":"object","required":["type","title","status","detail","instance","code","traceId"],"properties":{"type":{"type":"string","format":"uri"},"title":{"type":"string"},"status":{"type":"integer"},"detail":{"type":"string"},"instance":{"type":"string"},"code":{"type":"string"},"traceId":{"type":"string"},"errors":{"type":"array","items":{"type":"object","required":["field","code","message"],"properties":{"field":{"type":"string"},"code":{"type":"string"},"message":{"type":"string"}}}}}},"examples":{"GXSIO.LOCATION_ALIAS_DEFAULT_REQUIRED":{"value":{"type":"https://graphxserver.io/problems/gxsio/location-alias-default-required","title":"A location needs a default alias","status":422,"detail":"A location needs a default alias","instance":"/v2/…","code":"GXSIO.LOCATION_ALIAS_DEFAULT_REQUIRED","traceId":"4bf92f3577b34da6a3ce929d0e0e4736"}}}}}},"502":{"description":"`GXS.UPSTREAM_FAILED` — Upstream service error","content":{"application/problem+json":{"schema":{"type":"object","required":["type","title","status","detail","instance","code","traceId"],"properties":{"type":{"type":"string","format":"uri"},"title":{"type":"string"},"status":{"type":"integer"},"detail":{"type":"string"},"instance":{"type":"string"},"code":{"type":"string"},"traceId":{"type":"string"},"errors":{"type":"array","items":{"type":"object","required":["field","code","message"],"properties":{"field":{"type":"string"},"code":{"type":"string"},"message":{"type":"string"}}}}}},"examples":{"GXS.UPSTREAM_FAILED":{"value":{"type":"https://graphxserver.io/problems/upstream-failed","title":"Upstream service error","status":502,"detail":"Upstream service error","instance":"/v2/…","code":"GXS.UPSTREAM_FAILED","traceId":"4bf92f3577b34da6a3ce929d0e0e4736"}}}}}}},"security":[{"bearer":[]}],"summary":"Renombra un alias o lo hace default","tags":["v2 · Location aliases"]},"delete":{"operationId":"LocationAliasesController_remove","parameters":[{"name":"id","required":true,"in":"path","schema":{"example":10,"type":"number"}}],"responses":{"204":{"description":""},"400":{"description":"`GXS.VALIDATION_FAILED` — Validation failed","content":{"application/problem+json":{"schema":{"type":"object","required":["type","title","status","detail","instance","code","traceId"],"properties":{"type":{"type":"string","format":"uri"},"title":{"type":"string"},"status":{"type":"integer"},"detail":{"type":"string"},"instance":{"type":"string"},"code":{"type":"string"},"traceId":{"type":"string"},"errors":{"type":"array","items":{"type":"object","required":["field","code","message"],"properties":{"field":{"type":"string"},"code":{"type":"string"},"message":{"type":"string"}}}}}},"examples":{"GXS.VALIDATION_FAILED":{"value":{"type":"https://graphxserver.io/problems/validation-failed","title":"Validation failed","status":400,"detail":"Validation failed","instance":"/v2/…","code":"GXS.VALIDATION_FAILED","traceId":"4bf92f3577b34da6a3ce929d0e0e4736"}}}}}},"401":{"description":"`GXS.UNAUTHENTICATED` — Authentication required","content":{"application/problem+json":{"schema":{"type":"object","required":["type","title","status","detail","instance","code","traceId"],"properties":{"type":{"type":"string","format":"uri"},"title":{"type":"string"},"status":{"type":"integer"},"detail":{"type":"string"},"instance":{"type":"string"},"code":{"type":"string"},"traceId":{"type":"string"},"errors":{"type":"array","items":{"type":"object","required":["field","code","message"],"properties":{"field":{"type":"string"},"code":{"type":"string"},"message":{"type":"string"}}}}}},"examples":{"GXS.UNAUTHENTICATED":{"value":{"type":"https://graphxserver.io/problems/unauthenticated","title":"Authentication required","status":401,"detail":"Authentication required","instance":"/v2/…","code":"GXS.UNAUTHENTICATED","traceId":"4bf92f3577b34da6a3ce929d0e0e4736"}}}}}},"403":{"description":"`GXS.FORBIDDEN` — Forbidden","content":{"application/problem+json":{"schema":{"type":"object","required":["type","title","status","detail","instance","code","traceId"],"properties":{"type":{"type":"string","format":"uri"},"title":{"type":"string"},"status":{"type":"integer"},"detail":{"type":"string"},"instance":{"type":"string"},"code":{"type":"string"},"traceId":{"type":"string"},"errors":{"type":"array","items":{"type":"object","required":["field","code","message"],"properties":{"field":{"type":"string"},"code":{"type":"string"},"message":{"type":"string"}}}}}},"examples":{"GXS.FORBIDDEN":{"value":{"type":"https://graphxserver.io/problems/forbidden","title":"Forbidden","status":403,"detail":"Forbidden","instance":"/v2/…","code":"GXS.FORBIDDEN","traceId":"4bf92f3577b34da6a3ce929d0e0e4736"}}}}}},"404":{"description":"`GXSIO.LOCATION_ALIAS_NOT_FOUND` — Location alias not found","content":{"application/problem+json":{"schema":{"type":"object","required":["type","title","status","detail","instance","code","traceId"],"properties":{"type":{"type":"string","format":"uri"},"title":{"type":"string"},"status":{"type":"integer"},"detail":{"type":"string"},"instance":{"type":"string"},"code":{"type":"string"},"traceId":{"type":"string"},"errors":{"type":"array","items":{"type":"object","required":["field","code","message"],"properties":{"field":{"type":"string"},"code":{"type":"string"},"message":{"type":"string"}}}}}},"examples":{"GXSIO.LOCATION_ALIAS_NOT_FOUND":{"value":{"type":"https://graphxserver.io/problems/gxsio/location-alias-not-found","title":"Location alias not found","status":404,"detail":"Location alias not found","instance":"/v2/…","code":"GXSIO.LOCATION_ALIAS_NOT_FOUND","traceId":"4bf92f3577b34da6a3ce929d0e0e4736"}}}}}},"502":{"description":"`GXS.UPSTREAM_FAILED` — Upstream service error","content":{"application/problem+json":{"schema":{"type":"object","required":["type","title","status","detail","instance","code","traceId"],"properties":{"type":{"type":"string","format":"uri"},"title":{"type":"string"},"status":{"type":"integer"},"detail":{"type":"string"},"instance":{"type":"string"},"code":{"type":"string"},"traceId":{"type":"string"},"errors":{"type":"array","items":{"type":"object","required":["field","code","message"],"properties":{"field":{"type":"string"},"code":{"type":"string"},"message":{"type":"string"}}}}}},"examples":{"GXS.UPSTREAM_FAILED":{"value":{"type":"https://graphxserver.io/problems/upstream-failed","title":"Upstream service error","status":502,"detail":"Upstream service error","instance":"/v2/…","code":"GXS.UPSTREAM_FAILED","traceId":"4bf92f3577b34da6a3ce929d0e0e4736"}}}}}}},"security":[{"bearer":[]}],"summary":"Borra un alias","tags":["v2 · Location aliases"]}},"/v2/location-aliases":{"patch":{"operationId":"LocationAliasesController_updateMany","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateLocationAliasesDto"}}}},"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/LocationAliasListResponseDto"}}}},"400":{"description":"`GXS.VALIDATION_FAILED` — Validation failed","content":{"application/problem+json":{"schema":{"type":"object","required":["type","title","status","detail","instance","code","traceId"],"properties":{"type":{"type":"string","format":"uri"},"title":{"type":"string"},"status":{"type":"integer"},"detail":{"type":"string"},"instance":{"type":"string"},"code":{"type":"string"},"traceId":{"type":"string"},"errors":{"type":"array","items":{"type":"object","required":["field","code","message"],"properties":{"field":{"type":"string"},"code":{"type":"string"},"message":{"type":"string"}}}}}},"examples":{"GXS.VALIDATION_FAILED":{"value":{"type":"https://graphxserver.io/problems/validation-failed","title":"Validation failed","status":400,"detail":"Validation failed","instance":"/v2/…","code":"GXS.VALIDATION_FAILED","traceId":"4bf92f3577b34da6a3ce929d0e0e4736"}}}}}},"401":{"description":"`GXS.UNAUTHENTICATED` — Authentication required","content":{"application/problem+json":{"schema":{"type":"object","required":["type","title","status","detail","instance","code","traceId"],"properties":{"type":{"type":"string","format":"uri"},"title":{"type":"string"},"status":{"type":"integer"},"detail":{"type":"string"},"instance":{"type":"string"},"code":{"type":"string"},"traceId":{"type":"string"},"errors":{"type":"array","items":{"type":"object","required":["field","code","message"],"properties":{"field":{"type":"string"},"code":{"type":"string"},"message":{"type":"string"}}}}}},"examples":{"GXS.UNAUTHENTICATED":{"value":{"type":"https://graphxserver.io/problems/unauthenticated","title":"Authentication required","status":401,"detail":"Authentication required","instance":"/v2/…","code":"GXS.UNAUTHENTICATED","traceId":"4bf92f3577b34da6a3ce929d0e0e4736"}}}}}},"403":{"description":"`GXS.FORBIDDEN` — Forbidden","content":{"application/problem+json":{"schema":{"type":"object","required":["type","title","status","detail","instance","code","traceId"],"properties":{"type":{"type":"string","format":"uri"},"title":{"type":"string"},"status":{"type":"integer"},"detail":{"type":"string"},"instance":{"type":"string"},"code":{"type":"string"},"traceId":{"type":"string"},"errors":{"type":"array","items":{"type":"object","required":["field","code","message"],"properties":{"field":{"type":"string"},"code":{"type":"string"},"message":{"type":"string"}}}}}},"examples":{"GXS.FORBIDDEN":{"value":{"type":"https://graphxserver.io/problems/forbidden","title":"Forbidden","status":403,"detail":"Forbidden","instance":"/v2/…","code":"GXS.FORBIDDEN","traceId":"4bf92f3577b34da6a3ce929d0e0e4736"}}}}}},"404":{"description":"`GXSIO.LOCATION_ALIAS_NOT_FOUND` — Location alias not found","content":{"application/problem+json":{"schema":{"type":"object","required":["type","title","status","detail","instance","code","traceId"],"properties":{"type":{"type":"string","format":"uri"},"title":{"type":"string"},"status":{"type":"integer"},"detail":{"type":"string"},"instance":{"type":"string"},"code":{"type":"string"},"traceId":{"type":"string"},"errors":{"type":"array","items":{"type":"object","required":["field","code","message"],"properties":{"field":{"type":"string"},"code":{"type":"string"},"message":{"type":"string"}}}}}},"examples":{"GXSIO.LOCATION_ALIAS_NOT_FOUND":{"value":{"type":"https://graphxserver.io/problems/gxsio/location-alias-not-found","title":"Location alias not found","status":404,"detail":"Location alias not found","instance":"/v2/…","code":"GXSIO.LOCATION_ALIAS_NOT_FOUND","traceId":"4bf92f3577b34da6a3ce929d0e0e4736"}}}}}},"409":{"description":"`GXSIO.LOCATION_ALIAS_NAME_CONFLICT` — Location alias name already in use<br>`GXSIO.LOCATION_NAME_TAKEN_ON_MAP` — Location name already used on the product view","content":{"application/problem+json":{"schema":{"type":"object","required":["type","title","status","detail","instance","code","traceId"],"properties":{"type":{"type":"string","format":"uri"},"title":{"type":"string"},"status":{"type":"integer"},"detail":{"type":"string"},"instance":{"type":"string"},"code":{"type":"string"},"traceId":{"type":"string"},"errors":{"type":"array","items":{"type":"object","required":["field","code","message"],"properties":{"field":{"type":"string"},"code":{"type":"string"},"message":{"type":"string"}}}}}},"examples":{"GXSIO.LOCATION_ALIAS_NAME_CONFLICT":{"value":{"type":"https://graphxserver.io/problems/gxsio/location-alias-name-conflict","title":"Location alias name already in use","status":409,"detail":"Location alias name already in use","instance":"/v2/…","code":"GXSIO.LOCATION_ALIAS_NAME_CONFLICT","traceId":"4bf92f3577b34da6a3ce929d0e0e4736"}},"GXSIO.LOCATION_NAME_TAKEN_ON_MAP":{"value":{"type":"https://graphxserver.io/problems/gxsio/location-name-taken-on-map","title":"Location name already used on the product view","status":409,"detail":"Location name already used on the product view","instance":"/v2/…","code":"GXSIO.LOCATION_NAME_TAKEN_ON_MAP","traceId":"4bf92f3577b34da6a3ce929d0e0e4736"}}}}}},"422":{"description":"`GXSIO.LOCATION_ALIAS_DEFAULT_REQUIRED` — A location needs a default alias<br>`GXSIO.LOCATION_ALIAS_MULTIPLE_DEFAULTS` — Only one alias per location can be the default","content":{"application/problem+json":{"schema":{"type":"object","required":["type","title","status","detail","instance","code","traceId"],"properties":{"type":{"type":"string","format":"uri"},"title":{"type":"string"},"status":{"type":"integer"},"detail":{"type":"string"},"instance":{"type":"string"},"code":{"type":"string"},"traceId":{"type":"string"},"errors":{"type":"array","items":{"type":"object","required":["field","code","message"],"properties":{"field":{"type":"string"},"code":{"type":"string"},"message":{"type":"string"}}}}}},"examples":{"GXSIO.LOCATION_ALIAS_DEFAULT_REQUIRED":{"value":{"type":"https://graphxserver.io/problems/gxsio/location-alias-default-required","title":"A location needs a default alias","status":422,"detail":"A location needs a default alias","instance":"/v2/…","code":"GXSIO.LOCATION_ALIAS_DEFAULT_REQUIRED","traceId":"4bf92f3577b34da6a3ce929d0e0e4736"}},"GXSIO.LOCATION_ALIAS_MULTIPLE_DEFAULTS":{"value":{"type":"https://graphxserver.io/problems/gxsio/location-alias-multiple-defaults","title":"Only one alias per location can be the default","status":422,"detail":"Only one alias per location can be the default","instance":"/v2/…","code":"GXSIO.LOCATION_ALIAS_MULTIPLE_DEFAULTS","traceId":"4bf92f3577b34da6a3ce929d0e0e4736"}}}}}},"502":{"description":"`GXS.UPSTREAM_FAILED` — Upstream service error","content":{"application/problem+json":{"schema":{"type":"object","required":["type","title","status","detail","instance","code","traceId"],"properties":{"type":{"type":"string","format":"uri"},"title":{"type":"string"},"status":{"type":"integer"},"detail":{"type":"string"},"instance":{"type":"string"},"code":{"type":"string"},"traceId":{"type":"string"},"errors":{"type":"array","items":{"type":"object","required":["field","code","message"],"properties":{"field":{"type":"string"},"code":{"type":"string"},"message":{"type":"string"}}}}}},"examples":{"GXS.UPSTREAM_FAILED":{"value":{"type":"https://graphxserver.io/problems/upstream-failed","title":"Upstream service error","status":502,"detail":"Upstream service error","instance":"/v2/…","code":"GXS.UPSTREAM_FAILED","traceId":"4bf92f3577b34da6a3ce929d0e0e4736"}}}}}}},"security":[{"bearer":[]}],"summary":"Cambia varios alias a la vez (por ejemplo, mover el default)","tags":["v2 · Location aliases"]}}},"info":{"title":"gxsio-api","description":"API pública de GraphXServer.io. V1 conserva los paths PascalCase y el envelope tObject del contrato legacy en las respuestas exitosas; los errores salen como Problem Details (RFC 9457, `application/problem+json`) con el status HTTP real. Las diferencias con el legacy están en contracts/legacy/deviations.md.","version":"1.0","contact":{}},"tags":[{"name":"Health","description":"Health check endpoints"},{"name":"Metrics","description":"Metrics endpoints"},{"name":"Legacy V1","description":"Contrato legacy de la API pública"}],"servers":[],"components":{"securitySchemes":{"bearer":{"scheme":"bearer","bearerFormat":"GXS_O-*","type":"http","description":"API key de organización (`GXS_O-...`), enviada tal cual como `Authorization: Bearer GXS_O-...`. También se acepta un JWT de Identity, pero un cliente de la API pública usa la API key."}},"schemas":{"HealthCheckDto":{"type":"object","properties":{"status":{"type":"string","example":"ok","enum":["ok","degraded","down"]},"checks":{"type":"object","example":{"db":"connected","redis":"connected"}},"uptime":{"type":"string","example":"3h 12m"},"timestamp":{"type":"string","example":"2025-10-17T14:30:00.000Z"}},"required":["status","checks","uptime","timestamp"]},"LocationAliasResponseDto":{"type":"object","properties":{"id":{"type":"number","example":10},"name":{"type":"string","example":"Centered on Front"},"isDefault":{"type":"boolean","example":false}},"required":["id","name","isDefault"]},"LocationAliasListResponseDto":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/LocationAliasResponseDto"}}},"required":["data"]},"CreateLocationAliasDto":{"type":"object","properties":{"name":{"type":"string","example":"Centered on Front","maxLength":255},"isDefault":{"type":"boolean","example":false,"default":false}},"required":["name"]},"UpdateLocationAliasDto":{"type":"object","properties":{"name":{"type":"string","example":"Centered on Front","maxLength":255},"isDefault":{"type":"boolean","example":true}}},"LocationAliasChangeDto":{"type":"object","properties":{"name":{"type":"string","example":"Centered on Front","maxLength":255},"isDefault":{"type":"boolean","example":true},"id":{"type":"number","example":10}},"required":["id"]},"UpdateLocationAliasesDto":{"type":"object","properties":{"aliases":{"type":"array","items":{"$ref":"#/components/schemas/LocationAliasChangeDto"}}},"required":["aliases"]}}}}