Skip to main content

OpenAPI 3.x completo - Nexus

Este documento contiene la especificación OpenAPI 3.1 de los servicios REST de Nexus, cubriendo:

  • Purchase Order API (ingesta)
  • Status API (consulta de estado y búsqueda)
  • Retry API (reproceso manual)
  • Validation Rules API (administración de reglas)
  • Partners API (catálogo partners)
  • Partner Configuration API (configuración por partner)

Convenciones:

  • Base URL por ambiente: https://hub-nexus.[ambiente].alpura.com/api/v1
  • Todos los endpoints requieren OAuth 2.0 Client Credentials (Bearer JWT).
  • Todos los requests deben incluir X-Request-Id (opcional; Nexus genera uno si no llega) y X-Partner-Id, X-Company-Id, X-Source-System (cuando aplique).
  • Respuesta de error uniforme (ver ApiError).
openapi: 3.1.0
info:
title: Nexus Purchase Order Platform
version: 1.0.0
description: |
Nexus - plataforma de integracion empresarial para la creacion asincrona
de Ordenes de Compra en Oracle Fusion Procurement.
contact:
name: Arquitectura Nexus
email: arquitectura.nexus@alpura.com
servers:
- url: https://hub-nexus.dev.alpura.com/api/v1
description: Development
- url: https://hub-nexus.uat.alpura.com/api/v1
description: UAT
- url: https://hub-nexus.alpura.com/api/v1
description: Production

tags:
- name: Purchase Orders
description: Ingesta y ciclo de vida de Ordenes de Compra
- name: Status & Tracking
description: Consulta de estado, historial y busqueda
- name: Retry
description: Reproceso manual
- name: Validation Rules
description: Gestion de reglas de validacion
- name: Partners
description: Catalogo de partners
- name: Configuration
description: Configuracion por partner y mapeos

security:
- OAuth2ClientCredentials: []

components:
securitySchemes:
OAuth2ClientCredentials:
type: oauth2
description: OAuth 2.0 Client Credentials (system-to-system).
flows:
clientCredentials:
tokenUrl: https://hub-login-kc.alpura.com/auth/realms/Alpura/protocol/openid-connect/token
scopes:
nexus.purchase-order.create: Crear una Orden de Compra
nexus.purchase-order.read: Consultar estado de una Orden de Compra
nexus.purchase-order.retry: Reprocesar manualmente una solicitud
nexus.validation-rule.read: Lectura de reglas de validacion
nexus.validation-rule.manage: Administracion de reglas
nexus.configuration.read: Lectura de partners y configuracion
nexus.configuration.manage: Administracion de partners y configuracion
BearerAuth:
type: http
scheme: bearer
bearerFormat: JWT

headers:
X-Request-Id:
required: false
description: UUID de correlacion. Si no llega, Nexus lo genera.
schema:
type: string
format: uuid
X-Idempotency-Key:
required: true
description: Llave de idempotencia por request de creacion.
schema:
type: string
minLength: 8
maxLength: 128
X-Partner-Id:
required: true
schema:
type: string
X-Company-Id:
required: true
schema:
type: string
X-Source-System:
required: true
schema:
type: string

parameters:
RequestIdPath:
name: requestId
in: path
required: true
schema:
type: string
format: uuid
RuleIdPath:
name: id
in: path
required: true
schema:
type: string
format: uuid
PartnerIdPath:
name: partnerId
in: path
required: true
schema:
type: string
PageNumber:
name: pageNumber
in: query
required: false
schema:
type: integer
default: 1
minimum: 1
PageSize:
name: pageSize
in: query
required: false
schema:
type: integer
default: 25
minimum: 1
maximum: 200
StatusFilter:
name: status
in: query
required: false
schema:
type: string
enum: [ RECEIVED, VALIDATING, VALIDATED, VALIDATION_FAILED,
QUEUED, PROCESSING, CREATED, RETRY_PENDING, FAILED, REJECTED ]
PartnerIdFilter:
name: partnerId
in: query
required: false
schema:
type: string

