Endpoint - Default results
Devuelve los productos que el modal del SDK muestra cuando se abre sin query (el cliente todavia no ha tecleado nada). El merchant elige el modo desde Widget Studio: nada, mas buscados, destacados, recientes, aleatorios o (proximamente) mas vendidos.
Cacheado 5 minutos en Redis por (tenant, dataSource, modo, limit). El TTL se invalida cuando se reindexa el catalogo (los hits dejan de ser representativos). El modo random NO se cachea: la gracia es que cambie con cada apertura.
GET /api/v1/widget/default-results
Parametros
| Parametro | Tipo | Default | Descripcion |
|---|---|---|---|
mode | string | (requerido) | Uno de: popular, best_sellers, featured, latest, random. El modo none no llega al endpoint (el SDK no llama). |
limit | int | 8 | Cantidad de hits (1-24). El SDK pide 4 en mobile portrait, 6 en mobile landscape, 8 en desktop. |
source | string | (primer dataSource) | Slug del data source (productos, recetas, etc.). |
Autenticacion
Mismo Bearer que /search. Scopes aceptados: public, panel_sync.
Ejemplo
curl "https://app.mibizum.io/api/v1/widget/default-results?mode=featured&limit=8" \
-H "Authorization: Bearer mb_pk_live_..."Respuesta 200
{
"hits": [
{
"id": "sku-001",
"name": "Crema hidratante",
"price": 24.90,
"image_url": "https://cdn.../sku-001.jpg",
"featured": true
}
],
"mode": "featured",
"comingSoon": false,
"cached": true,
"dataSource": { "slug": "productos", "displayName": "Productos", "docType": "product" }
}| Campo | Tipo | Descripcion |
|---|---|---|
hits | array | Documentos del indice, mismo shape que /search. Vacio si no hay datos o el modo es coming-soon. |
mode | string | Modo efectivamente servido (eco del parametro). |
comingSoon | bool | true cuando el modo pedido requiere infra no enchufada todavia (hoy solo best_sellers). El SDK degrada al placeholder "Escribe para buscar". |
cached | bool | true si la respuesta viene de Redis. Informativo. |
dataSource | object | Slug + displayName + docType del catalogo consultado. |
Comportamiento por modo
| Modo | Como se computa | Requisitos |
|---|---|---|
popular | Top items por click count en SearchClick ultimos 30 dias. | Tracking de clicks (el SDK ya lo manda). |
best_sellers | (proximamente) Top items por conversion enlazada a una busqueda. | Necesita link WidgetEvent.purchase -> Search, no enchufado todavia. Devuelve comingSoon: true. |
featured | Documentos con featured = true en el indice. | Cero coste, mismo flag del badge "Top". |
latest | Sort por created_at DESC. | Cero coste. |
random | Probe + offset random (catalogos grandes) o shuffle local (pequenos). | Cero coste. NO cacheado. |
Errores
| Status | Codigo | Causa |
|---|---|---|
400 | invalid_params | mode no esta en el enum o limit fuera de rango. |
401 | unauthorized | Bearer ausente o invalido. |
404 | no_data_source | Tenant sin catalogos configurados. |
200 + degraded: true | (degradacion graceful) | El motor de busqueda fallo; devolvemos hits: [] para no romper el modal. |
Settings relacionados en Widget Studio
El merchant configura todo esto desde el panel; el endpoint solo expone el resultado. Settings nuevos del sprint:
defaultResultsMode(nonepor defecto): que modo servir.showOuterBorder(false): pinta un borde alrededor del modal en desktop.outerBorderColor(#E5E7EB): color hex del borde.outerBorderWidth(1): grosor 1-4 px.cardFontScale(1.0): multiplicador del font-size de la tarjeta, rango 0.8 - 1.4.desktopWidthMode(autopor defecto):auto= el SDK mide en el navegador del visitante el ancho real del contenedor de contenido de la web del merchant y ajusta el overlay a eso (cero config se ve bien; se adapta solo a ordenador grande vs portátil).fixed= usadesktopMaxWidthPx. Si la web es full-bleed y no hay contenedor centrado que medir,autocae adesktopMaxWidthPx.
Todos viven en el JSON del perfil del widget (widget_config_profiles.config) y se sirven al SDK via /api/v1/config.