Pedir e consultar cotações
Cria uma cotação, lista as do cliente e consulta o detalhe.
Três rotas para o começo do fluxo: pedir a cotação a um seller, listar as que o cliente já abriu e consultar uma. Todas exigem o token do cliente e o módulo b2b-pricing ligado na loja.
Pedir cotação
Abre uma cotação (RFQ, request for quotation): o cliente escolhe um seller e uma lista de produtos desse seller e pede um preço especial. A cotação nasce em pending; o seller responde pelo painel dele e ela passa a quoted. Nada é cobrado nem reservado em estoque nesta etapa.
/api/v1/storefront/quotesClientePede a um seller o preço de uma lista de produtos
Corpo da requisição
vendor_iduuidobrigatórionotesstringitemsarrayobrigatórioPelo menos um item.
product_iduuidobrigatórioquantityintegerpadrão: 11 em silêncio.requested_price_centsintegernotesstringExemplo de requisição
curl -X POST "$BASE_URL/api/v1/storefront/quotes" \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{
"vendor_id": "7c1e5d3a-2b4f-4a6e-9c8d-1f0a3b5c7d9e",
"notes": "Preciso de entrega mensal",
"items": [
{
"product_id": "c3f92551-9dda-4fc7-b518-353d1c4e4035",
"quantity": 200,
"requested_price_cents": 1800
}
]
}'Resposta
{
"id": 42,
"user_id": "e0d4f8a1-5b2c-4d7e-9a31-6c8f0b2d4e6a",
"vendor_id": "7c1e5d3a-2b4f-4a6e-9c8d-1f0a3b5c7d9e",
"status": "pending",
"notes": "Preciso de entrega mensal",
"total_cents": 0,
"created_at": "2026-10-11T14:02:11Z",
"updated_at": "2026-10-11T14:02:11Z",
"user_email": "maria.souza@example.com",
"user_name": "Maria Souza",
"vendor_name": "Distribuidora Aurora",
"items": [
{
"id": 101,
"quote_id": 42,
"product_id": "c3f92551-9dda-4fc7-b518-353d1c4e4035",
"quantity": 200,
"requested_price_cents": 1800,
"notes": "",
"product_name": "Caneta esferográfica azul (cx 50)",
"product_sku": "CAN-AZ-50",
"product_price": 2490
}
]
}Campos da resposta
idintegeruser_iduuidvendor_iduuidstatusstringpendingquotednegotiatingacceptedconvertedrejectedexpirednotesstringvendor_notesstringtotal_centsinteger0 até o seller responder e passa a refletir os preços oferecidos (ou a última rodada de negociação).valid_untilstringcreated_atstringupdated_atstringuser_emailstringuser_namestringvendor_namestringitemsarrayItens da cotação (presente no detalhe e na criação).
idintegerproduct_iduuidquantityintegerrequested_price_centsintegeroffered_price_centsintegernotesstringproduct_namestringproduct_skustringproduct_priceintegerErros
| Status | Quando | Corpo de exemplo |
|---|---|---|
| 400 | Corpo inválido ou lista de itens vazia. | {"error":"at least one item is required"} |
| 401 | Sem token de cliente no cabeçalho Authorization. | {"error":"missing authorization header"} |
| 403 | O módulo b2b-pricing está desligado nesta loja. | {"error":"module_disabled","module":"b2b-pricing"} |
| 500 | vendor_id ausente, seller inexistente ou produto que não é do seller. A validação sai como 500 (veja o aviso). | {"error":"failed to create quote","detail":"vendor_id is required"} |
Listar minhas cotações
Devolve só as cotações do cliente dono do token, da mais nova para a mais antiga, com paginação. Cotações vencidas (valid_until no passado) são marcadas como expired no momento da leitura.
/api/v1/storefront/quotesClienteLista as cotações do cliente logado
Parâmetros de consulta
pageintegerpadrão: 1per_pageintegerpadrão: 2020.statusstringpendingquotednegotiatingacceptedconvertedrejectedexpiredallall não filtra.Exemplo de requisição
curl "$BASE_URL/api/v1/storefront/quotes?page=1&per_page=20&status=quoted" \
-H "Authorization: Bearer $TOKEN"Resposta
{
"quotes": [
{
"id": 42,
"user_id": "e0d4f8a1-5b2c-4d7e-9a31-6c8f0b2d4e6a",
"vendor_id": "7c1e5d3a-2b4f-4a6e-9c8d-1f0a3b5c7d9e",
"status": "quoted",
"notes": "Preciso de entrega mensal",
"total_cents": 420000,
"created_at": "2026-10-11T14:02:11Z",
"updated_at": "2026-10-11T14:02:11Z",
"user_email": "maria.souza@example.com",
"user_name": "Maria Souza",
"vendor_name": "Distribuidora Aurora",
"vendor_notes": "Preço válido para pedido único.",
"valid_until": "2026-10-25T23:59:59Z",
"item_count": 1
}
],
"total": 1,
"page": 1,
"per_page": 20,
"total_pages": 1
}Campos da resposta
quotesarrayitem_count e não traz items; busque o detalhe para ver as linhas.totalintegerpageintegerper_pageintegertotal_pagesintegerErros
| Status | Quando | Corpo de exemplo |
|---|---|---|
| 401 | Sem token de cliente no cabeçalho Authorization. | {"error":"missing authorization header"} |
| 403 | O módulo b2b-pricing está desligado nesta loja. | {"error":"module_disabled","module":"b2b-pricing"} |
Consultar cotação
Devolve a cotação inteira, com os itens e os preços oferecidos pelo seller. É a chamada para exibir a tela "Minha cotação" e para decidir se o botão Aceitar deve aparecer (status igual a quoted e valid_until no futuro).
/api/v1/storefront/quotes/{id}ClienteDetalhe de uma cotação com os itens
Parâmetros de caminho
idintegerobrigatórioExemplo de requisição
curl "$BASE_URL/api/v1/storefront/quotes/42" \
-H "Authorization: Bearer $TOKEN"Resposta
{
"id": 42,
"user_id": "e0d4f8a1-5b2c-4d7e-9a31-6c8f0b2d4e6a",
"vendor_id": "7c1e5d3a-2b4f-4a6e-9c8d-1f0a3b5c7d9e",
"status": "quoted",
"notes": "Preciso de entrega mensal",
"total_cents": 420000,
"created_at": "2026-10-11T14:02:11Z",
"updated_at": "2026-10-11T14:02:11Z",
"user_email": "maria.souza@example.com",
"user_name": "Maria Souza",
"vendor_name": "Distribuidora Aurora",
"items": [
{
"id": 101,
"quote_id": 42,
"product_id": "c3f92551-9dda-4fc7-b518-353d1c4e4035",
"quantity": 200,
"requested_price_cents": 1800,
"notes": "",
"product_name": "Caneta esferográfica azul (cx 50)",
"product_sku": "CAN-AZ-50",
"product_price": 2490,
"offered_price_cents": 2100
}
],
"vendor_notes": "Preço válido para pedido único.",
"valid_until": "2026-10-25T23:59:59Z"
}Campos da resposta
idintegeruser_iduuidvendor_iduuidstatusstringpendingquotednegotiatingacceptedconvertedrejectedexpirednotesstringvendor_notesstringtotal_centsinteger0 até o seller responder e passa a refletir os preços oferecidos (ou a última rodada de negociação).valid_untilstringcreated_atstringupdated_atstringuser_emailstringuser_namestringvendor_namestringitemsarrayItens da cotação (presente no detalhe e na criação).
idintegerproduct_iduuidquantityintegerrequested_price_centsintegeroffered_price_centsintegernotesstringproduct_namestringproduct_skustringproduct_priceintegerErros
| Status | Quando | Corpo de exemplo |
|---|---|---|
| 400 | O id não é um número. | {"error":"invalid quote id"} |
| 401 | Sem token de cliente no cabeçalho Authorization. | {"error":"missing authorization header"} |
| 403 | A cotação é de outro cliente. | {"error":"quote does not belong to this user"} |
| 403 | O módulo b2b-pricing está desligado nesta loja. | {"error":"module_disabled","module":"b2b-pricing"} |
| 404 | Cotação inexistente. | {"error":"quote not found"} |