responses:
AcceptedRequestId:
description: Solicitud aceptada (procesamiento asincrono).
content:
application/json:
schema:
$ref: '#/components/schemas/CreatePurchaseOrderAccepted'
NotFound:
description: Recurso no encontrado.
content:
application/json:
schema:
$ref: '#/components/schemas/ApiError'
Conflict:
description: Conflicto por idempotencia o estado incompatible.
content:
application/json:
schema:
$ref: '#/components/schemas/ApiError'
Unauthorized:
description: Sin autenticacion o token invalido.
content:
application/json:
schema:
$ref: '#/components/schemas/ApiError'
Forbidden:
description: Sin permisos (scope insuficiente).
content:
application/json:
schema:
$ref: '#/components/schemas/ApiError'
BadRequest:
description: Request invalido (schema o estructura).
content:
application/json:
schema:
$ref: '#/components/schemas/ApiError'
Unprocessable:
description: Errores de validacion de negocio (Validation Engine).
content:
application/json:
schema:
$ref: '#/components/schemas/ApiError'

schemas:
# ============ Purchase Order ============
CreatePurchaseOrderRequest:
type: object
required:
- externalReference
- documentType
- supplier
- buyer
- billTo
- shipTo
- currency
- paymentTerms
- lines
properties:
externalReference:
type: string
maxLength: 80
examples:
- PO-123456
documentType:
type: string
enum: [ PURCHASE_ORDER, BLANKET, STANDARD ]
examples:
- PURCHASE_ORDER
submittedAt:
type: string
format: date-time
buyer:
$ref: '#/components/schemas/Buyer'
billTo:
$ref: '#/components/schemas/Address'
shipTo:
$ref: '#/components/schemas/Address'
supplier:
$ref: '#/components/schemas/Supplier'
currency:
$ref: '#/components/schemas/Currency'
paymentTerms:
$ref: '#/components/schemas/PaymentTerms'
lines:
type: array
minItems: 1
maxItems: 500
items:
$ref: '#/components/schemas/PurchaseOrderLineRequest'
notes:
type: string
maxLength: 2000
attachments:
type: array
maxItems: 10
items:
$ref: '#/components/schemas/Attachment'
customFields:
type: object
additionalProperties:
type: string
description: Campos extendidos (configurables por partner).

PurchaseOrderLineRequest:
type: object
required:
- lineNumber
- item
- quantity
- unitPrice
properties:
lineNumber:
type: integer
minimum: 1
item:
$ref: '#/components/schemas/Item'
quantity:
$ref: '#/components/schemas/Quantity'
unitPrice:
$ref: '#/components/schemas/Price'
requestedDeliveryDate:
type: string
format: date-time
promisedDeliveryDate:
type: string
format: date-time
costCenter:
type: string
maxLength: 40
glCode:
type: string
maxLength: 120
notes:
type: string
maxLength: 1000

CreatePurchaseOrderAccepted:
type: object
required:
- requestId
- status
- submittedAt
properties:
requestId:
type: string
format: uuid
status:
type: string
enum: [ RECEIVED, REJECTED, DUPLICATE ]
submittedAt:
type: string
format: date-time
duplicate:
type: boolean
description: True si la solicitud es duplicado por Idempotency-Key.
links:
$ref: '#/components/schemas/StatusLinks'
examples:
accepted:
value:
requestId: bcd5f9a7-4ced-4d25-bf3f-6ae762f05b41
status: RECEIVED
submittedAt: 2026-08-12T18:00:00Z
duplicate: false
links:
status: /api/v1/purchase-orders/requests/bcd5f9a7-4ced-4d25-bf3f-6ae762f05b41

StatusLinks:
type: object
properties:
status:
type: string
format: uri-reference

PurchaseOrderRequestStatusResponse:
type: object
required:
- requestId
- status
- partnerId
- companyId
- sourceSystem
- createdAt
- updatedAt
properties:
requestId:
type: string
format: uuid
status:
type: string
enum: [ RECEIVED, VALIDATING, VALIDATED, VALIDATION_FAILED,
QUEUED, PROCESSING, CREATED, RETRY_PENDING, FAILED, REJECTED ]
partnerId:
type: string
companyId:
type: string
sourceSystem:
type: string
externalReference:
type: string
idempotencyKey:
type: string
oraclePurchaseOrder:
type: string
createdAt:
type: string
format: date-time
updatedAt:
type: string
format: date-time
history:
type: array
items:
$ref: '#/components/schemas/StatusTransition'
errors:
type: array
items:
$ref: '#/components/schemas/IntegrationError'
examples:
created:
value:
requestId: bcd5f9a7-4ced-4d25-bf3f-6ae762f05b41
status: CREATED
partnerId: GEPP
companyId: ALPURA_MX
sourceSystem: GEPP_ERP
externalReference: PO-123456
oraclePurchaseOrder: "4500012345"
createdAt: 2026-08-12T18:00:00Z
updatedAt: 2026-08-12T18:00:04Z
history: []
errors: []

