Pagamentos e Fechamento no Contexto Interno
Visão Geral
O módulo de Pagamentos e Fechamento representa a etapa final e mais crítica do ciclo de vida de um carrinho administrativo.
É através dele que um rascunho operacional é convertido em um pedido oficial (Order), disparando os processos fiscais, logísticos e financeiros da plataforma Uappi.
Diferente do checkout público, o fechamento administrativo oferece flexibilidade para lidar com diferentes modalidades de liquidação:
1. Inspeção: O operador consulta as formas de pagamento permitidas para o Canal de Venda do carrinho. 2. Seleção: Uma forma de pagamento é "marcada" como a escolhida para a negociação. 3. Efetivação: O pedido é gerado através da captura imediata de valores ou pela comunicação de transações já processadas externamente.
---
Modalidades de Fechamento
A API disponibiliza três caminhos distintos para a geração do pedido, dependendo da origem da transação financeira:
- Fechamento Nativo (
POST /buy): Utilizado quando o gateway de pagamento da loja deve realizar a captura síncrona dos valores (ex: digitação de cartão de crédito no painel ou geração de PIX/Boleto nativo). - Fechamento Externo (
POST /create-order): Utilizado para conciliar vendas onde o pagamento ocorreu por fora da plataforma (ex: links de pagamento de terceiros, máquinas físicas de cartão ou faturamento direto via ERP). - Link de Pagamento (
POST /generate-payment-code): O pedido é criado imediatamente, sem cobrança, e um link público é gerado para que o próprio cliente final conclua o pagamento posteriormente através de um formulário/iframe (veja Consultar Pedido pelo Link de Pagamento). - Payment Option: Uma configuração comercial que amarra o método (PIX, Crédito, etc.) às credenciais do gateway e às regras de parcelamento e desconto.
- Internal Sale Settings: Objeto de contexto que armazena a pré-seleção do pagamento feita pelo operador antes do clique final de compra.
- Transactions: Representam o rastro financeiro do pedido, contendo IDs de autorização, status de liquidação e dados técnicos do provedor.
- Não houver um cliente vinculado.
- Os endereços de entrega e faturamento estiverem incompletos.
- Nenhuma opção de frete tiver sido selecionada.
- O estoque de algum item tiver se esgotado durante a montagem do carrinho.
Entidades Envolvidas
Notas e Considerações
Pré-requisitos de Integridade
O fechamento é uma operação protegida por múltiplas travas de negócio. O sistema impedirá a geração do pedido se:
---
Segurança PCI e Dados Sensíveis
Ao lidar com capturas nativas de cartão de crédito no ambiente administrativo, é mandatório que a interface utilize as melhores práticas de segurança.
Tokens de acesso com escopo CART_WRITE são exigidos para todas as ações deste módulo, garantindo que apenas operadores autorizados possam manipular dados financeiros e concluir vendas.
Opções de Pagamento do Carrinho (Admin)
/carts/{cartId}/payments
Lista as formas de pagamento disponíveis para o carrinho, simulando parcelamentos e descontos conforme a política comercial.
Descrição
Este endpoint atua como o simulador financeiro do carrinho administrativo.
Ao ser chamado, o sistema cruza o valor total do carrinho (Grand Total) com as regras do Canal de Venda vinculado para retornar todas as modalidades de pagamento elegíveis para aquela negociação.
A resposta fornece uma visão detalhada para cada opção, incluindo:
- Tabelas de Parcelamento: Quantidade máxima de parcelas, valores de cada parcela e possíveis juros configurados.
- Descontos à Vista: Aplicação de incentivos para métodos como PIX ou Boleto, calculados em tempo real sobre o saldo do carrinho.
- Credenciais de Gateway: Informações técnicas sobre qual provedor processará a transação.
---
Personalização por Contexto
As opções retornadas podem variar dependendo do valor do carrinho (ex: valor mínimo para parcelamento) ou do perfil do cliente vinculado.
É uma etapa indispensável para que o operador informe ao cliente exatamente quais as condições financeiras disponíveis antes de prosseguir para a seleção definitiva.
Parâmetros
Headers Obrigatórios
| Header | Valor | Descrição |
|---|---|---|
Authorization | Bearer {token} | Token do usuário autenticado na API privada com escopo CART_READ. |
Parâmetros da URL
| Parâmetro | Tipo | Obrigatório | Descrição |
|---|---|---|---|
cartId | string | Sim | Identificador único do carrinho administrativo. |
Exemplo de Requisição
1curl --request GET \2 --url '{{MAIN_URL}}/carts/CART123/payments' \3 --header 'Authorization: Bearer SEU_TOKEN_AQUI'✅ Resposta de Sucesso
HTTP Status: 200 OK
1{2 "status": true,3 "data": [4 {5 "paymentOption": {6 "id": 2,7 "tradePolicyId": 1,8 "paymentId": 2,9 "paymentCode": "pix",10 "paymentStoreCredentialId": 15,11 "paymentAntiFraudCredentialId": null,12 "paymentType": {13 "id": 1,14 "code": "pix"15 },16 "active": true,17 "label": "PIX Instantâneo",18 "description": "Pagamento via PIX com desconto",19 "instruction": "O QR Code será gerado após a finalização.",20 "order": 1,21 "options": null,22 "configurations": {},23 "publicCredentials": {24 "publicKey": "pk_test_..."25 },26 "createdAt": "2026-03-01 10:00:00",27 "updatedAt": "2026-03-20 15:30:00"28 },29 "cashDiscount": {30 "discountPercentage": 5.00,31 "discountValue": 5.50,32 "valueWithDiscount": 104.5033 },34 "installments": [35 {36 "installment": 1,37 "installmentValue": 104.50,38 "totalValue": 104.50,39 "fee": 0,40 "feeTotalValue": 041 }42 ],43 "error": null44 }45 ]46}⚠️ Possíveis erros:
Atenção: a seguir estão destacados os principais erros que podem ocorrer neste endpoint.
| Código Interno | Código Http | Descrição |
|---|---|---|
| UAPPI_STORE_CART_NOT_FOUND | 404 | O carrinho informado não foi encontrado ou o token é inválido. |
| UAPPI_STORE_CART_CUSTOMER_IS_DISABLED | 401 | O titular do carrinho possui restrições cadastrais e não pode visualizar opções de pagamento. |
| UAPPI_STORE_CART_EMPTY | 400 | Carrinhos sem itens não possuem opções de pagamento simuladas. |
| UAPPI_STORE_CART_ORDER_EXISTS | 403 | O carrinho já foi convertido em pedido; as opções de pagamento não podem mais ser consultadas. |
Definir Pagamento do Carrinho (Admin)
/carts/{cartId}/payment
Registra a forma de pagamento escolhida para a negociação assistida no contexto do carrinho administrativo.
Descrição
Este endpoint permite que o operador "marque" formalmente qual será a modalidade de pagamento utilizada para fechar a venda.
Ele funciona como uma gravação de intenção: ao enviar o paymentOptionId, o sistema atualiza as configurações internas de venda do carrinho, preparando o terreno para a geração do pedido final.
A definição do pagamento é um passo obrigatório para fluxos que utilizam o endpoint de fechamento nativo (POST /buy).
Sem esta escolha prévia, o domínio de Store não terá a referência de qual gateway ou regra de parcelamento deve aplicar no momento da captura.
---
Persistência da Escolha
Uma vez definida, a opção de pagamento fica salva no objeto cartInternalSaleSettings (visível no detalhe do carrinho).
Esta escolha pode ser substituída a qualquer momento por uma nova chamada a este endpoint ou removida via DELETE, permitindo que o operador ajuste a forma de pagamento conforme a evolução da conversa com o cliente.
---
Validações Comerciais
O backend valida se o paymentOptionId enviado é de fato uma das opções retornadas pelo endpoint de listagem de pagamentos.
Tentar definir um método de pagamento que não pertença à política comercial do Canal de Venda do carrinho resultará em erro de validação.
Parâmetros
Headers Obrigatórios
| Header | Valor | Descrição |
|---|---|---|
Authorization | Bearer {token} | Token do usuário autenticado na API privada com escopo CART_WRITE. |
Content-Type | application/json | Tipo de conteúdo da requisição. |
Parâmetros da URL
| Parâmetro | Tipo | Obrigatório | Descrição |
|---|---|---|---|
cartId | string | Sim | Identificador único do carrinho administrativo. |
Parâmetros do Corpo
| Parâmetro | Tipo | Obrigatório | Descrição |
|---|---|---|---|
paymentOptionId | integer | Sim | ID da opção de pagamento selecionada (ex: ID do PIX, Cartão, etc.). |
Exemplo de Requisição
1curl --request PUT \2 --url '{{MAIN_URL}}/carts/CART123/payment' \3 --header 'Authorization: Bearer SEU_TOKEN_AQUI' \4 --header 'Content-Type: application/json' \5 --data '{6 "paymentOptionId": 27 }'✅ Resposta de Sucesso
HTTP Status: 200 OK
1{2 "id": "CART-8f42dce0-20f0-4c4c-bb4f-9f8a16f6f471",3 "currencyId": "BRL",4 "countryCode": "BRA",5 "quoteZipcode": "12123-123",6 "subtotalValue": 259.9,7 "shippingValue": 18.4,8 "discountValue": 15,9 "additionValue": 0,10 "totalValue": 263.3,11 "discountPreview": {12 "cashDiscount": {13 "discountPercentage": 5,14 "discountValue": 13.17,15 "valueWithDiscount": 250.1316 },17 "pointSystem": {18 "name": "Programa Fidelidade Uappi",19 "pointValue": 0.01,20 "originalAmount": 2633,21 "finalAmount": 2501,22 "finalValue": 25.0123 }24 },25 "installments": [26 {27 "installment": 1,28 "installmentValue": 263.3,29 "totalValue": 263.3,30 "fee": 0,31 "feeTotalValue": 032 },33 {34 "installment": 3,35 "installmentValue": 89.05,36 "totalValue": 267.15,37 "fee": 1.5,38 "feeTotalValue": 3.8539 }40 ],41 "requestedProductMap": [42 {43 "productId": 1,44 "quantity": 2,45 "code": "PROMO-ADMIN",46 "upsellId": null,47 "productPairOfferId": null48 },49 {50 "productId": 25,51 "quantity": 1,52 "code": null,53 "upsellId": 7,54 "productPairOfferId": 1855 }56 ],57 "discountMap": {58 "promotion": [59 {60 "discountId": 9001,61 "discountType": "promotion",62 "discountValue": 10,63 "discountMainCode": "PROMO-10",64 "discountTitle": "Promoção 10% categoria"65 }66 ],67 "coupon": {68 "discountId": 9002,69 "discountType": "coupon",70 "discountValue": 5,71 "discountMainCode": "BEMVINDO5",72 "discountTitle": "Cupom de boas-vindas"73 },74 "customer-wallet": null,75 "point-system": null76 },77 "customer": {78 "customerId": 345,79 "nameCorporateName": "Mariana Souza",80 "tradeName": "",81 "email": "mariana.souza@cliente.com",82 "document": "12345678909",83 "gender": "female",84 "isCorporate": false,85 "nationality": "BRA",86 "birthdate": "1992-08-14",87 "phone": "+5511998765432"88 },89 "addresses": [90 {91 "addressId": 31,92 "type": "delivery",93 "zipCode": "12123-123",94 "identification": "Casa",95 "street": "Rua das Flores",96 "number": "120",97 "city": "São José dos Campos",98 "complement": "Apto 22",99 "district": "Jardim Primavera",100 "state": "São Paulo",101 "stateCode": "SP",102 "countryCode": "BRA",103 "recipient": "Mariana Souza",104 "createdAt": "2026-05-05 10:10:00",105 "updatedAt": "2026-05-05 10:12:00"106 }107 ],108 "orders": [109 {110 "orderId": 1,111 "quoteId": "quote-01",112 "distance": 12,113 "subtotalValue": 259.9,114 "shippingValue": 18.4,115 "discountValue": 15,116 "additionValue": 0,117 "totalValue": 263.3,118 "service": false,119 "storage": {120 "id": 11,121 "code": "CD-SP-01",122 "corporateName": "Centro de Distribuição SP LTDA",123 "email": "logistica.sp@uappi.com.br",124 "phone": "+551133334444",125 "tradeName": "CD São Paulo",126 "stateCode": "SP",127 "countryCode": "BRA",128 "document": "12345678000199",129 "zipCode": "01000-000",130 "city": "São Paulo",131 "address": "Avenida Logística",132 "district": "Centro",133 "number": "1000",134 "complement": "Galpão B",135 "latitude": "-23.55052",136 "longitude": "-46.63331",137 "active": true,138 "observation": "Janela de coleta até 16h",139 "tradePolicyExceptions": [140 5,141 7142 ]143 },144 "items": [145 {146 "itemId": 1,147 "productCategoryIds": [148 15,149 18150 ],151 "upsellId": null,152 "productPairOfferId": null,153 "productPriceRuleId": 3,154 "productPriceRuleName": "Preço Atacado",155 "quantity": 2,156 "code": "PROMO-ADMIN",157 "unitValue": 129.95,158 "unitAdditionValue": 0,159 "unitDiscountValue": 7.5,160 "subtotalValue": 259.9,161 "subtotalAdditionValue": 0,162 "subtotalDiscountValue": 15,163 "totalValue": 244.9,164 "product": {165 "productId": 1,166 "brandId": 9,167 "brandName": "Marca Exemplo",168 "mainCategoryId": 15,169 "mainCategoryName": "Tênis",170 "type": "simple",171 "sku": "SKU-001",172 "name": "Tênis Running Pro",173 "active": true,174 "url": "tenis-running-pro",175 "comparisonPrice": 149.9,176 "stock": 25,177 "medias": [178 {179 "id": 88,180 "type": "image",181 "title": "Foto frontal",182 "alternativeText": "Tênis Running Pro azul",183 "file": "products/tenis-running-pro-frontal.webp",184 "originalFile": "products/original/tenis-running-pro-frontal.jpg",185 "size": 148230,186 "originalSize": 423991,187 "width": 1200,188 "height": 1200,189 "url": "https://cdn.uappi.com.br/products/tenis-running-pro-frontal.webp"190 }191 ],192 "combination": [193 301,194 455195 ],196 "currentAttributes": [197 {198 "id": 12,199 "name": "Cor",200 "value": {201 "id": 455,202 "label": "Azul",203 "image": "attributes/color-blue.webp",204 "originalImage": "attributes/original/color-blue.png",205 "color": "#0033CC",206 "order": 2207 }208 },209 {210 "id": 13,211 "name": "Tamanho",212 "value": {213 "id": 301,214 "label": "42",215 "image": null,216 "originalImage": null,217 "color": null,218 "order": 4219 }220 }221 ],222 "restriction": {223 "tradePolicyId": 1,224 "requiredAge": 0225 }226 },227 "discounts": [228 {229 "cartOrderDiscountId": 9001,230 "cartOrderAdditionId": 0,231 "value": 10,232 "detail": {233 "rule": "PROMO-10-CATEGORIA",234 "scope": "item"235 }236 }237 ],238 "additions": [239 {240 "cartOrderDiscountId": 0,241 "cartOrderAdditionId": 7001,242 "value": 0,243 "detail": {244 "reason": "sem acrescimo aplicado"245 }246 }247 ]248 }249 ],250 "additions": [251 {252 "additionType": "custom-value-rule",253 "additionValue": 0,254 "additionTitle": "Ajuste manual interno"255 }256 ],257 "discounts": [258 {259 "discountId": 9001,260 "discountType": "promotion",261 "discountValue": 10,262 "discountMainCode": "PROMO-10",263 "discountTitle": "Promoção 10% categoria"264 },265 {266 "discountId": 9002,267 "discountType": "coupon",268 "discountValue": 5,269 "discountMainCode": "BEMVINDO5",270 "discountTitle": "Cupom de boas-vindas"271 }272 ],273 "shippingOptions": [274 {275 "shippingTableId": 55,276 "shippingPickupPointId": 0,277 "label": "Entrega padrão",278 "shippingValue": 18.4,279 "beginShippingTime": 2,280 "endShippingTime": 5,281 "shippingTimeType": "days",282 "selected": true,283 "details": {284 "shippingTableId": 55,285 "integrationCode": "uappi",286 "externalShippingCode": "STD-55",287 "carrierId": 17,288 "carrierName": "Transportadora XPTO",289 "label": "Entrega padrão",290 "value": 18.4,291 "beginShippingTime": 2,292 "endShippingTime": 5,293 "trackingUrl": "https://tracking.transportadora.com/{code}",294 "row": {295 "id": 901,296 "initialZipcode": "12000-000",297 "finalZipcode": "12999-999",298 "initialWeight": 0,299 "finalWeight": 30,300 "initialPrice": 0,301 "finalPrice": 99999,302 "beginShippingTime": 2,303 "endShippingTime": 5,304 "shippingValue": 18.4,305 "variables": {306 "kg_factor": 1.2,307 "distance_factor": 0.8308 }309 },310 "pickups": [311 {312 "id": 100,313 "type": "internal",314 "selected": false,315 "name": "Loja Centro",316 "address": "Rua Quinze de Novembro",317 "number": "45",318 "district": "Centro",319 "city": "São José dos Campos",320 "countryCode": "BRA",321 "stateCode": "SP",322 "zipCode": "12210-000",323 "complement": "Retirar no balcão 2",324 "latitude": "-23.1895",325 "longitude": "-45.8841",326 "openingHours": "Seg-Sex 09:00-18:00"327 }328 ],329 "error": null330 }331 }332 ]333 }334 ],335 "errors": [336 {337 "identifier": 1,338 "entity": "Payment",339 "type": "warning",340 "description": "Condição de pagamento indisponível para uma das parcelas.",341 "error": "UAPPI_STORE_PAYMENT_CONDITION_UNAVAILABLE"342 }343 ],344 "isMerged": false,345 "createdAt": "2026-05-05 10:00:00",346 "updatedAt": "2026-05-05 10:43:21"347}⚠️ Possíveis erros:
Atenção: a seguir estão destacados os principais erros que podem ocorrer neste endpoint.
| Código Interno | Código Http | Descrição |
|---|---|---|
| UAPPI_STORE_CART_NOT_FOUND | 404 | O carrinho administrativo informado não foi encontrado. |
| UAPPI_STORE_CART_INVALID_PAYMENT_OPTION | 403 | A opção de pagamento enviada não é permitida para este carrinho ou canal de venda. |
| UAPPI_STORE_CART_USER_MISMATCH | 403 | O operador não tem permissão para alterar as configurações deste carrinho. |
| UAPPI_STORE_CART_ORDER_EXISTS | 403 | O carrinho já possui um pedido e seu método de pagamento não pode mais ser alterado. |
Remover Pagamento do Carrinho (Admin)
/carts/{cartId}/payment
Limpa a opção de pagamento previamente selecionada no carrinho administrativo.
Descrição
Este endpoint desfaz a seleção de pagamento realizada anteriormente via PUT.
Ele limpa o campo paymentOptionId nas configurações internas do carrinho, permitindo que o operador reinicie o processo de negociação financeira ou remova a intenção de fechamento por um método específico.
A remoção é uma operação segura e idempotente: se não houver pagamento selecionado, a chamada retornará sucesso sem alterações.
É o método recomendado para garantir que o carrinho não possua uma "forma de pagamento fantasma" antes de o operador realizar uma nova cotação ou mudar o titular da venda.
---
Autenticação e Permissões
Assim como a definição, a remoção exige o escopo CART_WRITE. O sistema garante que apenas o operador responsável (ou um administrador autorizado) possa realizar a limpeza, mantendo a consistência do atendimento assistido.
---
Impacto no Fluxo de Fechamento
Após a execução bem-sucedida deste endpoint, qualquer tentativa de chamar o fechamento nativo (POST /buy) resultará em erro, uma vez que a referência de pagamento obrigatória terá sido removida do contexto do carrinho.
Parâmetros
Headers Obrigatórios
| Header | Valor | Descrição |
|---|---|---|
Authorization | Bearer {token} | Token do usuário autenticado na API privada com escopo CART_WRITE. |
Parâmetros da URL
| Parâmetro | Tipo | Obrigatório | Descrição |
|---|---|---|---|
cartId | string | Sim | Token identificador único do carrinho administrativo. |
Exemplo de Requisição
1curl --request DELETE \2 --url '{{MAIN_URL}}/carts/CART123/payment' \3 --header 'Authorization: Bearer SEU_TOKEN_AQUI'✅ Resposta de Sucesso
HTTP Status: 200 OK
1true⚠️ Possíveis erros:
Atenção: a seguir estão destacados os principais erros que podem ocorrer neste endpoint.
| Código Interno | Código Http | Descrição |
|---|---|---|
| UAPPI_STORE_CART_NOT_FOUND | 404 | O carrinho administrativo informado não foi encontrado. |
| UAPPI_STORE_CART_USER_MISMATCH | 403 | O operador não tem permissão para manipular as configurações deste carrinho. |
| UAPPI_STORE_CART_ORDER_EXISTS | 403 | O carrinho já possui um pedido finalizado; o pagamento histórico não pode ser removido por este caminho. |
Fechamento de Carrinho (Admin)
/carts/{cartId}/buy
Converte o carrinho administrativo em um pedido real, processando opcionalmente a captura de pagamentos via cartão ou métodos nativos.
Descrição
Este endpoint é o responsável pela finalização síncrona da venda assistida.
Ele consolida todos os dados de itens, cliente, endereços e frete do carrinho e tenta gerar o pedido.
Se o operador enviar dados de pagamento (como número de cartão ou tokens), o sistema realizará a tentativa de captura junto ao gateway de pagamento configurado.
É o método preferencial para fechamentos onde o operador administrativo está em contato direto com o cliente e possui os dados necessários para processar a liquidação na mesma chamada.
Caso o pagamento já tenha ocorrido de forma externa, deve-se utilizar o endpoint create-order.
---
Captura de Pagamento (PCI)
O sistema permite a recepção de dados sensíveis de cartão através do array payments[].
É imperativo que a aplicação front-end que consome este endpoint utilize conexões seguras (HTTPS) e siga os protocolos de segurança vigentes.
O backend da Uappi encapsula a comunicação com os provedores, garantindo que o pedido só nasça com status paid se a autorização financeira for concedida em tempo real.
---
Pré-requisitos Mandatórios
Antes de chamar este endpoint, o carrinho deve obrigatoriamente ter:
1. Um cliente vinculado.
2. Endereço de entrega e faturamento definidos.
3. Ao menos uma opção de frete selecionada.
4. Uma forma de pagamento pré-selecionada via PUT /payment (caso o corpo da requisição buy não envie liquidações explícitas).
Conclusão do pedido por URL externa
É possível que um cliente escolha concluir seu pedido com uma forma de pagamento externa ou um pagamento personalizado que possui URL externa configurada.
No primeiro caso, o pedido ainda será gerado aguardando pagamento.
Já no segundo caso o processo de fechamento do pedido será abortado na etapa de pagamento, qualquer reserva gerada nesse processo será cancelada e um novo grupo de dados será retornado do endpoint.
Isso permitirá que o frontend redirecione o cliente para o ambiente externo desejado, onde ele poderá pagar pelo seu pedido.
No caso de um pagamento personalizado com URL externa, será necessário que o ambiente externo (onde as transações foram efetuadas) efetue uma chamada para o endpoint de Fechamento de Carrinho com Transações já Criadas.
Parâmetros
Headers Obrigatórios
| Header | Valor | Descrição |
|---|---|---|
Authorization | Bearer {token} | Token do usuário autenticado na API privada com escopo CART_WRITE. |
Content-Type | application/json | Tipo de conteúdo da requisição. |
Parâmetros da URL
| Parâmetro | Tipo | Obrigatório | Descrição |
|---|---|---|---|
cartId | string | Sim | Token identificador único do carrinho administrativo. |
Parâmetros do Corpo
| Parâmetro | Tipo | Obrigatório | Descrição |
|---|---|---|---|
payments | array | ✅ | Lista das formas de pagamento desejadas |
payments.*.paymentOptionId | integer | ✅ | Identificador da opção de pagamento a ser utilizada |
payments.*.card.number | string, numeric | Obrigatório na presença de qualquer outro campo referente a cartão | número do cartão de crédito para identificação geral. (max: 16, min: 13) |
payments.*.card.cvv | string, numeric | Obrigatório na presença de qualquer outro campo referente a cartão | CVV do cartão para veracidade do cartão (max: 4) |
payments.*.card.month | integer | Obrigatório na presença de qualquer outro campo referente a cartão | Mês de vencimento do cartão (max: 2) |
payments.*.card.year | integer | Obrigatório na presença de qualquer outro campo referente a cartão | Ano de vencimento do cartão (max: 4) |
payments.*.card.name | string | Obrigatório na presença de qualquer outro campo referente a cartão | Nome do titular do cartão (max: 100) |
payments.*.card.document | string, numeric | ❌ | Documento válido do titular do cartão (max: 14) |
payments.*.card.token | string | ❌ | Token do cartão (max: 400) |
payments.*.card.id | string | ❌ | Identificador do cartão (max 100) |
payments.*.phoneNumber | string | ❌ | Número de telefone do pagador |
payments.*.document | string, numeric | ❌ | Documento do pagador (max 14) |
payments.*.account | string, numeric | ❌ | Conta do pagador |
payments.*.selectedInstallment | integer | Obrigatório na presença de qualquer outro campo referente a cartão | Quantidade de parcelas selecionadas (min: 1) |
payments.*.value | numeric | Obrigatório se o campo payments possuir qualquer valor | Valor do pagamento |
Exemplo de Requisição (com Cartão)
1curl --request POST \2 --url '{{MAIN_URL}}/carts/CART123/buy' \3 --header 'Authorization: Bearer SEU_TOKEN_AQUI' \4 --header 'Content-Type: application/json' \5 --data '{6 "payments": [7 {8 "paymentOptionId": 1,9 "selectedInstallment": 1,10 "card": {11 "number": "4000000000000010",12 "cvv": "123",13 "month": 12,14 "year": 2030,15 "name": "TITULAR DO CARTAO"16 }17 }18 ]19 }'✅ Resposta de Sucesso
HTTP Status: 200 OK
1{2 "status": true,3 "data": {4 "id": 345,5 "cartId": "ac66ca1d61577b216979169",6 "tradePolicyId": 1,7 "userId": null,8 "userEmail": null,9 "userName": null,10 "code": "345",11 "salesChannelDomain": "sua-loja.com.br",12 "marketplaceId": null,13 "marketplaceName": null,14 "marketplaceStoreCredentialId": null,15 "marketplaceOrderGroupId": null,16 "currency": "BRL",17 "createdAt": "2026-03-31 14:30:06",18 "issuedAt": "2026-03-31 11:30:06"19 }20}✅ Resposta de Sucesso com Pagamento Externo
HTTP Status: 200 OK
1{2 "status": true,3 "data": {4 "cartId": "43410917165046c31c57021",5 "paymentOptionId": 14,6 "paymentUrl": "https://url-external.com?cartId=43410917165046c31c57021&paymentOptionId=14"7 }8}⚠️ Possíveis erros:
Atenção: a seguir estão destacados os principais erros que podem ocorrer neste endpoint.
Os cenários descritos representam os erros mais relevantes do contexto atual, servindo como referência para entendimento e tratamento das falhas.
⚠️ Erros de Pedido:
| Código Interno | Código Http | Descrição |
|---|---|---|
| UAPPI_STORE_ORDER_DUPLICATED_CART_ID | 400 | O id do carrinho solicitado já está em uso. |
| UAPPI_STORE_ORDER_INVALID_QUANTITY | 400 | O número de pedidos enviado precisam ser maior ou igual a 1. |
| UAPPI_STORE_ORDER_MISSING_SHIPPING_OPTION | 400 | Nenhuma opção de frete está disponível para o pedido. |
| UAPPI_STORE_ORDER_REQUIRED_SHIPPING_OPTION | 400 | Pelo menos uma opção de frete é obrigatória para concluir o pedido. |
| UAPPI_STORE_ORDER_INVALID_PICKUP_POINT | 400 | O ponto de retirada solicitado é inválido. |
| UAPPI_STORE_ORDER_CUSTOMER_REQUIRED | 400 | O cliente é obrigatório para criar o pedido. |
| UAPPI_STORE_ORDER_INVALID_CUSTOMER | 400 | O cliente solicitado não é válido. |
| UAPPI_STORE_ORDER_INVALID_ADDRESS | 400 | É necessário prover um endereço do tipo "Ambos" ou 2 endereços sendo um de cobrança e o outro de entrega. |
| UAPPI_STORE_ORDER_INVALID_ITEM | 400 | O item requisitado é invalido. |
| UAPPI_STORE_ORDER_PRODUCT_CANNOT_BE_SOLD | 400 | O produto solicitado não pode ser vendido. |
| UAPPI_STORE_ORDER_PRICE_RULE_NOT_FOUND | 404 | A regra de preço solicitada não foi encontrada. |
| UAPPI_STORE_ORDER_INVALID_PRICE_RULE | 400 | A regra de preço solicitada é inválida. |
| UAPPI_STORE_ORDER_GROUP_NOT_FOUND | 404 | O grupo de pedido solicitado não foi encontrado. |
| UAPPI_STORE_ORDER_NOT_FOUND | 404 | O pedido solicitado não foi encontrado. |
| UAPPI_STORE_ORDER_STATUS_NOT_FOUND | 404 | O status de pedido solicitado não foi encontrado. |
| UAPPI_STORE_ORDER_PAYMENT_FAIL | 400 | Erros ocorreram durante o pagamento do pedido. |
| UAPPI_STORE_ORDER_INSERT_FAIL | 500 | Não foi possível inserir os registros de pedido no banco de dados. |
| UAPPI_STORE_CREATE_ORDER_PAYMENT_MISSING | 400 | Para criar o pedido, é necessário que não haja pagamentos pendentes. |
| UAPPI_STORE_ORDER_PAYMENT_REQUIRED | 400 | É necessário efetuar pelo menos um pagamento para que o pedido seja concluído. |
| UAPPI_STORE_DUPLICATED_ORDER_ALTERATION | 400 | A alteração de pedido solicitada já existe. |
| UAPPI_STORE_INVALID_ORDER_ALTERATION_VALUE | 400 | O valor para a alteração do pedido é inválida. |
| UAPPI_STORE_ORDER_INVALID_STORAGE | 400 | Os armazéns solicitados são inválidos. (orders[...]) |
| UAPPI_STORE_CART_ORDER_EXISTS | 403 | Tentativa de fechamento duplicado: este carrinho já gerou um pedido anteriormente. |
⚠️ Erros de Promocionais:
| Código Interno | Código Http | Descrição |
|---|---|---|
| UAPPI_STORE_APPLY_PROMOTIONAL_UNAVAILABLE | 400 | Os promocionais solicitados não estão disponíveis (1, 2, 3). |
| UAPPI_STORE_APPLY_PROMOTIONAL_DISABLED | 400 | A promoção solicitada não pode ser aplicada, pois não está ativa. |
| UAPPI_STORE_APPLY_PROMOTIONAL_OUT_OF_SCHEDULE | 400 | A promoção solicitada não pode ser aplicada pois está fora do período de vigência. |
| UAPPI_STORE_APPLY_PROMOTIONAL_MAX_USE | 400 | A promoção solicitada não pode ser aplicada, pois atingiu o limite máximo de utilização. |
| UAPPI_STORE_APPLY_PROMOTIONAL_ORDER_QUANTITY | 400 | A promoção solicitada não pode ser aplicada, pois o cliente não atende aos requisitos de quantidade do pedido. |
| UAPPI_STORE_APPLY_PROMOTIONAL_DISCOUNT_UNAVAILABLE | 400 | A promoção não pode ser aplicada, pois não há desconto disponível. |
| UAPPI_STORE_APPLY_PROMOTIONAL_MISSING_TRADE_POLICY | 400 | A promoção solicitada não inclui o link para a política comercial. |
| UAPPI_STORE_APPLY_PROMOTIONAL_INSUFFICIENT_BALANCE | 400 | A promoção solicitada não pode ser aplicada porque seu saldo é insuficiente. |
| UAPPI_STORE_POINT_SYSTEM_INVALID_EXPIRATION_DATE | 400 | A data de validade solicitada deve ser posterior à data atual. |
| UAPPI_STORE_POINT_SYSTEM_INVALID_VALUE | 400 | O valor da transação solicitada deve ser maior que zero. |
⚠️ Erros de Armazém e Estoque:
| Código Interno | Código Http | Descrição |
|---|---|---|
| UAPPI_STORE_SALE_WITHOUT_STOCK_ACTIVE | 400 | A operação solicitada não pode continuar porque o produto estava à venda sem estoque disponível. |
| UAPPI_STORE_STOCK_UPDATE_PRODUCT_WITH_VARIATION_STOCK | 400 | O produto tem variações e não pode receber mudança de estoque. |
| UAPPI_STORE_STOCK_INSUFFICIENT_AVAILABLE_STOCK | 400 | A quantidade solicitada para a operação de reserva de estoque não está disponível. |
| UAPPI_STORE_STOCK_BELLOW_MINIMUM | 400 | O estoque do produto solicitado está abaixo do mínimo. |
| UAPPI_STORE_STOCK_INSUFFICIENT_RESERVED_STOCK | 400 | O produto solicitado possuí variações e não pode receber atualização de estoque |
| UAPPI_STORE_RESERVE_INVALID_UPDATE_STATUS | 400 | O status solicitado não pode ser aplicado à reserva. |
| UAPPI_STORE_RESERVE_MUST_BE_TYPE_ORDER | 400 | Para realizar esta ação, a reserva solicitada deve ser do tipo pedido. |
| UAPPI_STORE_STORAGE_NOT_FOUND | 404 | Os armazéns solicitados (1, 2, 3) não foram encontrados. |
| UAPPI_STORE_RESERVE_ALREADY_FINISHED | 409 | Impossível continuar a ação, a reserva já foi finalizada. |
| UAPPI_STORE_RESERVE_NOT_FOUND | 404 | A reserva solicitada não foi encontrada. |
| UAPPI_STORE_STORAGE_NOT_FOUND | 404 | O armazém solicitado não foi encontrado. |
⚠️ Outros tipos de Erros:
| Código Interno | Código Http | Descrição |
|---|---|---|
| UAPPI_STORE_PRODUCT_PRICE_RULE_NOT_FOUND | 404 | A regra de preço solicitada não foi encontrada. |
| UAPPI_STORE_INVALID_ADDRESS | 404 | Os endereços solicitados 1, 2, 3 são inválidos. |
| UAPPI_STORE_CUSTOMER_NOT_FOUND | 404 | O cliente solicitado não foi encontrado. |
| UAPPI_STORE_PRODUCT_NOT_FOUND | 404 | O produto solicitado não foi encontrado. |
| UAPPI_STORE_SEGMENTATION_NOT_FOUND | 404 | A segmentação não foi encontrada. |
| UAPPI_STORE_PAYMENT_OPTION_NOT_SET | 400 | Nenhuma opção de pagamento foi definida no carrinho ou enviada no payload. |
Fechamento com Transações Externas
/carts/{cartId}/create-order
Finaliza o carrinho e gera o pedido comunicando liquidações financeiras que já ocorreram em gateways ou sistemas externos.
Descrição
Este endpoint é utilizado para a conciliação de pedidos originados de fluxos de pagamento externos à captura direta da Uappi.
Ele permite que o operador informe ao sistema que o pagamento já foi processado (em um link de pagamento externo, em uma maquininha física ou em um ERP), anexando os IDs de transação e os status de liquidação ao novo pedido.
Diferente do POST /buy, este método não tenta realizar nenhuma captura financeira; ele apenas registra o histórico recebido.
É a ferramenta ideal para integrar a Uappi com ecossistemas de pagamentos legados ou processos B2B de faturamento direto, onde a "confirmação do que aconteceu" é o que importa para a geração do pedido.
Detalhamento de Transações
O payload permite o envio de um array de payments[], suportando pedidos com múltiplas formas de pagamento (ex: parte em PIX e parte em Cartão).
Para cada item, é possível detalhar o método (credit-card, pix, billet, etc.) e o status atual da cobrança (waiting_payment ou paid).
Vínculo com a Política Comercial
Mesmo sendo um fechamento com dados externos, cada pagamento informado deve estar associado a uma paymentOptionId válida na política comercial do carrinho.
Isso garante que os relatórios financeiros e a categorização contábil do pedido sigam as regras de negócio da loja.
Parâmetros
Headers Obrigatórios
| Header | Valor | Descrição |
|---|---|---|
Authorization | Bearer {token} | Token do usuário autenticado na API privada com escopo CART_WRITE. |
Content-Type | application/json | Tipo de conteúdo da requisição. |
Parâmetros da URL
| Parâmetro | Tipo | Obrigatório | Descrição |
|---|---|---|---|
cartId | string | Sim | Token identificador único do carrinho administrativo. |
Parâmetros do Corpo (Obrigatórios)
| Parâmetro | Tipo | Descrição |
|---|---|---|
payments | array | Lista de transações externas a serem vinculadas ao pedido. Máximo de 100 itens. |
payments.*.method | string | Método de pagamento utilizado. Valores aceitos: credit-card, pix, billet, debit-card, custom. |
payments.*.paymentOptionId | integer | ID da opção de pagamento correspondente na política comercial do carrinho. |
payments.*.paymentOptionLabel | string | Rótulo/Nome da opção de pagamento (ex: "PIX Externo"). |
payments.*.value | decimal | Valor bruto da transação (aceita até 6 casas decimais). |
payments.*.status | string | Status da liquidação. Valores aceitos: waiting_payment, paid. |
payments.*.data | array | Objeto contendo os dados de identificação da transação externa. |
payments.*.data.id | string | ID ou código de autorização único da transação no provedor externo. |
Parâmetros do Corpo (Opcionais e Condicionais)
Detalhes Gerais
| Parâmetro | Tipo | Descrição |
|---|---|---|
payments.*.paymentOptionDetail | string | Detalhamento adicional sobre a opção de pagamento. |
payments.*.integrationName | string | Nome da integração ou gateway de origem da transação. |
payments.*.date | string | Data e hora da transação no formato Y-m-d H:i:s. |
Cartão (card)
Obrigatório apenas se for necessário registrar detalhes do cartão utilizado fisicamente ou em gateway externo.| Parâmetro | Tipo | Descrição |
|---|---|---|
payments.*.card.bin | string | Os primeiros 6 dígitos do cartão. |
payments.*.card.last4 | string | Os últimos 4 dígitos do cartão. |
payments.*.card.brand | string | Bandeira do cartão (ex: visa, mastercard, elo, amex, hipercard, etc). |
payments.*.card.expiration | string | Data de expiração do cartão. |
Pix (pix)
| Parâmetro | Tipo | Descrição |
|---|---|---|
payments.*.pix.dueDate | string | Data de vencimento do Pix (Y-m-d H:i:s). |
payments.*.pix.emv | string | Código copia e cola (EMV) do Pix. |
payments.*.pix.qrCode | string | Link ou Base64 da imagem do QR Code. |
Boleto (billet)
| Parâmetro | Tipo | Descrição |
|---|---|---|
payments.*.billet.barCode | string | Código de barras do boleto. |
payments.*.billet.link | string | URL para visualização do boleto. |
payments.*.billet.digitableLine | string | Linha digitável do boleto. |
payments.*.billet.dueDate | string | Data de vencimento do boleto (Y-m-d H:i:s). |
Parcelamento (installmentData)
Se informado, todos os campos internos tornam-se obrigatórios.| Parâmetro | Tipo | Descrição |
|---|---|---|
payments.*.installmentData.installment | integer | Número da parcela. |
payments.*.installmentData.installmentValue | decimal | Valor individual da parcela. |
payments.*.installmentData.totalValue | decimal | Valor total parcelado (incluindo juros, se houver). |
payments.*.installmentData.fee | decimal | Valor da taxa de juros aplicada. |
payments.*.installmentData.feeTotalValue | decimal | Valor total apenas das taxas. |
Desconto à Vista (cashDiscount)
| Parâmetro | Tipo | Descrição |
|---|---|---|
payments.*.cashDiscount.discountPercentage | decimal | Percentual de desconto aplicado. |
payments.*.cashDiscount.discountValue | decimal | Valor nominal do desconto concedido. |
payments.*.cashDiscount.valueWithDiscount | decimal | Valor final da transação após a aplicação do desconto. |
Exemplo de Requisição
1curl --request POST \2 --url {{MAIN_URL}}/carts/CART123/create-order \3 --header 'Authorization: Bearer SEU_TOKEN_AQUI' \4 --header 'Content-Type: application/json' \5 --data '{6 "payments": [7 {8 "method": "pix",9 "paymentOptionId": 12,10 "paymentOptionLabel": "Pagamento com PIX",11 "paymentOptionDetail": "Pagamento em ambiente externo",12 "integrationName": "Pagar.me V3",13 "value": 300,14 "status": "waiting-payment",15 "data": {16 "id": "weLa9yoUfKViV63"17 },18 "pix": {19 "dueDate": "2026-03-31 09:00:00",20 "emv": "asdfadsfasdfasdf",21 "qrCode": "asdfasdcasdfasdfa"22 },23 "cashDiscount": {24 "discountPercentage": 10,25 "discountValue": 30,26 "valueWithDiscount": 27027 }28 },29 {30 "method": "credit-card",31 "paymentOptionId": 12,32 "paymentOptionLabel": "Cartão do cliente",33 "value": 236.34,34 "status": "paid",35 "data": {36 "id": "Gvu8DeDezhehDMG"37 },38 "card": {39 "bin": "400000",40 "last4": "1000",41 "brand": "visa",42 "expiration": "03/2027"43 },44 "installmentData": {45 "installment": 2,46 "installmentValue": 124.0785,47 "totalValue": 248.157,48 "fee": 5,49 "feeTotalValue": 11.81750 }51 }52 ]53}'✅ Resposta de Sucesso
HTTP Status: 200 OK
1{2 "status": true,3 "data": {4 "id": 345,5 "cartId": "ac66ca1d61577b216979169",6 "tradePolicyId": 1,7 "userId": null,8 "userEmail": null,9 "userName": null,10 "code": "345",11 "salesChannelDomain": "sua-loja.com.br",12 "marketplaceId": null,13 "marketplaceName": null,14 "marketplaceStoreCredentialId": null,15 "marketplaceOrderGroupId": null,16 "currency": "BRL",17 "createdAt": "2026-03-31 14:30:06",18 "issuedAt": "2026-03-31 11:30:06"19 }20}⚠️ Possíveis erros:
| Código Interno | Código Http | Descrição |
|---|---|---|
| UAPPI_INTEGRATION_TRANSACTION_ID_REQUIRED | 400 | O ID da transação é obrigatório. |
Gerar Link de Pagamento (Admin)
/carts/{cartId}/generate-payment-code
Gera um código de link de pagamento a partir do carrinho administrativo, criando o pedido sem pagamento.
Descrição
Este endpoint gera um link de pagamento a partir do carrinho administrativo: o pedido é criado imediatamente (sem cobrança) e um código público e aleatório é retornado, pronto para ser enviado ao cliente final.
Diferente do POST /buy (captura imediata) e do POST /create-order (conciliação de pagamento já processado externamente), este é um terceiro modelo de fechamento: o pedido existe desde já, mas a cobrança só acontece quando o cliente final acessa o link e conclui o pagamento pelo formulário/iframe público.
---
Formas de pagamento permitidas
O operador escolhe, no momento da geração, quais opções de pagamento (paymentOptionId) o cliente poderá utilizar ao acessar o link. Apenas as opções informadas em paymentOptions ficam disponíveis — qualquer outra é rejeitada no momento da finalização.
---
Expiração
O link expira automaticamente após expirationHours horas (padrão: 72h). Após a expiração, tanto a consulta pública quanto a finalização do pagamento passam a ser recusadas.
---
Após a geração
- As formas de pagamento permitidas podem ser alteradas posteriormente, sem gerar um novo código, através do endpoint Atualizar Link de Pagamento.
- O cliente final consulta o pedido e conclui o pagamento através do endpoint público Consultar Pedido pelo Link de Pagamento.
Parâmetros
Headers Obrigatórios
| Header | Valor | Descrição |
|---|---|---|
Authorization | Bearer {token} | Token do usuário autenticado na API privada com escopo CART_WRITE. |
Content-Type | application/json | Tipo de conteúdo da requisição. |
Parâmetros da URL
| Parâmetro | Tipo | Obrigatório | Descrição |
|---|---|---|---|
cartId | string | Sim | Identificador único do carrinho administrativo. |
Parâmetros do Corpo
| Parâmetro | Tipo | Obrigatório | Descrição |
|---|---|---|---|
paymentOptions | array | Sim | Lista de opções de pagamento permitidas no link. Mínimo de 1 item. |
paymentOptions.*.paymentOptionId | integer | Sim | ID da opção de pagamento permitida. |
paymentOptions.*.settings | object | Não | Configurações adicionais específicas da opção de pagamento nesse link. |
expirationHours | integer | Não | Quantidade de horas até a expiração do link (mínimo: 1). Padrão: 72. |
Exemplo de Requisição
1curl --request POST \2 --url '{{MAIN_URL}}/carts/CART123/generate-payment-code' \3 --header 'Authorization: Bearer SEU_TOKEN_AQUI' \4 --header 'Content-Type: application/json' \5 --data '{6 "paymentOptions": [7 { "paymentOptionId": 1 },8 { "paymentOptionId": 2 }9 ],10 "expirationHours": 4811 }'✅ Resposta de Sucesso
HTTP Status: 200 OK
1{2 "status": true,3 "data": {4 "orderGroupId": 345,5 "code": "a1b2c3d4e5f6...",6 "paymentOptions": [7 { "paymentOptionId": 1, "settings": [] },8 { "paymentOptionId": 2, "settings": [] }9 ],10 "expiresAt": "2026-08-29 14:30:06",11 "createdAt": "2026-08-27 14:30:06",12 "updatedAt": "2026-08-27 14:30:06"13 }14}| Campo | Tipo | Descrição |
|---|---|---|
orderGroupId | integer | ID do grupo de pedido criado a partir do carrinho. |
code | string | Código público do link de pagamento. |
paymentOptions | array | Formas de pagamento permitidas no link. |
expiresAt | date | Data/hora de expiração do link. |
createdAt | date | Data de criação do registro. |
updatedAt | date | Data da última atualização do registro. |
⚠️ Possíveis erros:
| Código Interno | Código Http | Descrição |
|---|---|---|
UAPPI_STORE_CART_NOT_FOUND | 404 | O carrinho administrativo informado não foi encontrado. |
UAPPI_STORE_CART_USER_MISMATCH | 403 | O operador não tem permissão para gerar o link deste carrinho (pertence a outro vendedor). |
UAPPI_STORE_CART_ORDER_EXISTS | 403 | O carrinho já possui um pedido gerado e não pode ser reutilizado. |
UAPPI_STORE_ORDER_INVALID_PAYMENT_OPTION | 400 | Uma das opções de pagamento informadas não é válida para a política comercial do carrinho. |