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 y los del backend.

Product​

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

CampoTipoRequeridoNotas
idstringsíUUID Neuroon.
shopIdstringsíUUID del shop.
shopNamestringsíNombre del shop.
namestringsíNombre del producto.
descriptionstringno
pricenumbersíPrecio regular.
salePricenumbernoSi presente, calcula descuento.
currencystringsíISO 4217.
urlstringsíURL final (host).
imageUrlstringno
categoriesstring[]sí
tagsstring[]sí
brandsstring[]sí
inStockbooleansí
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
querystringsíQuery normalizada tras post-process.
resultsProduct[]sí
totalnumbersíTotal de productos que cumplen filtros.
searchLogIdstringsíIdentificador del turno (attribution).
queryTimeMsnumbersíLatencia 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
keystringsíIdentificador único del item en el carrito.
idstringsíproductId Neuroon.
externalIdstringnoID del host (WC post_id).
namestringsí
pricestringsíFormateado por el host.
quantitynumbersí
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
typestringsísnake_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​