StatusTransition:
type: object
required: [ status, at ]
properties:
status:
type: string
at:
type: string
format: date-time
component:
type: string
metadata:
type: object
additionalProperties: true

IntegrationError:
type: object
required: [ errorCategory, errorCode, message ]
properties:
errorCategory:
type: string
enum: [ VALIDATION_ERROR, BUSINESS_ERROR, TEMPORARY_ERROR,
INTEGRATION_ERROR, AUTHENTICATION_ERROR, AUTHORIZATION_ERROR,
TECHNICAL_ERROR, NON_RETRYABLE_ERROR ]
errorCode:
type: string
message:
type: string
at:
type: string
format: date-time
attempt:
type: integer
details:
type: object
additionalProperties: true

# ============ Shared models ============
Buyer:
type: object
required: [ email, name ]
properties:
personId:
type: string
maxLength: 40
email:
type: string
format: email
name:
type: string
maxLength: 120
employeeNumber:
type: string
maxLength: 40
department:
type: string
maxLength: 80

Supplier:
type: object
required: [ supplierCode, supplierName, taxId, site ]
properties:
supplierCode:
type: string
maxLength: 60
supplierName:
type: string
maxLength: 200
taxId:
type: string
maxLength: 30
site:
type: string
maxLength: 60
contact:
$ref: '#/components/schemas/Contact'
bankDetails:
type: array
items:
type: object
additionalProperties: true

Contact:
type: object
properties:
name: { type: string }
email: { type: string, format: email }
phone: { type: string }

Address:
type: object
required: [ countryCode ]
properties:
name: { type: string, maxLength: 120 }
address1: { type: string, maxLength: 200 }
address2: { type: string, maxLength: 200 }
address3: { type: string, maxLength: 200 }
city: { type: string, maxLength: 80 }
state: { type: string, maxLength: 80 }
zip: { type: string, maxLength: 30 }
countryCode: { type: string, minLength: 2, maxLength: 3 }
phone: { type: string }
email: { type: string, format: email }

Currency:
type: object
required: [ code ]
properties:
code:
type: string
minLength: 3
maxLength: 3
description: ISO 4217
decimals: { type: integer }
conversionRate: { type: number, format: double }

PaymentTerms:
type: object
required: [ code ]
properties:
code: { type: string, maxLength: 40 }
description: { type: string, maxLength: 160 }
netDays: { type: integer, minimum: 0 }
discountTiers:
type: array
items:
type: object
properties:
days: { type: integer }
percent: { type: number, format: double }

Item:
type: object
required: [ sku, description ]
properties:
sku: { type: string, maxLength: 60 }
upc: { type: string, maxLength: 40 }
description: { type: string, maxLength: 250 }
commodity: { type: string, maxLength: 60 }
category: { type: string, maxLength: 60 }

Quantity:
type: object
required: [ value, unitOfMeasure ]
properties:
value: { type: number, format: double }
unitOfMeasure:
type: string
maxLength: 12
description: Código UOM estandar

Price:
type: object
required: [ amount, currency ]
properties:
amount: { type: number, format: double }
currency: { type: string, maxLength: 3 }
taxIncluded: { type: boolean, default: false }

Attachment:
type: object
required: [ name, url ]
properties:
name: { type: string }
url: { type: string, format: uri }
hash: { type: string }
sizeBytes: { type: integer, format: int64 }
mimeType: { type: string }

# ============ Validation & Domain errors ============
ValidationError:
type: object
required: [ code, message ]
properties:
code: { type: string }
field: { type: string }
message: { type: string }
severity:
type: string
enum: [ INFO, WARNING, ERROR, FATAL ]
params:
type: object
additionalProperties: true

ApiError:
type: object
required: [ requestId, timestamp, code, message ]
properties:
requestId: { type: string, format: uuid }
timestamp: { type: string, format: date-time }
code:
type: string
enum: [ VALIDATION_ERROR, BUSINESS_ERROR, TEMPORARY_ERROR,
INTEGRATION_ERROR, AUTHENTICATION_ERROR, AUTHORIZATION_ERROR,
TECHNICAL_ERROR, NON_RETRYABLE_ERROR ]
message: { type: string }
errors:
type: array
items:
$ref: '#/components/schemas/ValidationError'
details:
type: object
additionalProperties: true
examples:
validation:
value:
requestId: bcd5f9a7-4ced-4d25-bf3f-6ae762f05b41
timestamp: 2026-08-12T18:00:00Z
code: VALIDATION_ERROR
message: La solicitud contiene errores
errors:
- code: REQUIRED
field: supplier.code
message: El proveedor es obligatorio
- code: SUPPLIER_REQUIRED
field: supplier.taxId
message: El RFC del proveedor es obligatorio
conflict:
value:
requestId: bcd5f9a7-4ced-4d25-bf3f-6ae762f05b41
timestamp: 2026-08-12T18:00:00Z
code: BUSINESS_ERROR
message: Solicitud duplicada por Idempotency-Key

