Handoff SSO de cotação
O vendedor está com uma cotação aberta no seu ERP. Ele clica em um botão e cai no catálogo Sipru autenticado na conta real dele, com a cotação e o cliente já identificados — sem digitar login.
O fluxo
1. Pedir a URL
curl -X POST https://app.sipru.ai/api/erp/sso/session \
-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" },
"cliente": {
"cnpj": "04252011000110",
"razaoSocial": "Construtora Alvorada Ltda",
"nomeFantasia": "Alvorada Materiais"
},
"locationId": "07526557000100",
"pricingPolicy": "margem2",
"environment": "dev"
}'
{
"url": "https://app.sipru.ai/erp/session?token=eyJ1aWQ...",
"expiresAt": "2026-08-31T18:42:11.000Z",
"contextId": "0f1c8b2e-..."
}
Os campos, tipos e limites estão na referência da API. Três pontos merecem destaque:
tempQuoteIdé obrigatório e é a chave de idempotência. É por ele que o Sipru evita duplicar o pedido em reenvios: uma gravação por cotação,409nas demais.vendedor.cpfprecisa corresponder a uma conta Sipru já existente. Não há provisionamento automático — CPF desconhecido devolveVENDEDOR_NOT_FOUND.companyIdé opcional. Omitindo-o, olocationIdé tratado como o CNPJ da loja e o Sipru resolve a empresa e a loja pelo catálogo. É o caminho mais simples para quem não quer manter um mapa de identificadores.
2. Redirecionar o vendedor
Mande o navegador para a url devolvida. Nada mais é necessário.
O resgate é atômico: um segundo clique ou um reload da mesma URL responde
ERP_SSO_TOKEN_ALREADY_USED. Isso é a proteção contra replay, não um defeito.
Para testar de novo, gere uma URL nova — não aumente o TTL nem tente
reaproveitar o link.
A URL também expira sozinha em 10 minutos (ERP_SSO_TOKEN_INVALID). Gere-a no
momento do clique, não antes.
Códigos de erro
Ramifique pelo code, não pela mensagem — a mensagem pode mudar.
| HTTP | code | Significado |
|---|---|---|
| 400 | — | Falta tempQuoteId, vendedor.cpf ou locationId, ou o JSON é inválido. |
| 400 | STORE_NOT_FOUND | companyId foi omitido e o locationId (lido como CNPJ) não corresponde a nenhuma loja cadastrada. |
| 401 | — | Credencial de parceiro ausente, inválida ou revogada. |
| 404 | VENDEDOR_NOT_FOUND | O CPF não corresponde a nenhuma conta Sipru. |
| 401 | ERP_SSO_TOKEN_INVALID | (em /erp/session) Link expirado ou adulterado. |
| 401 | ERP_SSO_TOKEN_ALREADY_USED | (em /erp/session) Link já usado. |
| 503 | — | Dependência do Sipru indisponível. É seguro repetir. |
3. O pedido volta para o ERP
Quando o vendedor finaliza o carrinho, o Sipru grava as linhas do pedido na
tabela pedido_sipru do seu banco — ver
Retorno do pedido.