🛍️ Pedidos do Cliente
📋 Visão Geral
O módulo de Pedidos do Cliente permite que o cliente autenticado consulte, acompanhe e interaja com seus pedidos de forma autônoma.
Os pedidos são organizados em dois níveis:
- Grupo de Pedido (
OrderGroup) — representa a compra completa, agrupando todas as remessas geradas a partir de um único carrinho. Identifica o pedido pelo campocode(ex:#000123). - Pedido (
Order) — representa uma remessa individual dentro do grupo, associada a um armazém específico. Um grupo pode ter múltiplos pedidos quando os itens são atendidos por armazéns diferentes. - Cliente — dono dos pedidos, identificado pelo token de autenticação
- Grupo de Pedido (
OrderGroup) — compra completa originada de um carrinho - Pedido (
Order) — remessa individual dentro do grupo, vinculada a um armazém - Histórico (
OrderHistory) — registro de todas as alterações de status e ações sobre o pedido - Observação (
OrderObservation) — mensagem textual criada pelo cliente em um grupo de pedido - Comprovante de Pagamento — arquivo enviado pelo cliente para confirmar pagamento manual
PublicAuth— autenticação do canal de venda (identificação da loja/aplicação)CustomerAuth— token do cliente autenticado, enviado via headerAuthorization: Bearer {customerToken}- O cliente só acessa pedidos vinculados ao seu
customerId— não é possível consultar pedidos de outros clientes. - Os campos
reservesepaymentLogssão excluídos automaticamente das respostas ao cliente por razões de segurança e privacidade. - O comprovante de pagamento aceita arquivos nos formatos
jpeg,png,jpg,pdf,docxedoc, com tamanho máximo de 2 MB. - As observações criadas pelo cliente ficam registradas no grupo de pedido e podem ser visualizadas pela equipe administrativa.
Além da consulta, o cliente pode criar observações em um grupo de pedido e enviar comprovantes de pagamento para métodos que exigem confirmação manual.
🔄 Entidades Envolvidas
🗂️ Estrutura do Grupo de Pedido
| Campo | Tipo | Descrição |
|---|---|---|
id | integer | Identificador único do grupo de pedido |
code | string | Código legível do pedido exibido ao cliente (ex: #000123) |
cartId | string | ID do carrinho que originou o pedido |
tradePolicyId | integer | ID da política comercial |
salesChannelDomain | string | Domínio do canal de venda onde o pedido foi realizado |
currency | string | Moeda do pedido (ex: BRL) |
createdAt | datetime | Data e hora de criação do grupo |
issuedAt | datetime | Data e hora de emissão do pedido |
📦 Estrutura do Pedido (Remessa)
| Campo | Tipo | Descrição |
|---|---|---|
id | integer | Identificador único da remessa |
orderGroupId | integer | ID do grupo ao qual esta remessa pertence |
orderStatusId | integer | ID do status atual da remessa |
productStorageId | integer | ID do armazém responsável por atender esta remessa |
status | object | Objeto com dados do status atual |
items | array | Itens incluídos nesta remessa |
payments | array | Pagamentos associados ao grupo |
shipping | object | Dados de frete e entrega |
values | object | Valores detalhados (subtotal, descontos, frete, total) |
addresses | array | Endereços de entrega e cobrança |
histories | array | Histórico de alterações da remessa |
🕘 Estrutura do Histórico
| Campo | Tipo | Descrição |
|---|---|---|
id | integer | Identificador único do registro |
origin | string | Origem da ação (ex: customer, admin, system) |
action | string | Ação que gerou o histórico |
newOrderStatusId | integer | Novo status aplicado, quando aplicável |
before | object/null | Estado anterior aos dados alterados |
after | object/null | Estado posterior aos dados alterados |
createdAt | datetime | Data e hora do registro |
🔐 Permissão
Todas as rotas desta seção exigem dupla autenticação:
> Requisições sem os dois tokens serão rejeitadas com erro de autenticação.
📌 Notas e Considerações
🛍️ Listagem de Pedidos do Cliente
/customer/orders
Lista todos os pedidos do cliente autenticado com suporte a filtros e paginação
📋 Descrição
Endpoint responsável por listar todos os pedidos (remessas) do cliente autenticado.
Retorna a lista paginada de pedidos do cliente no canal de venda atual, permitindo filtros por status, data e outros critérios.
🔐 Permissão
CustomerAuth— autenticação do cliente via token JWT
📝 Parâmetros
🏷️ Headers Obrigatórios
| Header | Valor | Descrição |
|---|---|---|
Authorization | Bearer {token} | Token de autenticação do cliente |
📊 Campos de Condição Disponíveis
| Campo | Tipo | Descrição |
|---|---|---|
id | integer | Filtrar por ID do pedido |
orderGroupId | integer | Filtrar por ID do grupo de pedido |
orderStatusId | integer | Filtrar pelo ID do status do pedido |
📊 Campos de Ordenação Disponíveis
| Campo | Descrição |
|---|---|
id | Ordenar pelo identificador do pedido |
💡 Exemplo de Requisição
1curl --request GET \2 --url '{{MAIN_URL}}/customer/orders' \3 --header 'Authorization: Bearer SEU_TOKEN_AQUI'✅ Resposta de Sucesso
HTTP Status: 200 OK
1{2 "status": true,3 "data": {4 "registers": [5 {6 "id": 101,7 "orderGroupId": 55,8 "orderStatusId": 3,9 "productStorageId": 1,10 "status": {11 "id": 3,12 "name": "Aprovado"13 }14 }15 ],16 "pagination": {17 "limit": 10,18 "offset": 0,19 "pages": 2,20 "registers": 1521 }22 }23}⚠️ Possíveis Erros
> Os cenários abaixo representam os principais erros que podem ocorrer neste endpoint, servindo como referência para entendimento e tratamento das falhas.
| Código do Erro | HTTP | Descrição |
|---|---|---|
EXPIRED_AUTH_TOKEN | 401 | Token de autenticação expirado |
INVALID_AUTH_TOKEN | 401 | Token de autenticação inválido ou ausente |
INVALID_CUSTOMER | 401 | Cliente associado ao token indisponível ou desativado |
🛍️ Detalhe de Pedido do Cliente
/customer/orders/{orderId}
Retorna os dados completos de uma remessa do cliente autenticado
📋 Descrição
Endpoint responsável por retornar o detalhe completo de uma remessa do cliente autenticado.
> Remessa vs. Grupo de Pedido: Uma compra gera um grupo de pedido (orderGroup) que pode conter uma ou mais remessas. Cada remessa (order) corresponde a um armazém separado. Este endpoint retorna os dados de uma remessa específica, mas sempre inclui o resumo do grupo (orderGroup) ao qual ela pertence.
🔐 Permissão
CustomerAuth— autenticação do cliente via token JWT
📌 Campos sempre presentes na resposta
Os campos abaixo são retornados independente do parâmetro fields:
| Campo | Descrição |
|---|---|
id, orderGroupId, productStorageId, orderStatusId | Identificadores base da remessa |
marketplaceOrderId | ID da remessa no marketplace (quando aplicável) |
masked | Indica se dados sensíveis estão mascarados |
orderGroup | Resumo do grupo de pedido ao qual a remessa pertence |
productStorage | Dados completos do armazém responsável pela remessa |
status | Status atual da remessa |
items | Itens da remessa com dados de produto |
discounts, additions | Descontos e acréscimos (sempre presentes, null se não aplicável) |
reserves, invoice, histories | Sempre presentes, null se não aplicável |
📝 Parâmetros
🏷️ Headers Obrigatórios
| Header | Valor | Descrição |
|---|---|---|
Authorization | Bearer {token} | Token de autenticação do cliente |
🔗 Parâmetros de URL
| Parâmetro | Tipo | Obrigatório | Descrição |
|---|---|---|---|
orderId | integer | ✅ Sim | ID da remessa a ser consultada |
📥 Body (opcional)
1{2 "fields": ["customer", "addresses", "values", "shipping", "payments"]3}🎛️ Campos Selecionáveis (fields)
| Campo | Descrição |
|---|---|
customer | Dados do cliente no momento da compra |
addresses | Endereços de entrega do pedido |
values | Valores financeiros (subtotal, frete, desconto, total) |
shipping | Dados de frete e rastreamento |
payments | Dados de pagamento da remessa |
paymentLogs | Logs de transação dos pagamentos (requer payments) |
invoice | Dados de nota fiscal |
reserves | Reservas de estoque |
histories | Histórico de status da remessa |
discounts | Detalhamento de descontos por item |
additions | Detalhamento de acréscimos por item |
💡 Exemplo de Requisição (campos base)
1curl --request GET \2 --url '{{MAIN_URL}}/customer/orders/101' \3 --header 'Authorization: Bearer SEU_TOKEN_AQUI'💡 Exemplo de Requisição (com campos extras)
1curl --request GET \2 --url '{{MAIN_URL}}/customer/orders/101' \3 --header 'Authorization: Bearer SEU_TOKEN_AQUI' \4 --header 'Content-Type: application/json' \5 --data '{6 "fields": ["customer", "addresses", "values", "shipping", "payments", "invoice"]7 }'✅ Resposta de Sucesso
HTTP Status: 200 OK
> A resposta é sempre envolto em {"status": true, "data": {...}}.
1{2 "status": true,3 "data": {4 "id": 1,5 "orderGroupId": 1,6 "productStorageId": 1,7 "orderStatusId": 2,8 "marketplaceOrderId": null,9 "masked": false,1011 "orderGroup": {12 "id": 1,13 "cartId": "2353d908-3801-11f1-9382-e2c94e085d67",14 "tradePolicyId": 1,15 "userId": null,16 "userEmail": null,17 "userName": null,18 "code": "#000001",19 "salesChannelDomain": "loja.com.br",20 "marketplaceId": null,21 "marketplaceName": null,22 "marketplaceStoreCredentialId": null,23 "marketplaceOrderGroupId": null,24 "currency": "BRL",25 "createdAt": "2026-04-14 12:54:56",26 "issuedAt": "2026-04-14 12:54:56"27 },2829 "productStorage": {30 "id": 1,31 "code": "uappi",32 "corporateName": "WSTORE TECNOLOGIA S.A",33 "email": "uappi@gmail.com",34 "phone": "+5518999999999",35 "tradeName": "Uappi",36 "stateCode": "BR-SP",37 "countryCode": "BRA",38 "document": "10831068000176",39 "zipCode": "16200050",40 "city": "São Paulo",41 "address": "Rua Nilo Peçanha",42 "district": "Centro",43 "number": "10",44 "complement": "510",45 "latitude": "",46 "longitude": "",47 "active": true,48 "observation": null,49 "tradePolicyExceptions": []50 },5152 "status": {53 "id": 2,54 "orderStatusParentId": null,55 "code": "paid",56 "name": "Pago",57 "icon": "monetization_on",58 "children": []59 },6061 "items": [62 {63 "id": 1,64 "orderId": 1,65 "productId": 1,66 "name": "Produto de Teste",67 "description": "",68 "sku": "SKU-001",69 "priceRule": null,70 "priceRuleId": null,71 "quantity": 1,72 "unitValue": 150.00,73 "unitAdditionValue": 0.00,74 "unitDiscountValue": 0.00,75 "subtotalValue": 150.00,76 "subtotalAdditionValue": 0.00,77 "subtotalDiscountValue": 0.00,78 "totalValue": 150.00,79 "service": false,80 "generateGiftCard": false,81 "discounts": null,82 "additions": null,83 "simpleProduct": {84 "productId": 1,85 "brandId": 1,86 "brandName": "Marca",87 "mainCategoryId": 1,88 "mainCategoryName": "Categoria",89 "type": "product",90 "sku": "SKU-001",91 "name": "Nome do Produto",92 "active": true,93 "url": "/nome-do-produto",94 "comparisonPrice": 400.00,95 "stock": 98,96 "medias": [],97 "combination": [],98 "currentAttributes": [],99 "restriction": null100 }101 }102 ],103104 "discounts": null,105 "additions": null,106 "reserves": null,107 "invoice": null,108 "histories": null,109110 "customer": null,111 "addresses": null,112 "values": null,113 "shipping": null,114 "payments": []115 }116}🎛️ Campos Opcionais por fields
customer
Dados do cliente no momento da compra:
1"customer": {2 "orderGroupId": 1,3 "customerId": 3,4 "customerNameCorporateName": "João da Silva",5 "customerTradeName": null,6 "customerEmail": "joao.silva@exemplo.com.br",7 "customerDocument": "123.456.789-09",8 "customerDocument2": "",9 "customerPhone": "(11) 91234-5678",10 "customerIsCorporate": false,11 "customerGender": "male",12 "customerBirthdate": "1990-05-15"13}addresses
Endereços vinculados ao pedido:
1"addresses": [2 {3 "orderGroupId": 1,4 "customerAddressType": "delivery",5 "customerAddressId": null,6 "addressZipCode": "01310-100",7 "addressRecipient": "João da Silva",8 "addressStreet": "Avenida Paulista",9 "addressNumber": "1000",10 "addressDistrict": "Bela Vista",11 "addressCity": "São Paulo",12 "addressState": "São Paulo",13 "addressStateCode": "SP",14 "addressCountryCode": "BRA",15 "addressComplement": "Apto 42"16 }17]values
Valores financeiros da remessa:
1"values": {2 "orderId": 1,3 "subtotalValue": 150.00,4 "additionValue": 0.00,5 "shippingValue": 10.00,6 "discountValue": 0.00,7 "totalValue": 160.008}shipping
Dados de frete e rastreamento:
1"shipping": {2 "orderId": 1,3 "shippingTableId": 1,4 "label": "PAC",5 "shippingCarrierId": 1,6 "shippingCarrier": "Correios",7 "shippingIntegrationCode": "PAC",8 "beginShippingTime": 3,9 "endShippingTime": 5,10 "initialDeliveryForecast": "2026-04-17 12:54:56",11 "finalDeliveryForecast": "2026-04-19 12:54:56",12 "shippingValue": 10.00,13 "trackingCode": null,14 "reverseLogisticsCode": null,15 "trackingUrl": null,16 "schedule": false,17 "scheduleDay": null,18 "scheduleHour": null,19 "pickUpDetails": null20}payments
Dados de pagamento. O tipo de pagamento determina quais campos estarão preenchidos:
1"payments": [2 {3 "id": 1,4 "orderGroupId": 1,5 "orderId": 1,6 "customerCardId": null,7 "paymentType": "pix",8 "paymentProof": "",9 "paymentExpirationDate": "2026-04-14 13:24:56",10 "paymentOptionId": 1,11 "parentPaymentOptionId": null,12 "paymentOptionLabel": "PIX",13 "paymentOptionDetail": "Pagamento instantâneo via PIX",14 "integrationName": "pix-ficticio",15 "transactionId": "2354d4fb-3801-11f1-9382-e2c94e085d67",16 "currentStatus": "waiting-payment",17 "paymentAntiFraudId": null,18 "paymentAntiFraudCredentialId": null,19 "antiFraudStatus": null,20 "pixQrCode": "00020126...",21 "pixEmv": "00020126...",22 "billetBarCode": null,23 "billetDigitableLine": null,24 "billetUrl": null,25 "cardAutomaticCapture": false,26 "cardMasked": null,27 "cardFlag": null,28 "cardExpiration": null,29 "value": 160.00,30 "installment": null,31 "installmentValue": 0.00,32 "fee": 0.00,33 "orderGroup": null,34 "logs": []35 }36]Campos por tipo de pagamento:
| Campo | PIX | Boleto | Cartão |
|---|---|---|---|
pixQrCode | preenchido | null | null |
pixEmv | preenchido | null | null |
billetBarCode | null | preenchido | null |
billetDigitableLine | null | preenchido | null |
billetUrl | null | preenchido | null |
cardMasked | null | null | preenchido |
cardFlag | null | null | preenchido |
cardExpiration | null | null | preenchido |
installment | null | null | preenchido |
paymentLogs: Adiciona os últimos 10 logs de transação dentro do array logs de cada pagamento (requer que payments também esteja em fields).invoice
Nota fiscal da remessa:
1"invoice": {2 "orderId": 1,3 "number": "000123",4 "key": "35260412345678901234550010001234561234567890",5 "serie": "1",6 "url": "https://...",7 "xml": null8}histories
Histórico de mudanças de status da remessa:
1"histories": [2 {3 "id": 1,4 "orderId": 1,5 "orderStatusId": 1,6 "createdAt": "2026-04-14 12:54:56"7 }8]⚠️ Possíveis Erros
> Os cenários abaixo representam os principais erros que podem ocorrer neste endpoint, servindo como referência para entendimento e tratamento das falhas.
| Código do Erro | HTTP | Descrição |
|---|---|---|
EXPIRED_AUTH_TOKEN | 401 | Token de autenticação expirado |
INVALID_AUTH_TOKEN | 401 | Token de autenticação inválido ou ausente |
INVALID_CUSTOMER | 401 | Cliente associado ao token indisponível ou desativado |
UAPPI_STORE_ORDER_NOT_FOUND | 404 | Remessa não encontrada ou não pertence ao cliente autenticado |
🕘 Histórico de Pedido do Cliente
/customer/orders/{orderId}/history
Lista o histórico de alterações de uma remessa do cliente autenticado
📋 Descrição
Endpoint responsável por listar o histórico de alterações de uma remessa específica do cliente autenticado.
Cada entrada registra o que mudou, quando mudou e quem realizou a ação — incluindo o estado anterior (before) e o estado posterior (after) da alteração.
🔐 Permissão
CustomerAuth— autenticação do cliente via token JWT
📝 Parâmetros
🏷️ Headers Obrigatórios
| Header | Valor | Descrição |
|---|---|---|
Authorization | Bearer {token} | Token de autenticação do cliente |
🔗 Parâmetros de URL
| Parâmetro | Tipo | Obrigatório | Descrição |
|---|---|---|---|
orderId | integer | ✅ Sim | ID da remessa |
📥 Body (opcional)
1{2 "order": [3 { "field": "id", "order": "desc" }4 ],5 "condition": {6 "type": "AND",7 "conditions": []8 },9 "pagination": {10 "limit": 10,11 "offset": 012 }13}📊 Campos de Condição Disponíveis
| Campo | Tipo | Descrição |
|---|---|---|
origin | string | Origem da alteração (ver tabela abaixo) |
action | string | Ação registrada (ver tabela abaixo) |
userName | string | Nome do usuário que realizou a ação |
userEmail | string | E-mail do usuário que realizou a ação |
createdAt | datetime | Data de criação do registro |
📊 Campos de Ordenação Disponíveis
| Campo | Descrição |
|---|---|
id | ID do registro de histórico |
createdAt | Data de criação |
💡 Exemplo de Requisição
1curl --request GET \2 --url '{{MAIN_URL}}/customer/orders/101/history' \3 --header 'Authorization: Bearer SEU_TOKEN_AQUI' \4 --header 'Content-Type: application/json' \5 --data '{6 "order": [{ "field": "id", "order": "desc" }]7 }'✅ Resposta de Sucesso
HTTP Status: 200 OK
1{2 "status": true,3 "data": {4 "registers": [5 {6 "id": 49,7 "userId": 2,8 "userName": "Admin uappi",9 "userEmail": "admin@uappi.com.br",10 "origin": "status",11 "action": "change-status",12 "createdAt": "2026-04-16 12:40:38",13 "before": [],14 "after": {15 "retroactiveDate": "2026-04-14 14:13:39"16 },17 "orderGroupId": 1,18 "orderId": 1,19 "newOrderStatusId": 220 }21 ],22 "pagination": {23 "limit": 10,24 "offset": 0,25 "pages": 5,26 "registers": 4927 }28 }29}📖 Referência de origin e action
🏷️ Valores de origin
| Valor | Descrição |
|---|---|
order | Criação do pedido |
status | Alteração de status |
shipping | Atualização de frete ou rastreamento |
invoice | Atualização de nota fiscal |
storage | Troca de armazém |
alteration | Adição ou remoção de desconto/acréscimo |
⚡ Valores de action
| Valor | origin | Descrição |
|---|---|---|
create-order | order | Pedido criado |
change-status | status | Status alterado |
update-tracking | shipping | Código de rastreamento atualizado |
update-delivery-forecast | shipping | Previsão de entrega atualizada |
update-invoice | invoice | Nota fiscal atualizada |
change-storage | storage | Armazém trocado |
create-discount | alteration | Desconto adicionado |
create-addition | alteration | Acréscimo adicionado |
remove-discount | alteration | Desconto removido |
remove-addition | alteration | Acréscimo removido |
🔀 Estrutura de before e after por ação
Os campos before e after carregam o snapshot do dado antes e depois da alteração. A estrutura varia conforme a action:
change-status
1"before": { "orderStatusId": 1 },2"after": { "orderStatusId": 2, "retroactiveDate": "2026-04-14 14:13:39" }> retroactiveDate: data retroativa aplicada à mudança de status, quando informada. newOrderStatusId também é preenchido no registro raiz.
create-order
1"before": [],2"after": { "id": 101, "orderGroupId": 55, "productStorageId": 1, "orderStatusId": 1, "..." }update-tracking / update-delivery-forecast
1"before": { "orderId": 101, "trackingCode": null, "..." },2"after": { "orderId": 101, "trackingCode": "BR123456789BR", "..." }update-invoice
1"before": [],2"after": { "orderId": 101, "number": "000123", "key": "35260412...", "serie": "1", "url": "https://..." }change-storage
1"before": { "id": 101, "productStorageId": 1, "..." },2"after": { "id": 101, "productStorageId": 2, "..." }create-discount / create-addition
1"before": null,2"after": { "id": 10, "orderId": 101, "type": "discount", "entityId": "coupon-123", "value": 15.00 }remove-discount / remove-addition
1"before": { "id": 10, "orderId": 101, "type": "discount", "entityId": "coupon-123", "value": 15.00 },2"after": null⚠️ Possíveis Erros
> Os cenários abaixo representam os principais erros que podem ocorrer neste endpoint, servindo como referência para entendimento e tratamento das falhas.
| Código do Erro | HTTP | Descrição |
|---|---|---|
EXPIRED_AUTH_TOKEN | 401 | Token de autenticação expirado |
INVALID_AUTH_TOKEN | 401 | Token de autenticação inválido ou ausente |
INVALID_CUSTOMER | 401 | Cliente associado ao token indisponível ou desativado |
UAPPI_STORE_ORDER_NOT_FOUND | 404 | Remessa não encontrada ou não pertence ao cliente autenticado |