# ============ Retry manual ============
RetryRequest:
type: object
properties:
comment: { type: string, maxLength: 2000 }
force: { type: boolean, default: false }

RetryAccepted:
type: object
required: [ requestId, status, newEventId, retryAttempt ]
properties:
requestId: { type: string, format: uuid }
status: { type: string, const: RETRY_PENDING }
newEventId: { type: string, format: uuid }
retryAttempt: { type: integer, minimum: 1 }
comment: { type: string }

# ============ Validation Rules ============
ValidationRule:
type: object
required: [ code, name, partnerId, group, priority, version ]
properties:
id: { type: string, format: uuid, readOnly: true }
code: { type: string, maxLength: 80 }
name: { type: string, maxLength: 200 }
description: { type: string, maxLength: 2000 }
partnerId: { type: string }
companyId: { type: string }
sourceSystem: { type: string }
documentTypes:
type: array
items: { type: string }
group:
type: string
enum: [ STRUCTURAL, SYNTACTIC, SEMANTIC, BUSINESS ]
priority: { type: integer, minimum: 1, maximum: 9999 }
status:
type: string
enum: [ DRAFT, ACTIVE, INACTIVE ]
readOnly: true
version:
$ref: '#/components/schemas/ValidationRuleVersion'
params:
type: array
items:
$ref: '#/components/schemas/ValidationRuleParam'
createdBy: { type: string, readOnly: true }
createdAt: { type: string, format: date-time, readOnly: true }
updatedAt: { type: string, format: date-time, readOnly: true }

ValidationRuleVersion:
type: object
required: [ major, minor, expressionLanguage, expression, severity, errorTemplate ]
properties:
major: { type: integer, minimum: 1 }
minor: { type: integer, minimum: 0 }
expressionLanguage:
type: string
enum: [ NEXUS_RULE_DSL ]
expression:
type: string
description: Expresion segun NEXUS_RULE_DSL (no codigo arbitrario).
severity:
type: string
enum: [ WARNING, ERROR, FATAL ]
errorTemplate:
$ref: '#/components/schemas/ValidationError'
publishedAt: { type: string, format: date-time, readOnly: true }
publishedBy: { type: string, readOnly: true }

ValidationRuleParam:
type: object
required: [ name, type ]
properties:
name: { type: string }
type:
type: string
enum: [ string, integer, decimal, boolean, date ]
defaultValue: { type: string }
description: { type: string }

ChangeRuleStatusRequest:
type: object
required: [ status ]
properties:
status:
type: string
enum: [ DRAFT, ACTIVE, INACTIVE ]
comment: { type: string, maxLength: 2000 }

# ============ Partners & Config ============
Partner:
type: object
required: [ partnerId, name ]
properties:
partnerId: { type: string }
name: { type: string, maxLength: 200 }
status:
type: string
enum: [ ACTIVE, INACTIVE ]
defaultCompanyId: { type: string }
createdAt: { type: string, format: date-time, readOnly: true }

PartnerConfiguration:
type: object
required: [ configKey, configValue ]
properties:
id: { type: string, format: uuid, readOnly: true }
partnerId: { type: string }
configKey: { type: string, maxLength: 120 }
configValue:
type: object
additionalProperties: true
description: Configuracion JSON (ej: mapeos UOM, mapeos suppliers, refs credenciales Fusion).
version: { type: integer, minimum: 1 }
description: { type: string }

# ============ Paged response ============
PurchaseOrderRequestSearchResponse:
type: object
properties:
pageNumber: { type: integer }
pageSize: { type: integer }
totalElements: { type: integer, format: int64 }
items:
type: array
items:
$ref: '#/components/schemas/PurchaseOrderRequestStatusResponse'

