Insights
Lê os insights da Venddor Intelligence para o seller, cria a aba de insights, fixa um insight como card e pede o texto explicativo de um card.
A Venddor Intelligence observa a operação do seller e aponta o que merece atenção, por exemplo pedidos atrasados ou estoque baixo. Cada aviso é um insight: um número com um texto curto. Insights não são guardados: são calculados a cada leitura (com cache curto). Para guardar um, fixe-o (pin) e ele vira um card normal.
Listar insights
/api/v1/vendor/dashboards/insightsSellerListar insights
Cabeçalhos
AuthorizationstringobrigatórioBearer $TOKEN. Token de acesso do usuário seller (veja Tokens).Parâmetros de consulta
langstringAccept-Language.refreshbooleanpadrão: falsetrue ignora o cache e recalcula.Exemplo de requisição
curl -X GET "$BASE_URL/api/v1/vendor/dashboards/insights?lang=pt-BR" \
-H "Authorization: Bearer $TOKEN"Resposta
{
"available": true,
"insights": [
{
"key": "signal:late_orders",
"source": "signal",
"severity": "warning",
"title_key": "admin.dashboards.vi.signal.lateOrders.title",
"body_key": "admin.dashboards.vi.signal.lateOrders.body",
"body_params": {
"count": "2"
},
"narrative": "Foram registrados 2 pedidos com atraso na entrega. Revise a logística para cumprir os prazos.",
"narrative_source": "llm",
"icon": "alerta",
"facts": [
{
"label_key": "admin.dashboards.vi.fact.lateOrders",
"value": "2",
"raw": 2,
"unit": "count",
"tone": "down"
}
],
"cta_url": "/admin/orders",
"pinnable": true,
"spec": {
"spec_version": 1,
"kind": "query",
"title": "Pedidos atrasados",
"viz": {
"type": "kpi",
"snippet_id": "vi-late-orders"
},
"query": {
"entity": "orders",
"period": {
"mode": "relative",
"last_n_days": 90
},
"metrics": [
{
"id": "atrasados",
"kind": "agg",
"agg": "count",
"field": "orders.id"
}
],
"filter": {
"field": "orders.promised_delivery_at",
"cmp": "overdue"
}
}
},
"width": 1,
"height": 1,
"generated_at": "2026-10-11T21:04:42.204782955Z"
}
],
"generated_at": "2026-10-11T21:04:42.204782955Z",
"cached": false,
"narrator_ready": true
}Campos da resposta
availablebooleanfalse quando não há insights a mostrar; veja reason.reasonstringavailable é false: vi_not_configured ou no_data.insightsobject[]Os avisos.
insights[].keystringsignal:late_orders). Use-o em pin.insights[].sourcestringsignalpulseproactiveinsights[].severitystringinfowarningopportunityinsights[].title_keystringsignal. Nos demais vêm title e body já escritos.insights[].body_keystringbody_params.insights[].narrativestringinsights[].narrative_sourcestringllm se o parágrafo foi escrito pela Venddor Intelligence, template se é um texto padrão.insights[].iconstringinsights[].factsobject[]label_key, value (formatado), raw, unit (cents, count, percent, text) e tone.insights[].cta_urlstringinsights[].pinnablebooleaninsights[].specobjectinsights[].widthintegerinsights[].heightintegerinsights[].generated_atstringgenerated_atstringcachedbooleantrue se veio do cache.narrator_readybooleanfalse quando a redação automática não está disponível e os textos vêm padronizados.Erros
| Status | Quando | Corpo de exemplo |
|---|---|---|
| 401 | Token ausente, inválido, expirado ou revogado. | invalid or expired token |
| 403 | O token não é de um usuário seller, ou a loja ainda está em análise de cadastro. | {"error":"vendor_pending_review"} |
| 500 | Falha ao gerar. | {"error":"failed to generate insights"} |
Criar a aba de insights
Garante que o seller tenha a aba especial de insights, criando-a se faltar. Repetir a chamada é seguro.
/api/v1/vendor/dashboards/insights/tabSellerCriar a aba de insights
Cabeçalhos
AuthorizationstringobrigatórioBearer $TOKEN. Token de acesso do usuário seller (veja Tokens).Content-Typestringobrigatórioapplication/json.Corpo da requisição
namestringExemplo de requisição
curl -X POST "$BASE_URL/api/v1/vendor/dashboards/insights/tab" \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{}'Resposta
{
"dashboard": {
"id": "f35b536f-51cc-4468-b5fc-198c81bbe910",
"slug": "vi-insights",
"name": "Insights da VI",
"panel": "V",
"vendor_id": "94bd7e9a-fdad-4d01-8fc2-ba9d677d8b36",
"visibility": "P",
"is_system": false,
"is_default": false,
"position": 900,
"icon": "brilho",
"color": "",
"default_period": {
"mode": "preset",
"preset": "last30"
},
"kind": "vi_insights"
},
"kind": "vi_insights"
}Erros
| Status | Quando | Corpo de exemplo |
|---|---|---|
| 401 | Token ausente, inválido, expirado ou revogado. | invalid or expired token |
| 403 | O token não é de um usuário seller, ou a loja ainda está em análise de cadastro. | {"error":"vendor_pending_review"} |
| 503 | Motor de insights não configurado nesta loja. | {"error":"insights engine not configured"} |
| 500 | Falha ao criar. | {"error":"failed to ensure insights tab"} |
Fixar insight como card
Transforma um insight em card normal numa das abas do seller. O card guarda a mesma spec do insight, então mostra o mesmo número que o usuário viu.
/api/v1/vendor/dashboards/insights/pinSellerFixar insight como card
Cabeçalhos
AuthorizationstringobrigatórioBearer $TOKEN. Token de acesso do usuário seller (veja Tokens).Content-Typestringobrigatórioapplication/json.Corpo da requisição
keystringobrigatóriokey do insight, de Listar insights.dashboard_iduuidwidthintegerheightintegerorderintegerExemplo de requisição
curl -X POST "$BASE_URL/api/v1/vendor/dashboards/insights/pin" \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{"key": "signal:late_orders", "dashboard_id": "931b3fc7-e703-4cac-bcbc-5c79690f02a8"}'Resposta
{
"card": {
"id": "94c6b3ff-de9c-4552-8a12-e199e8427f57",
"dashboard_id": "931b3fc7-e703-4cac-bcbc-5c79690f02a8",
"spec": {
"spec_version": 1,
"kind": "query",
"title": "Receita do Mês",
"viz": {
"type": "kpi",
"snippet_id": "seller-kpi-revenue-month",
"icon": "cifrao",
"accent": "#0044FF",
"number_format": {
"style": "currency_cents"
}
},
"query": {
"entity": "orders",
"period": {
"mode": "preset",
"preset": "thisMonth"
},
"metrics": [
{
"id": "receita",
"kind": "catalog",
"ref": "orders.revenue"
}
]
}
},
"spec_version": 1,
"kind": "Q",
"title": "Pedidos atrasados",
"grid_row": 0,
"grid_col": 0,
"width": 1,
"height": 1,
"order": 0,
"status": "A",
"source": "M",
"template_slug": "fab-v-kpi-revenue-month",
"created_at": "2026-10-11T21:04:20.327443Z",
"updated_at": "2026-10-11T21:04:20.327443Z"
},
"dashboard_id": "931b3fc7-e703-4cac-bcbc-5c79690f02a8"
}Erros
| Status | Quando | Corpo de exemplo |
|---|---|---|
| 404 | Insight não encontrado (talvez já não se aplique) ou aba inexistente. | {"error":"insight not found"} |
| 422 | key ausente, insight que não pode virar card, aba de destino é a de insights, ou nenhuma aba editável. | {"error":"insight is not pinnable"} |
| 503 | Motor de insights não configurado. | {"error":"insights engine not configured"} |
| 401 | Token ausente, inválido, expirado ou revogado. | invalid or expired token |
| 403 | O token não é de um usuário seller, ou a loja ainda está em análise de cadastro. | {"error":"vendor_pending_review"} |
Texto explicativo de um card
Executa o card e devolve um parágrafo curto que comenta os números dele. O texto é guardado por um tempo; a mesma leitura repetida volta do cache.
/api/v1/vendor/dashboards/cards/{cardId}/narrativeSellerTexto explicativo de um card
Cabeçalhos
AuthorizationstringobrigatórioBearer $TOKEN. Token de acesso do usuário seller (veja Tokens).Content-Typestringobrigatórioapplication/json.Parâmetros de caminho
cardIduuidobrigatórioCorpo da requisição
periodobjectmode (inherit, preset, fixed, relative), preset, from, to, last_n_days.refreshbooleantrue gera um texto novo.langstringExemplo de requisição
curl -X POST "$BASE_URL/api/v1/vendor/dashboards/cards/94c6b3ff-de9c-4552-8a12-e199e8427f57/narrative" \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{"lang": "pt-BR"}'Resposta
{
"text": "A receita do mês soma R$ 225,00 até agora. É um começo de mês tranquilo; vale acompanhar os pedidos pendentes.",
"source": "llm",
"dataset_hash": "312585e798d265cb65d345c4d71a3b89fe7b2858565202c0a164d1381b3547fd",
"cached": false,
"generated_at": "2026-10-11T21:10:00Z",
"narrator_ready": true
}Campos da resposta
textstringsourcestringllm ou template.dataset_hashstringcachedbooleangenerated_atstringnarrator_readybooleanerrorobject200): code e message_key.Erros
| Status | Quando | Corpo de exemplo |
|---|---|---|
| 404 | Card inexistente ou de aba que o seller não vê. | {"error":"card not found"} |
| 422 | Spec guardada inválida. | {"error":"invalid stored spec"} |
| 503 | Motor de insights não configurado. | {"error":"insights engine not configured"} |
| 500 | Falha ao executar ou redigir. | {"error":"failed to narrate card"} |
| 401 | Token ausente, inválido, expirado ou revogado. | invalid or expired token |
| 403 | O token não é de um usuário seller, ou a loja ainda está em análise de cadastro. | {"error":"vendor_pending_review"} |