Skip to content

🛍️ 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 campo code (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.
  • 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

  • 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
  • 🗂️ Estrutura do Grupo de Pedido

    CampoTipoDescrição
    idintegerIdentificador único do grupo de pedido
    codestringCódigo legível do pedido exibido ao cliente (ex: #000123)
    cartIdstringID do carrinho que originou o pedido
    tradePolicyIdintegerID da política comercial
    salesChannelDomainstringDomínio do canal de venda onde o pedido foi realizado
    currencystringMoeda do pedido (ex: BRL)
    createdAtdatetimeData e hora de criação do grupo
    issuedAtdatetimeData e hora de emissão do pedido

    📦 Estrutura do Pedido (Remessa)

    CampoTipoDescrição
    idintegerIdentificador único da remessa
    orderGroupIdintegerID do grupo ao qual esta remessa pertence
    orderStatusIdintegerID do status atual da remessa
    productStorageIdintegerID do armazém responsável por atender esta remessa
    statusobjectObjeto com dados do status atual
    itemsarrayItens incluídos nesta remessa
    paymentsarrayPagamentos associados ao grupo
    shippingobjectDados de frete e entrega
    valuesobjectValores detalhados (subtotal, descontos, frete, total)
    addressesarrayEndereços de entrega e cobrança
    historiesarrayHistórico de alterações da remessa

    🕘 Estrutura do Histórico

    CampoTipoDescrição
    idintegerIdentificador único do registro
    originstringOrigem da ação (ex: customer, admin, system)
    actionstringAção que gerou o histórico
    newOrderStatusIdintegerNovo status aplicado, quando aplicável
    beforeobject/nullEstado anterior aos dados alterados
    afterobject/nullEstado posterior aos dados alterados
    createdAtdatetimeData e hora do registro

    🔐 Permissão

    Todas as rotas desta seção exigem dupla autenticação:

  • PublicAuth — autenticação do canal de venda (identificação da loja/aplicação)
  • CustomerAuth — token do cliente autenticado, enviado via header Authorization: Bearer {customerToken}
  • > Requisições sem os dois tokens serão rejeitadas com erro de autenticação.

    📌 Notas e Considerações

  • O cliente só acessa pedidos vinculados ao seu customerId — não é possível consultar pedidos de outros clientes.
  • Os campos reserves e paymentLogs sã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, docx e doc, 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.

🛍️ Listagem de Pedidos do Cliente

GET /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

HeaderValorDescrição
AuthorizationBearer {token}Token de autenticação do cliente

📊 Campos de Condição Disponíveis

CampoTipoDescrição
idintegerFiltrar por ID do pedido
orderGroupIdintegerFiltrar por ID do grupo de pedido
orderStatusIdintegerFiltrar pelo ID do status do pedido

📊 Campos de Ordenação Disponíveis

CampoDescrição
idOrdenar 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": 15
21 }
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 ErroHTTPDescrição
EXPIRED_AUTH_TOKEN401Token de autenticação expirado
INVALID_AUTH_TOKEN401Token de autenticação inválido ou ausente
INVALID_CUSTOMER401Cliente associado ao token indisponível ou desativado

🛍️ Detalhe de Pedido do Cliente

GET /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:

CampoDescrição
id, orderGroupId, productStorageId, orderStatusIdIdentificadores base da remessa
marketplaceOrderIdID da remessa no marketplace (quando aplicável)
maskedIndica se dados sensíveis estão mascarados
orderGroupResumo do grupo de pedido ao qual a remessa pertence
productStorageDados completos do armazém responsável pela remessa
statusStatus atual da remessa
itemsItens da remessa com dados de produto
discounts, additionsDescontos e acréscimos (sempre presentes, null se não aplicável)
reserves, invoice, historiesSempre presentes, null se não aplicável

📝 Parâmetros

🏷️ Headers Obrigatórios

HeaderValorDescrição
AuthorizationBearer {token}Token de autenticação do cliente

🔗 Parâmetros de URL

ParâmetroTipoObrigatórioDescrição
orderIdinteger✅ SimID da remessa a ser consultada

📥 Body (opcional)

1{
2 "fields": ["customer", "addresses", "values", "shipping", "payments"]
3}

🎛️ Campos Selecionáveis (fields)

CampoDescrição
customerDados do cliente no momento da compra
addressesEndereços de entrega do pedido
valuesValores financeiros (subtotal, frete, desconto, total)
shippingDados de frete e rastreamento
paymentsDados de pagamento da remessa
paymentLogsLogs de transação dos pagamentos (requer payments)
invoiceDados de nota fiscal
reservesReservas de estoque
historiesHistórico de status da remessa
discountsDetalhamento de descontos por item
additionsDetalhamento 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,
10
11 "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 },
28
29 "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 },
51
52 "status": {
53 "id": 2,
54 "orderStatusParentId": null,
55 "code": "paid",
56 "name": "Pago",
57 "icon": "monetization_on",
58 "children": []
59 },
60
61 "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": null
100 }
101 }
102 ],
103
104 "discounts": null,
105 "additions": null,
106 "reserves": null,
107 "invoice": null,
108 "histories": null,
109
110 "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.00
8}

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": null
20}

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:

CampoPIXBoletoCartão
pixQrCodepreenchidonullnull
pixEmvpreenchidonullnull
billetBarCodenullpreenchidonull
billetDigitableLinenullpreenchidonull
billetUrlnullpreenchidonull
cardMaskednullnullpreenchido
cardFlagnullnullpreenchido
cardExpirationnullnullpreenchido
installmentnullnullpreenchido
> 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": null
8}

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 ErroHTTPDescrição
EXPIRED_AUTH_TOKEN401Token de autenticação expirado
INVALID_AUTH_TOKEN401Token de autenticação inválido ou ausente
INVALID_CUSTOMER401Cliente associado ao token indisponível ou desativado
UAPPI_STORE_ORDER_NOT_FOUND404Remessa não encontrada ou não pertence ao cliente autenticado

🕘 Histórico de Pedido do Cliente

GET /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

HeaderValorDescrição
AuthorizationBearer {token}Token de autenticação do cliente

🔗 Parâmetros de URL

ParâmetroTipoObrigatórioDescrição
orderIdinteger✅ SimID 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": 0
12 }
13}

📊 Campos de Condição Disponíveis

CampoTipoDescrição
originstringOrigem da alteração (ver tabela abaixo)
actionstringAção registrada (ver tabela abaixo)
userNamestringNome do usuário que realizou a ação
userEmailstringE-mail do usuário que realizou a ação
createdAtdatetimeData de criação do registro

📊 Campos de Ordenação Disponíveis

CampoDescrição
idID do registro de histórico
createdAtData 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": 2
20 }
21 ],
22 "pagination": {
23 "limit": 10,
24 "offset": 0,
25 "pages": 5,
26 "registers": 49
27 }
28 }
29}

📖 Referência de origin e action

🏷️ Valores de origin

ValorDescrição
orderCriação do pedido
statusAlteração de status
shippingAtualização de frete ou rastreamento
invoiceAtualização de nota fiscal
storageTroca de armazém
alterationAdição ou remoção de desconto/acréscimo

⚡ Valores de action

ValororiginDescrição
create-orderorderPedido criado
change-statusstatusStatus alterado
update-trackingshippingCódigo de rastreamento atualizado
update-delivery-forecastshippingPrevisão de entrega atualizada
update-invoiceinvoiceNota fiscal atualizada
change-storagestorageArmazém trocado
create-discountalterationDesconto adicionado
create-additionalterationAcréscimo adicionado
remove-discountalterationDesconto removido
remove-additionalterationAcré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 ErroHTTPDescrição
EXPIRED_AUTH_TOKEN401Token de autenticação expirado
INVALID_AUTH_TOKEN401Token de autenticação inválido ou ausente
INVALID_CUSTOMER401Cliente associado ao token indisponível ou desativado
UAPPI_STORE_ORDER_NOT_FOUND404Remessa não encontrada ou não pertence ao cliente autenticado

Uappi é a melhor opção para o crescimento da sua loja!

;