paths:
# ============ Purchase Orders ============
/purchase-orders:
post:
tags: [ Purchase Orders ]
summary: Crea una solicitud de Orden de Compra (procesamiento asincrono).
description: |
Valida estructura, reglas y persiste transaccionalmente. Devuelve 202 con requestId.
No espera la respuesta de Oracle Fusion.
security:
- OAuth2ClientCredentials: [ nexus.purchase-order.create ]
parameters:
- $ref: '#/components/parameters/PageNumber'
- $ref: '#/components/parameters/PageSize'
- in: header
name: X-Request-Id
schema: { $ref: '#/components/headers/X-Request-Id' }
- in: header
name: X-Idempotency-Key
required: true
schema: { $ref: '#/components/headers/X-Idempotency-Key' }
- in: header
name: X-Partner-Id
required: true
schema: { $ref: '#/components/headers/X-Partner-Id' }
- in: header
name: X-Company-Id
required: true
schema: { $ref: '#/components/headers/X-Company-Id' }
- in: header
name: X-Source-System
required: true
schema: { $ref: '#/components/headers/X-Source-System' }
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/CreatePurchaseOrderRequest'
responses:
202:
$ref: '#/components/responses/AcceptedRequestId'
400:
$ref: '#/components/responses/BadRequest'
401:
$ref: '#/components/responses/Unauthorized'
403:
$ref: '#/components/responses/Forbidden'
409:
$ref: '#/components/responses/Conflict'
422:
$ref: '#/components/responses/Unprocessable'

/purchase-orders/requests/{requestId}:
get:
tags: [ Status & Tracking ]
summary: Consulta estado por requestId.
security:
- OAuth2ClientCredentials: [ nexus.purchase-order.read ]
parameters:
- $ref: '#/components/parameters/RequestIdPath'
- in: header
name: X-Request-Id
schema: { $ref: '#/components/headers/X-Request-Id' }
- in: header
name: X-Partner-Id
required: true
schema: { $ref: '#/components/headers/X-Partner-Id' }
responses:
200:
description: Estado de la solicitud.
content:
application/json:
schema:
$ref: '#/components/schemas/PurchaseOrderRequestStatusResponse'
401:
$ref: '#/components/responses/Unauthorized'
403:
$ref: '#/components/responses/Forbidden'
404:
$ref: '#/components/responses/NotFound'

/purchase-orders/requests:
get:
tags: [ Status & Tracking ]
summary: Busqueda paginada de solicitudes.
security:
- OAuth2ClientCredentials: [ nexus.purchase-order.read ]
parameters:
- $ref: '#/components/parameters/PageNumber'
- $ref: '#/components/parameters/PageSize'
- $ref: '#/components/parameters/StatusFilter'
- $ref: '#/components/parameters/PartnerIdFilter'
- in: query
name: externalReference
schema: { type: string }
- in: query
name: sourceSystem
schema: { type: string }
- in: query
name: fromCreatedAt
schema: { type: string, format: date-time }
- in: query
name: toCreatedAt
schema: { type: string, format: date-time }
- in: header
name: X-Partner-Id
required: false
schema: { $ref: '#/components/headers/X-Partner-Id' }
responses:
200:
description: Resultados paginados.
content:
application/json:
schema:
$ref: '#/components/schemas/PurchaseOrderRequestSearchResponse'
401:
$ref: '#/components/responses/Unauthorized'
403:
$ref: '#/components/responses/Forbidden'

/purchase-orders/requests/{requestId}/retry:
post:
tags: [ Retry ]
summary: Reprocesa manualmente una solicitud en fallo.
security:
- OAuth2ClientCredentials: [ nexus.purchase-order.retry ]
parameters:
- $ref: '#/components/parameters/RequestIdPath'
- in: header
name: X-Request-Id
schema: { $ref: '#/components/headers/X-Request-Id' }
requestBody:
required: false
content:
application/json:
schema:
$ref: '#/components/schemas/RetryRequest'
responses:
202:
description: Reproceso aceptado.
content:
application/json:
schema:
$ref: '#/components/schemas/RetryAccepted'
400:
$ref: '#/components/responses/BadRequest'
401:
$ref: '#/components/responses/Unauthorized'
403:
$ref: '#/components/responses/Forbidden'
404:
$ref: '#/components/responses/NotFound'
409:
$ref: '#/components/responses/Conflict'

# ============ Validation Rules ============
/validation-rules:
post:
tags: [ Validation Rules ]
summary: Crea una nueva regla de validacion (estado DRAFT).
security:
- OAuth2ClientCredentials: [ nexus.validation-rule.manage ]
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/ValidationRule'
responses:
201:
description: Regla creada.
content:
application/json:
schema:
$ref: '#/components/schemas/ValidationRule'
400:
$ref: '#/components/responses/BadRequest'
401:
$ref: '#/components/responses/Unauthorized'
403:
$ref: '#/components/responses/Forbidden'

