Fechar cesta
Quem fecha a cesta é o ERP. Quando isso acontece, o ERP faz uma chamada no canal com os itens finais, e o Sipru registra o que foi fechado.
Não é uma segunda gravação do pedido: os itens já estão no ERP, lançados pelo próprio ERP ou vindos do Siprinho.
A rota
Use o endpoints.cesta que voltou na abertura do canal:
POST $SIPRU_BASE_URL/api/erp/channel/{channelId}/cesta
/orcamento é o nome antigo de /cesta, mantido por compatibilidade: responde igual.
Integrações novas usam /cesta.
curl -X POST $SIPRU_BASE_URL/api/erp/channel/$CHANNEL_ID/cesta \
-H "Authorization: Bearer $SIPRU_SECRET" \
-H "X-Sipru-Partner-Id: $SIPRU_PARTNER_ID" \
-H "X-ERP-Name: $ERP_NAME" \
-H "X-ERP-Version: $ERP_VERSION" \
-H "X-Local-MAC-Address: $DEVICE_MAC_ADDRESS" \
-H "X-Local-Machine-Name: $LOCAL_MACHINE_NAME" \
-H "X-CNPJ: $CNPJ_LOJA" \
-H "X-Codigo-Externo-Rede: $CODIGO_DA_REDE" \
-H "X-Codigo-Externo-Loja: $CODIGO_DA_LOJA" \
-H "Content-Type: application/json" \
-d '{
"items": [
{
"sku": "<codigo-do-produto>",
"quantity": 1,
"price": 0,
"vendedor": {
"cpf": "<cpf-do-vendedor>",
"email": "<email-do-vendedor>",
"login": "<login-do-vendedor>",
"codigoExterno": "<codigo-do-vendedor-no-erp>"
}
}
],
"cestaId": "<id-da-cesta>",
"cestaCodigoExterno": "<codigo-externo-da-cesta>",
"cestaAbertaEm": "<data-de-abertura-da-cesta>",
"cestaFechadaEm": "<data-de-fechamento-da-cesta>"
}'
Os headers são os mesmos de toda chamada à Sipru — ver Headers.
O corpo
| Campo | Tipo | Obrigatório | Descrição |
|---|---|---|---|
items | array | sim | Os itens finais da cesta no ERP. De 1 a 200 linhas. |
items[].sku | string | sim | Código do produto no ERP (o mesmo productCode). |
items[].quantity | número | sim | Quantidade. Maior que zero. |
items[].price | número | sim | Preço unitário fechado, a partir de zero. |
items[].vendedor | objeto | — | Vendedor que lançou o item. Envie os identificadores que tiver: cpf, email, login, codigoExterno ou outro com que o ERP trabalhe. |
cestaId | string | — | Identificador da cesta no ERP. |
cestaCodigoExterno | string | — | Código externo da cesta no ERP. |
cestaAbertaEm | data e hora | — | Quando a cesta foi aberta no ERP. |
cestaFechadaEm | data e hora | — | Quando a cesta foi fechada no ERP. |
Mande todos os itens da cesta, inclusive os que o vendedor lançou direto no ERP: o Sipru só conhece a cesta inteira por aqui.
Uma linha inválida — sem sku, com quantity menor ou igual a zero ou price negativo — recusa a
requisição inteira, em vez de gravar o resto em silêncio: o ERP não fecha achando que mandou
tudo. Qualquer outro campo, no corpo ou em cada linha, é opcional: a Sipru guarda o que vier, mesmo
sem usar ainda em nenhuma regra, e ele nunca recusa o fechamento sozinho.
A resposta
{
"success": true,
"id": "temp-12345:cesta",
"documentType": "cesta",
"tempQuoteId": "temp-12345",
"quoteId": null,
"itemCount": 3,
"total": 78.73,
"closedCount": 12,
"createdAt": "2026-09-14T11:46:27.592Z",
"updatedAt": "2026-10-13T21:44:22.335Z",
"extra": {
"cestaId": "7f11e004-0498-4892-8b34-096838fffeda",
"cestaCodigoExterno": "PV-000126",
"vendedorInicial": {
"cpf": "31793058865"
},
"clienteCpfCnpj": "01234567891025",
"cestaAbertaEm": "2026-09-10T10:41:21.0695393+00:00",
"cestaFechadaEm": "2026-09-14T20:56:21.0695393+00:00"
}
}
ididentifica o registro do fechamento: a cotação temporária seguida de:cesta.itemCountetotalsão as linhas gravadas e a soma dequantity × price.closedCountconta os fechamentos naquele atendimento. Refechar a mesma cesta sobrescreve o registro anterior e soma 1 aclosedCount.quoteIdvemnullenquanto a cotação temporária não tiver virado cotação no ERP.createdAté o primeiro fechamento;updatedAt, o último.extratraz os campos opcionais que vieram no corpo (comocestaIdecestaAbertaEm), guardados como vieram. A Sipru ainda não usa esses campos em nenhuma regra.
O canal continua aberto depois do fechamento: o ERP pode corrigir a cesta e fechá-la de novo.
Quando a cesta virar pedido no ERP, informe a venda com o número do pedido.
Erros
| HTTP | code | Significado |
|---|---|---|
| 400 | — | items ausente ou vazio, mais de 200 linhas, ou linha sem sku/quantity/price válidos. |
| 401 | — | Credencial de parceiro ausente ou inválida. |
| 404 | CHANNEL_NOT_FOUND | Canal inexistente — ou pertencente a outro parceiro. |
| 404 | CHANNEL_PENDING_SIGNUP | O vendedor ainda não concluiu o cadastro na Sipru — ver Vendedor sem conta Sipru. |
| 409 | CHANNEL_CLOSED | O canal já foi encerrado. |
| 500 | — | Erro inesperado no servidor. |
| 503 | — | Falha ao gravar o fechamento. Pode repetir. |
O contrato formal está em
closeChannelAsCesta na referência da API.