Saltar al contenido principal

Reference · Modelos de datos

Esta página enumera los DTOs públicos de Neuroon: el contrato que firma el widget contra la API. Los tipos canónicos del widget están en y los del backend en api/src/main/java/.../dto/.

Product

Producto tal como lo recibe el widget desde SearchResponse.results[].

CampoTipoRequeridoNotas
idstringUUID Neuroon.
shopIdstringUUID del shop.
shopNamestringNombre del shop.
namestringNombre del producto.
descriptionstringno
pricenumberPrecio regular.
salePricenumbernoSi presente, calcula descuento.
currencystringISO 4217.
urlstringURL final (host).
imageUrlstringno
categoriesstring[]
tagsstring[]
brandsstring[]
inStockboolean
scorenumbernoScore interno de relevancia (debug).
ratingnumberno0-5.
reviewCountnumberno
stockCountnumbernoSi ≤ 5, el widget muestra badge "Pocas unidades".
externalIdstringnoID del host (WC post_id, etc.) usado para conversion tracking.
badgeenumnoBESTSELLER | TRENDING | TOP_RATED.
aiReasonstringnoRazón conversacional ("ideal para asfalto").
aiScorenumbernoScore IA del re-ranker.

SearchResponse

Respuesta canónica de GET /api/widget/search y POST /api/widget/search. Tipo.

CampoTipoRequeridoNotas
querystringQuery normalizada tras post-process.
resultsProduct[]
totalnumberTotal de productos que cumplen filtros.
searchLogIdstringIdentificador del turno (attribution).
queryTimeMsnumberLatencia del backend.
intentIdstringnoDetección de intent.
conversationIdstringnoContinuación entre turnos.
isNewConversationbooleannotrue si arrancó conversación.
turnNumbernumberno1, 2, 3…
filtersAppliedFiltersAppliednoFiltros aplicados al ranking.
availableFiltersAvailableFiltersnoDrawer de filtros.
guidedFiltersGuidedFilter[]noPreguntas dinámicas.
querySuggestionsQuerySuggestion[]noRefinamientos sugeridos.
topProductsTopProduct[]noCarrusel destacado.
aiResponsestringnoTexto conversacional.
comparisonComparisonResponseno
clarificationClarificationResultno
buyersGuideBuyersGuideno
kitProductKitno
followUpFollowUpResponseno
recommendationsRecommendationsResponseno
cartActionCartActionnoAcción solicitada al widget.
quickRepliesQuickReply[]noChips de respuesta rápida.
responseLanguagestringnoISO del idioma del agente (es, en…).

CartState

interface CartState {
items: CartItem[]
totalItems: number
subtotal: string // formateado por el host: "232,48 €"
total: string // formateado por el host
currency: string // ISO 4217
shipping?: CartShippingInfo
}
Campo CartItemTipoRequeridoNotas
keystringIdentificador único del item en el carrito.
idstringproductId Neuroon.
externalIdstringnoID del host (WC post_id).
namestring
pricestringFormateado por el host.
quantitynumber
imagestringno
urlstringno
variantstringno"Talla: 42, Color: Negro".
maxQuantitynumberno

CartShippingInfo añade freeShippingThreshold, currentAmount, delta, thresholdMet, destinationCountry, availableCountries[], formattedThreshold y formattedDelta. Ver cart-integration para el flujo.

Event (analytics)

CampoTipoRequeridoNotas
typestringsnake_case (category_click, kit_view…).
searchLogIdstringrecomendadoVincula con turno de búsqueda.
metadataobjectnoPares libres (sin PII).
timestampstring ISO-8601noSi se omite, lo pone el backend.

CartAction

type CartActionType = 'REMOVE' | 'UPDATE_QUANTITY' | 'ADD_SUGGESTION' | 'CLEAR' | 'SET_DESTINATION_COUNTRY'

interface CartAction {
type: CartActionType
productId?: string
externalProductId?: string
externalId?: string // alias legacy
itemKey?: string
newQuantity?: number
countryCode?: string // ISO-3166-1 alpha-2 mayúsculas
confirmationPrompt?: string
product?: CartActionProduct // sólo en ADD_SUGGESTION
}

Suggestion

interface Suggestion {
type: 'query' | 'category' | 'brand' | 'product'
text: string
count?: number
icon?: string
product?: Product
}

GuidedFilter

interface GuidedFilter {
id: string
question: string
type: 'SINGLE_CHOICE' | 'MULTI_CHOICE' | 'RANGE'
priority: number
options: FilterOptionDTO[]
}

interface FilterOptionDTO {
label: string
filter: Record<string, unknown>
count?: number
isSelected?: boolean
isRecommended?: boolean
detectionSource?: 'QUERY_ANALYSIS' | 'TRENDING' | 'INTENT_BASED'
detectionReason?: string
}

Próximas lecturas