get:
tags: [ Validation Rules ]
summary: Lista reglas de validacion.
security:
- OAuth2ClientCredentials: [ nexus.validation-rule.read ]
parameters:
- $ref: '#/components/parameters/PageNumber'
- $ref: '#/components/parameters/PageSize'
- $ref: '#/components/parameters/PartnerIdFilter'
- in: query
name: documentType
schema: { type: string }
- in: query
name: status
schema:
type: string
enum: [ DRAFT, ACTIVE, INACTIVE ]
- in: query
name: group
schema:
type: string
enum: [ STRUCTURAL, SYNTACTIC, SEMANTIC, BUSINESS ]
- in: query
name: code
schema: { type: string }
responses:
200:
description: Lista paginada.
content:
application/json:
schema:
type: object
properties:
pageNumber: { type: integer }
pageSize: { type: integer }
totalElements: { type: integer, format: int64 }
items:
type: array
items:
$ref: '#/components/schemas/ValidationRule'

/validation-rules/{id}:
get:
tags: [ Validation Rules ]
summary: Obtiene detalle de una regla (con versiones).
security:
- OAuth2ClientCredentials: [ nexus.validation-rule.read ]
parameters:
- $ref: '#/components/parameters/RuleIdPath'
responses:
200:
description: Detalle.
content:
application/json:
schema:
$ref: '#/components/schemas/ValidationRule'
404:
$ref: '#/components/responses/NotFound'

put:
tags: [ Validation Rules ]
summary: Crea nueva version de la regla (version semantico).
security:
- OAuth2ClientCredentials: [ nexus.validation-rule.manage ]
parameters:
- $ref: '#/components/parameters/RuleIdPath'
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/ValidationRule'
responses:
200:
description: Nueva version creada.
content:
application/json:
schema:
$ref: '#/components/schemas/ValidationRule'
400:
$ref: '#/components/responses/BadRequest'
401:
$ref: '#/components/responses/Unauthorized'
403:
$ref: '#/components/responses/Forbidden'
404:
$ref: '#/components/responses/NotFound'

/validation-rules/{id}/status:
patch:
tags: [ Validation Rules ]
summary: Cambia estado de una regla (DRAFT ACTIVE INACTIVE).
security:
- OAuth2ClientCredentials: [ nexus.validation-rule.manage ]
parameters:
- $ref: '#/components/parameters/RuleIdPath'
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/ChangeRuleStatusRequest'
responses:
200:
description: Estado actualizado.
content:
application/json:
schema:
$ref: '#/components/schemas/ValidationRule'
400:
$ref: '#/components/responses/BadRequest'
401:
$ref: '#/components/responses/Unauthorized'
403:
$ref: '#/components/responses/Forbidden'
404:
$ref: '#/components/responses/NotFound'

# ============ Partners ============
/partners:
post:
tags: [ Partners ]
summary: Alta de partner.
security:
- OAuth2ClientCredentials: [ nexus.configuration.manage ]
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/Partner'
responses:
201:
description: Partner creado.
content:
application/json:
schema:
$ref: '#/components/schemas/Partner'
get:
tags: [ Partners ]
summary: Lista partners.
security:
- OAuth2ClientCredentials: [ nexus.configuration.read ]
parameters:
- $ref: '#/components/parameters/PageNumber'
- $ref: '#/components/parameters/PageSize'
- in: query
name: status
schema:
type: string
enum: [ ACTIVE, INACTIVE ]
responses:
200:
description: Lista.
content:
application/json:
schema:
type: object
properties:
items:
type: array
items:
$ref: '#/components/schemas/Partner'

/partners/{partnerId}/configurations:
post:
tags: [ Configuration ]
summary: Crea o actualiza configuracion de partner.
security:
- OAuth2ClientCredentials: [ nexus.configuration.manage ]
parameters:
- $ref: '#/components/parameters/PartnerIdPath'
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/PartnerConfiguration'
responses:
201:
description: Config creada.
200:
description: Config actualizada (upsert por configKey).

get:
tags: [ Configuration ]
summary: Lista configuraciones por partner.
security:
- OAuth2ClientCredentials: [ nexus.configuration.read ]
parameters:
- $ref: '#/components/parameters/PartnerIdPath'
- in: query
name: configKey
schema: { type: string }
responses:
200:
description: Lista.
content:
application/json:
schema:
type: array
items:
$ref: '#/components/schemas/PartnerConfiguration'