Canal ao vivo
No handoff simples, o vendedor entra no Sipru e busca o produto lá. No canal ao vivo ele não busca duas vezes: continua digitando no ERP, e o produto aparece sozinho na tela do Sipru, já com substitutos, cross-sell e upsell.
O canal é o handoff mais dois canos: um do ERP para o Sipru (empurrar produto) e outro do Sipru para o ERP (o webhook de carrinho).
1. Abrir o canal
Mesmo corpo do handoff, mais os campos de callback e o TTL:
curl -X POST https://app.sipru.ai/api/erp/channel \
-H "X-Sipru-Partner-Id: seu-partner-id" \
-H "Authorization: Bearer $SIPRU_PARTNER_SECRET" \
-H "Content-Type: application/json" \
-d '{
"tempQuoteId": "TMP-90321",
"vendedor": { "cpf": "12345678909" },
"locationId": "07526557000100",
"environment": "dev",
"cartCallbackUrl": "https://erp.parceiro.com.br/sipru/carrinho",
"cartCallbackAuth": { "mode": "bearer", "token": "..." },
"ttlSec": 14400
}'
{
"channelId": "8f2b...",
"contextId": "0f1c...",
"url": "https://app.sipru.ai/erp/session?token=...",
"expiresAt": "2026-08-31T18:42:11.000Z",
"channelExpiresAt": "2026-08-31T22:32:11.000Z",
"endpoints": {
"product": "https://app.sipru.ai/api/erp/channel/8f2b.../product",
"stream": "https://app.sipru.ai/api/erp/channel/8f2b.../stream"
}
}
Repare que há duas expirações, e elas servem a coisas diferentes:
expiresAt— a URL de entrada. Curta (minutos) e de uso único.channelExpiresAt— o canal em si. Longa, até 24 h (ttlSec, máximo 86400).
Redirecione o vendedor para url como no handoff. O canal fica válido durante
todo o atendimento, mesmo depois de o token de entrada ter sido consumido.
2. Empurrar produtos
A cada item que o vendedor lança no ERP, chame o endpoint product do canal:
curl -X POST https://app.sipru.ai/api/erp/channel/$CHANNEL_ID/product \
-H "X-Sipru-Partner-Id: seu-partner-id" \
-H "Authorization: Bearer $SIPRU_PARTNER_SECRET" \
-H "Content-Type: application/json" \
-d '{ "productCode": "72411", "quantity": 4 }'
{
"seq": 7,
"product": { "sku": "72411", "name": "Argamassa AC-III 20kg", "price": 34.9, "coinsReward": 12 },
"recommendations": { "substitutes": 3, "crossSell": 5, "upsell": 1 }
}
O termo pode vir de três formas, e a precedência é
productCode → ean → query: o código do parceiro é o mais
determinístico, e o texto livre é o último recurso — ele cobre justamente o caso
de o código não existir no catálogo Sipru.
quantity é opcional: valor ausente ou inválido vira 1, e acima de 9999 é
truncado.
Estados do canal
| HTTP | code | Significado |
|---|---|---|
| 404 | CHANNEL_NOT_FOUND | Canal inexistente — ou pertencente a outro parceiro. |
| 404 | PRODUCT_NOT_FOUND | O termo não achou nada no catálogo daquela loja. |
| 409 | CHANNEL_CLOSED | O atendimento já foi fechado. |
| 410 | CHANNEL_EXPIRED | Passou do channelExpiresAt. Abra um canal novo. |
Fechamento do atendimento
O vendedor fecha o atendimento na tela do Sipru, como venda ou como orçamento. Os dois coexistem para a mesma cotação — converter um orçamento em venda depois é o fluxo normal, e refechar o mesmo tipo sobrescreve os itens em vez de recusar.
No canal ao vivo, o fechamento não gera uma segunda gravação do pedido: cada item já foi empurrado para o seu ERP no clique de "adicionar", via webhook de carrinho. O fechamento é o registro do Sipru sobre o que foi fechado.