🎯 Documentação de Promoções
📋 Visão Geral
Uma promoção é o registro que ativa um desconto na plataforma, vinculando uma entidade promocional a regras específicas de uso.
Ela controla se o desconto pode ser utilizado via cupom (allowCoupon) e se o benefício é multiplicado por item (multiplyItem).
Toda promoção exige uma entidade promocional pré-existente como base de configuração. A entidade define o formato, o campo avaliado e o alvo do desconto.
A promoção adiciona as regras de elegibilidade e uso sobre essa base.
Campos opcionais — scheduling, segmentation, discounts e seals — não são retornados por padrão. Para carregá-los, informe o parâmetro fields na requisição.
🔄 Entidades Envolvidas
Cada promoção está obrigatoriamente vinculada a uma Entidade Promocional, que define o comportamento base do desconto — incluindo itemField, type e target.
Os campos opcionais da promoção representam módulos independentes:
- Agendamento (
scheduling): define o período de vigência da promoção com datas de início e fim. - Segmentação (
segmentation): determina quais clientes ou contextos de venda são elegíveis, por meio de regras combinadas por operador lógico. - Descontos (
discounts): detalha os valores aplicados por entidade — incluiitemAmountevalue. - Selos (
seals): lista os IDs de selos de produto vinculados à promoção, gerenciados pelo endpointlink-seals.
📋 Listagem de Promoções
/promotionals/promotions
Retorna a listagem paginada de promoções cadastradas na loja
📋 Descrição
Endpoint utilizado para carregar todas as promoções cadastradas na plataforma, com suporte a paginação, filtros e campos opcionais.
É consumido principalmente pelo painel administrativo para exibir a lista de promoções disponíveis na loja, permitindo ao lojista gerenciar campanhas ativas e inativas.
Por padrão, os campos scheduling, segmentation, discounts e seals retornam como null. Informe-os no parâmetro fields quando precisar exibir informações detalhadas de cada promoção na listagem.
scheduling— Agendamento da promoção (datas de início e fim).segmentation— Segmentação de elegibilidade com regras combinadas.discounts— Detalhes dos descontos aplicados por entidade.seals— IDs dos selos de produto vinculados à promoção.
Requer o escopo PROMOTION_READ.
📝 Parâmetros
🏷️ Headers Obrigatórios
| Header | Valor | Descrição |
|---|---|---|
| Content-Type | application/json | Tipo de conteúdo |
| Authorization | Bearer SEU_TOKEN_AQUI | Token de autenticação |
🗂️ Campos Disponíveis (fields)
| Campo | Descrição |
|---|---|
| scheduling | Agendamento da promoção com datas de início e fim |
| segmentation | Segmentação e regras de elegibilidade combinadas |
| discounts | Descontos associados à promoção por entidade |
| seals | IDs dos selos de produto vinculados |
🔎 Campos de Condição Disponíveis
| Campo | Tipo | Descrição |
|---|---|---|
| userId | integer | ID do usuário associado à promoção |
| tradePolicyId | integer | ID da política comercial vinculada à entidade promocional |
| allowCoupon | boolean | Filtra promoções que permitem ou não ativação por cupom |
| target | string | Alvo do desconto. Valores: subtotal, shipping, subtotal-shipping |
| type | string | Formato do desconto. Valores: value, percentage |
| active | boolean | Filtra entidades ativas ou inativas |
| title | string | Nome de identificação da entidade promocional |
| createdAt | string | Data de criação da promoção |
| updatedAt | string | Data da última atualização da promoção |
🔃 Campos de Ordenação Disponíveis
| Campo | Descrição |
|---|---|
| promotionId | ID da promoção |
| title | Nome da entidade promocional |
| createdAt | Data de criação |
| updatedAt | Data da última atualização |
💡 Exemplo de Requisição
1curl --request GET \2 --url {{MAIN_URL}}/promotionals/promotions \3 --header "Authorization: Bearer SEU_TOKEN_AQUI" \4 --header "Content-Type: application/json" \5 --data '{6 "fields": ["scheduling", "segmentation", "discounts", "seals"]7 }'✅ Resposta de Sucesso
HTTP Status: 200 OK
1{2 "status": true,3 "data": {4 "registers": [5 {6 "id": 5,7 "entity": {8 "title": "Desconto de verão para produtos selecionados",9 "observation": null,10 "itemField": "value",11 "type": "percentage",12 "target": "subtotal",13 "active": true,14 "tradePolicies": [2],15 "id": 3,16 "createdAt": "2026-01-10 09:00:00",17 "updatedAt": "2026-01-15 14:30:00"18 },19 "allowCoupon": false,20 "multiplyItem": true,21 "quantityUsed": 0,22 "scheduling": null,23 "segmentation": null,24 "discounts": null,25 "seals": null,26 "createdAt": "2026-01-20 11:00:00",27 "updatedAt": "2026-01-20 11:00:00"28 }29 ],30 "pagination": {31 "limit": 10,32 "offset": 0,33 "pages": 1,34 "registers": 135 }36 }37}⚠️ 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 Interno | HTTP | Descrição |
|---|---|---|
| UAPPI_AUTH_INVALID | 401 | ❌ O token de autenticação é inválido ou está ausente. |
| UAPPI_AUTH_DISABLED | 403 | ❌ O usuário não possui permissão para acessar este recurso. |
🔍 Detalhamento de Promoção
/promotionals/promotions/{promotionId}
Retorna os dados completos de uma promoção específica
📋 Descrição
Endpoint utilizado para carregar os dados completos de uma promoção específica no painel administrativo, identificada pelo promotionId na URL.
Caso a promoção não seja encontrada, o endpoint retorna erro 404 com o código UAPPI_STORE_PROMOTION_NOT_FOUND.
Por padrão, scheduling, segmentation, discounts e seals retornam como null. Para carregá-los, informe-os no parâmetro fields — útil para exibir detalhes completos da promoção em telas de edição.
scheduling— Agendamento com datas de início e fim.segmentation— Segmentação e regras de elegibilidade combinadas.discounts— Detalhes dos descontos por entidade.seals— Array de IDs de selos de produto vinculados (int[]).
Requer o escopo PROMOTION_READ.
📝 Parâmetros
🏷️ Headers Obrigatórios
| Header | Valor | Descrição |
|---|---|---|
| Content-Type | application/json | Tipo de conteúdo |
| Authorization | Bearer SEU_TOKEN_AQUI | Token de autenticação |
🔑 Parâmetros da URL
| Parâmetro | Tipo | Obrigatório | Descrição |
|---|---|---|---|
| promotionId | integer | ✅ Sim | ID da promoção a ser consultada |
🗂️ Campos Disponíveis (fields)
| Campo | Descrição |
|---|---|
| scheduling | Agendamento da promoção com datas de início e fim |
| segmentation | Segmentação e regras de elegibilidade combinadas |
| discounts | Descontos associados à promoção por entidade |
| seals | Array de IDs de selos de produto vinculados |
💡 Exemplo de Requisição
1curl --request GET \2 --url {{MAIN_URL}}/promotionals/promotions/5 \3 --header "Authorization: Bearer SEU_TOKEN_AQUI" \4 --header "Content-Type: application/json" \5 --data '{6 "fields": ["scheduling", "segmentation", "discounts", "seals"]7 }'✅ Resposta de Sucesso
HTTP Status: 200 OK
1{2 "status": true,3 "data": {4 "id": 7,5 "entity": {6 "title": "Desconto de verão para produtos selecionados",7 "observation": null,8 "itemField": "value",9 "type": "percentage",10 "target": "subtotal-shipping",11 "active": true,12 "tradePolicies": [1],13 "id": 5,14 "createdAt": "2026-02-10 09:00:00",15 "updatedAt": "2026-02-12 14:30:00"16 },17 "allowCoupon": false,18 "multiplyItem": false,19 "quantityUsed": 0,20 "scheduling": null,21 "segmentation": {22 "id": 9,23 "operator": "and",24 "sellerId": null,25 "userForAllSellers": false,26 "rules": [27 {28 "id": 18,29 "ruleType": "customer-age",30 "ruleOperator": "greater",31 "ruleValue": 25,32 "entityMap": null,33 "createdAt": "2026-02-12 14:30:00",34 "updatedAt": "2026-02-12 14:30:00"35 }36 ],37 "entityMap": null38 },39 "discounts": [40 {41 "entityId": 7,42 "entity": "promotion",43 "itemAmount": 1,44 "value": 1545 }46 ],47 "seals": [3, 8],48 "createdAt": "2026-02-12 14:30:00",49 "updatedAt": "2026-02-12 14:30:00"50 }51}⚠️ 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 Interno | HTTP | Descrição |
|---|---|---|
| UAPPI_STORE_PROMOTION_NOT_FOUND | 404 | ❌ A promoção solicitada não foi encontrada. |
➕ Criação de Promoção
/promotionals/promotions
Permite criar uma nova promoção na loja
📋 Descrição
Endpoint responsável por criar uma nova promoção, vinculando-a a uma entidade promocional existente.
A entidade informada em promotionalEntityId deve existir na plataforma. Caso contrário, o endpoint retorna erro 404 com o código UAPPI_STORE_PROMOTIONAL_ENTITY_NOT_FOUND.
Após a criação, a promoção é retornada com os campos segmentation e discounts carregados automaticamente, e seals retorna null por padrão.
Requer os escopos PROMOTION_READ e PROMOTION_WRITE.
📝 Parâmetros
🏷️ Headers Obrigatórios
| Header | Valor | Descrição |
|---|---|---|
| Content-Type | application/json | Tipo de conteúdo |
| Authorization | Bearer SEU_TOKEN_AQUI | Token de autenticação |
📦 Parâmetros do Corpo
| Parâmetro | Tipo | Obrigatório | Descrição |
|---|---|---|---|
| promotionalEntityId | integer | ✅ Sim | ID da entidade promocional a ser vinculada |
| allowCoupon | boolean | ✅ Sim | Define se a promoção pode ser ativada por cupom |
| multiplyItem | boolean | ✅ Sim | Define se o desconto é multiplicado por item elegível |
💡 Exemplo de Requisição
1curl --request POST \2 --url {{MAIN_URL}}/promotionals/promotions \3 --header "Authorization: Bearer SEU_TOKEN_AQUI" \4 --header "Content-Type: application/json" \5 --data '{6 "promotionalEntityId": 3,7 "allowCoupon": false,8 "multiplyItem": true9 }'✅ Resposta de Sucesso
HTTP Status: 201 Created
1{2 "status": true,3 "data": {4 "id": 8,5 "entity": {6 "title": "Desconto de verão para produtos selecionados",7 "observation": null,8 "itemField": "value",9 "type": "percentage",10 "target": "subtotal",11 "active": true,12 "tradePolicies": [2],13 "id": 3,14 "createdAt": "2026-01-10 09:00:00",15 "updatedAt": "2026-01-15 14:30:00"16 },17 "allowCoupon": false,18 "multiplyItem": true,19 "quantityUsed": 0,20 "scheduling": null,21 "segmentation": {22 "id": 9,23 "operator": "and",24 "sellerId": null,25 "userForAllSellers": false,26 "rules": [],27 "entityMap": null28 },29 "discounts": [],30 "seals": null,31 "createdAt": "2026-05-04 10:15:00",32 "updatedAt": "2026-05-04 10:15:00"33 }34}⚠️ 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 Interno | HTTP | Descrição |
|---|---|---|
| UAPPI_STORE_PROMOTIONAL_ENTITY_NOT_FOUND | 404 | ❌ A entidade promocional informada não foi encontrada. |
✏️ Atualização de Promoção
/promotionals/promotions/{promotionId}
Permite atualizar uma promoção existente na loja
📋 Descrição
Endpoint responsável por atualizar os dados de uma promoção existente, identificada pelo promotionId na URL.
O sistema valida tanto a existência da promoção quanto da entidade promocional informada. Caso qualquer um dos registros não seja encontrado, o endpoint retorna erro 404 com o código correspondente.
Os mesmos campos disponíveis na criação estão disponíveis na atualização.
A resposta retorna a promoção com segmentation e discounts carregados automaticamente.
Requer os escopos PROMOTION_READ e PROMOTION_WRITE.
📝 Parâmetros
🏷️ Headers Obrigatórios
| Header | Valor | Descrição |
|---|---|---|
| Content-Type | application/json | Tipo de conteúdo |
| Authorization | Bearer SEU_TOKEN_AQUI | Token de autenticação |
🔑 Parâmetros da URL
| Parâmetro | Tipo | Obrigatório | Descrição |
|---|---|---|---|
| promotionId | integer | ✅ Sim | ID da promoção a ser atualizada |
📦 Parâmetros do Corpo
| Parâmetro | Tipo | Obrigatório | Descrição |
|---|---|---|---|
| promotionalEntityId | integer | ✅ Sim | ID da entidade promocional vinculada |
| allowCoupon | boolean | ✅ Sim | Define se a promoção pode ser ativada por cupom |
| multiplyItem | boolean | ✅ Sim | Define se o desconto é multiplicado por item elegível |
💡 Exemplo de Requisição
1curl --request PUT \2 --url {{MAIN_URL}}/promotionals/promotions/8 \3 --header "Authorization: Bearer SEU_TOKEN_AQUI" \4 --header "Content-Type: application/json" \5 --data '{6 "promotionalEntityId": 3,7 "allowCoupon": true,8 "multiplyItem": false9 }'✅ Resposta de Sucesso
HTTP Status: 200 OK
1{2 "status": true,3 "data": {4 "id": 8,5 "entity": {6 "title": "Desconto de verão para produtos selecionados",7 "observation": null,8 "itemField": "value",9 "type": "percentage",10 "target": "subtotal",11 "active": true,12 "tradePolicies": [2],13 "id": 3,14 "createdAt": "2026-01-10 09:00:00",15 "updatedAt": "2026-01-15 14:30:00"16 },17 "allowCoupon": true,18 "multiplyItem": false,19 "quantityUsed": 0,20 "scheduling": null,21 "segmentation": {22 "id": 9,23 "operator": "and",24 "sellerId": null,25 "userForAllSellers": false,26 "rules": [],27 "entityMap": null28 },29 "discounts": [30 {31 "entityId": 3,32 "entity": "promotion",33 "itemAmount": 1,34 "value": 1035 }36 ],37 "seals": null,38 "createdAt": "2026-05-04 10:15:00",39 "updatedAt": "2026-05-04 11:00:00"40 }41}⚠️ 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 Interno | HTTP | Descrição |
|---|---|---|
| UAPPI_STORE_PROMOTION_NOT_FOUND | 404 | ❌ A promoção solicitada não foi encontrada. |
| UAPPI_STORE_PROMOTIONAL_ENTITY_NOT_FOUND | 404 | ❌ A entidade promocional informada não foi encontrada. |
🏷️ Vinculação de Selos à Promoção
/promotionals/promotions/{promotionId}/link-seals
Associa ou desassocia selos de produto a uma promoção
📋 Descrição
Endpoint responsável por gerenciar o vínculo entre selos de produto e uma promoção, identificada pelo promotionId na URL.
O endpoint sempre retorna HTTP 200, mesmo quando erros ocorrem em selos individuais. Falhas por selo são embutidas na resposta nos campos errorCode e errorMessage de cada item — não interrompem a operação.
Para desvincular todos os selos de uma promoção, envie {"seals": {}} ou omita o campo seals completamente.
O campo seals é um objeto onde as chaves são IDs de selos (inteiros) e os valores são booleanos: {"seals": {"4": true, "7": true}}.
Requer os escopos PROMOTION_READ e PROMOTION_WRITE.
📝 Parâmetros
🏷️ Headers Obrigatórios
| Header | Valor | Descrição |
|---|---|---|
| Content-Type | application/json | Tipo de conteúdo |
| Authorization | Bearer SEU_TOKEN_AQUI | Token de autenticação |
🔑 Parâmetros da URL
| Parâmetro | Tipo | Obrigatório | Descrição |
|---|---|---|---|
| promotionId | integer | ✅ Sim | ID da promoção cujos selos serão gerenciados |
📦 Parâmetros do Corpo
| Parâmetro | Tipo | Obrigatório | Descrição |
|---|---|---|---|
| seals | object | ❌ Não | Objeto com IDs de selos mapeados para booleano. Omitir ou enviar vazio remove todos os vínculos |
| seals.* | boolean | ✅ Sim (por item) | Valor booleano para cada ID de selo |
💡 Exemplo de Requisição
1curl --request PUT \2 --url {{MAIN_URL}}/promotionals/promotions/8/link-seals \3 --header "Authorization: Bearer SEU_TOKEN_AQUI" \4 --header "Content-Type: application/json" \5 --data '{6 "seals": {7 "4": true,8 "7": true9 }10 }'✅ Resposta de Sucesso
HTTP Status: 200 OK
A resposta é um array com um item por selo processado. Cada item contém os campos errorCode e errorMessage — quando null, indica sucesso para aquele selo.
1{2 "status": true,3 "data": [4 {5 "promotionalPromotionId": 8,6 "productSealId": 4,7 "updatedAt": "2026-05-04 11:30:00",8 "errorCode": null,9 "errorMessage": null10 },11 {12 "promotionalPromotionId": 8,13 "productSealId": 7,14 "updatedAt": "",15 "errorCode": "UAPPI_STORE_SEAL_NOT_FOUND",16 "errorMessage": "The requested seal was not found."17 }18 ]19}⚠️ 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 Interno | HTTP | Descrição |
|---|---|---|
| UAPPI_STORE_PROMOTION_NOT_FOUND | 404 | ❌ A promoção solicitada não foi encontrada. Retornado quando a promoção em si não existe — erros por selo individual são embutidos no array de resposta. |
🗑️ Exclusão de Promoção
/promotionals/promotions/{promotionId}
Remove permanentemente uma promoção da plataforma
📋 Descrição
Endpoint responsável por remover permanentemente uma promoção, identificada pelo promotionId na URL.
Caso a promoção não seja encontrada, o endpoint retorna erro 404 com o código UAPPI_STORE_PROMOTION_NOT_FOUND.
Quando a exclusão é realizada com sucesso, o campo data retorna true.
Requer os escopos PROMOTION_READ e PROMOTION_WRITE.
📝 Parâmetros
🏷️ Headers Obrigatórios
| Header | Valor | Descrição |
|---|---|---|
| Content-Type | application/json | Tipo de conteúdo |
| Authorization | Bearer SEU_TOKEN_AQUI | Token de autenticação |
🔑 Parâmetros da URL
| Parâmetro | Tipo | Obrigatório | Descrição |
|---|---|---|---|
| promotionId | integer | ✅ Sim | ID da promoção a ser removida |
💡 Exemplo de Requisição
1curl --request DELETE \2 --url {{MAIN_URL}}/promotionals/promotions/8 \3 --header "Authorization: Bearer SEU_TOKEN_AQUI" \4 --header "Content-Type: application/json"✅ Resposta de Sucesso
HTTP Status: 200 OK
1{2 "status": true,3 "data": true4}⚠️ 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 Interno | HTTP | Descrição |
|---|---|---|
| UAPPI_STORE_PROMOTION_NOT_FOUND | 404 | ❌ A promoção solicitada não foi encontrada. |