> ## Documentation Index
> Fetch the complete documentation index at: https://developers.bonifiq.com.br/llms.txt
> Use this file to discover all available pages before exploring further.

# API de Checkout e Objetivos

> Integre a BonifiQ ao checkout Mobile da sua loja VTEX e gerencie objetivos de fidelidade

A BonifiQ já oferece uma solução nativa para integrar diretamente ao Checkout da VTEX no modelo Web. No modelo Mobile, no entanto, requer que seja realizada a integração com as APIs da BonifiQ diretamente.

As integrações abrangem login seguro, consulta e aplicação de recompensa, além de gerenciamento de objetivos (missões) de fidelidade. As chamadas são projetadas para garantir uma experiência segura e eficiente para o consumidor.

### Principais Etapas

1. **Login seguro:** Autenticação do usuário e obtenção de token de segurança.
2. **Configuração do checkout:** Obtenção das configurações do programa de fidelidade.
3. **Consulta de pontos da compra:** Verificação de quantos pontos o cliente ganhará na compra.
4. **Consulta de recompensas:** Verificação do saldo e regras para utilização da recompensa.
5. **Aplicação de recompensa:** Resgate de recompensa no carrinho.
6. **Consulta de recompensa aplicada:** Verificação do estado da recompensa no carrinho.
7. **Remoção de recompensa:** Remover a recompensa aplicada a um carrinho.
8. **Objetivos:** Consultar e interagir com missões de fidelidade (compra, aniversário, indicação, review, redes sociais, quiz, etc.).

***

## Guia Visual: Como Construir as Interfaces

Cada endpoint retorna dados que precisam ser traduzidos em interfaces. Abaixo está um guia prático de como o widget BonifiQ utiliza esses dados para construir cada tela.

### Tela de Recompensas

A lista de recompensas deve exibir cards com as informações retornadas pela API. Cada tipo de recompensa tem um tratamento visual diferente:

<img src="https://mintcdn.com/bonifiq/EtP8nrZu2qgos1uf/images/vtex-cashback-checkout/01-tela-recompensas.svg?fit=max&auto=format&n=EtP8nrZu2qgos1uf&q=85&s=d8d23e3d1775fdd1833ca5afbbb20d89" alt="" width="900" height="760" data-path="images/vtex-cashback-checkout/01-tela-recompensas.svg" />

**Mapeamento de dados → interface:**

| Campo da API  | Elemento Visual                             |
| ------------- | ------------------------------------------- |
| `Title`       | Título do card (ex: "R\$ 10,00")            |
| `Points`      | Subtítulo (ex: "100 pontos")                |
| `Description` | Descrição expandida ao clicar               |
| `CanUse`      | Card habilitado ou desabilitado             |
| `UseReason`   | Mensagem quando `CanUse = false`            |
| `Type`        | Ícone (🏷️ desconto, 🚚 frete, 💰 cashback) |
| `Enabled`     | Visibilidade do card                        |

### Tela de Detalhe da Recompensa

Ao clicar em uma recompensa, exibir detalhes e botão de resgate:

<img src="https://mintcdn.com/bonifiq/EtP8nrZu2qgos1uf/images/vtex-cashback-checkout/02-detalhe-recompensa.svg?fit=max&auto=format&n=EtP8nrZu2qgos1uf&q=85&s=83d74f21443d4de66785b9c34adaf98d" alt="" width="900" height="760" data-path="images/vtex-cashback-checkout/02-detalhe-recompensa.svg" />

**Lógica do botão de resgate:**

* Se `customer == null` → mostrar "Participar do Programa" (redirecionar para cadastro)
* Se `PointsBalance < reward.Points` → desabilitar botão
* Se já resgatou → desabilitar botão
* Ao resgatar: chamar `POST /rewards/redeem/{id}` → exibir cupom gerado

### Tela de Objetivos (Missões)

Cada tipo de objetivo tem um card com ícone e comportamento diferentes:

<img src="https://mintcdn.com/bonifiq/EtP8nrZu2qgos1uf/images/vtex-cashback-checkout/03-objetivos.svg?fit=max&auto=format&n=EtP8nrZu2qgos1uf&q=85&s=c9cc3900fd9b0f06d395eeb5a23e2cea" alt="" width="900" height="820" data-path="images/vtex-cashback-checkout/03-objetivos.svg" />

**Comportamento por tipo de objetivo ao clicar:**

| Tipo         | Ação ao Clicar | Tela Destino                                             |
| ------------ | -------------- | -------------------------------------------------------- |
| **Purchase** | Informativo    | Exibir descrição e regras de pontuação                   |
| **Birthday** | Cadastrar data | Formulário de data → `POST setbirthday`                  |
| **Referral** | Indicar amigo  | Formulário de email ou botão de compartilhar link        |
| **Review**   | Redirecionar   | Abrir URL de avaliação em nova aba                       |
| **Social**   | Redirecionar   | Abrir rede social → `POST createpointsfollowsocialmedia` |
| **Quiz**     | Responder      | Tela de perguntas e respostas                            |
| **Signup**   | Informativo    | Já completado automaticamente                            |
| **Custom**   | Redirecionar   | Abrir `ActionButtonURL` em nova aba                      |

### Tela de Aniversário (Birthday)

A tela muda completamente baseado no `BenefitStatus`:

<img src="https://mintcdn.com/bonifiq/EtP8nrZu2qgos1uf/images/vtex-cashback-checkout/04-aniversario.svg?fit=max&auto=format&n=EtP8nrZu2qgos1uf&q=85&s=8c3e68ffd482fe1d79649df7bdb7bd8f" alt="" width="1180" height="680" data-path="images/vtex-cashback-checkout/04-aniversario.svg" />

### Tela de Indicação (Referral)

<img src="https://mintcdn.com/bonifiq/EtP8nrZu2qgos1uf/images/vtex-cashback-checkout/05-indicacao.svg?fit=max&auto=format&n=EtP8nrZu2qgos1uf&q=85&s=bd5591bd1307bbb4275f947e132e7cf0" alt="" width="900" height="780" data-path="images/vtex-cashback-checkout/05-indicacao.svg" />

**Fluxo:**

1. **Email**: `POST /objectives/referral/refer` com email
2. **Link/WhatsApp**: `POST /objectives/referral/friend` → gera link para compartilhar
3. O campo `WhatsAppShareText` do objetivo contém o texto pré-formatado

### Tela de Quiz

<img src="https://mintcdn.com/bonifiq/EtP8nrZu2qgos1uf/images/vtex-cashback-checkout/06-quiz.svg?fit=max&auto=format&n=EtP8nrZu2qgos1uf&q=85&s=5752bc8e42a1bf26ef94a4163701bdb6" alt="" width="900" height="780" data-path="images/vtex-cashback-checkout/06-quiz.svg" />

**Renderização por tipo de questão:**

* `Type = 0 (Multiple)` → Checkboxes (múltipla seleção)
* `Type = 1 (Selection)` → Radio buttons (seleção única)
* `Type = 2 (Open)` → Campo de texto livre

### Checkout: Cashback

<img src="https://mintcdn.com/bonifiq/EtP8nrZu2qgos1uf/images/vtex-cashback-checkout/07-checkout-cashback.svg?fit=max&auto=format&n=EtP8nrZu2qgos1uf&q=85&s=c7315df59a9a2ae009d90b5ab7438c21" alt="" width="900" height="820" data-path="images/vtex-cashback-checkout/07-checkout-cashback.svg" />

**Mapeamento de dados → interface:**

| Campo da API              | Elemento Visual                      |
| ------------------------- | ------------------------------------ |
| `CashbackBalance`         | "Saldo: R\$ 50,00"                   |
| `UsableCashback`          | "Utilizável nesta compra: R\$ 25,00" |
| `CashbackRules`           | Texto de regras                      |
| `CanUse`                  | Botão habilitado/desabilitado        |
| `CashbackWillReceiveText` | Mensagem de quanto ganhará           |
| `MinValueToUse`           | Mensagem de valor mínimo             |
| `RequiredToAddMoreText`   | Mensagem de quanto falta             |

### Estados de Interface

Toda tela deve considerar estes estados:

| Estado              | Quando                     | Como exibir                                 |
| ------------------- | -------------------------- | ------------------------------------------- |
| **Loading**         | Aguardando resposta da API | Skeleton/shimmer nos cards                  |
| **Sucesso**         | Dados carregados           | Renderizar conteúdo                         |
| **Lista vazia**     | `Item` é array vazio       | "Nenhuma recompensa disponível"             |
| **Erro**            | `HasError = true`          | Exibir `Message` + botão "Tentar novamente" |
| **Não autenticado** | Sem `SecureToken`          | Exibir CTA de login                         |
| **Sem pontos**      | `CanUse = false`           | Card desabilitado + motivo (`UseReason`)    |

***

## 1. Fazer Login Seguro

O primeiro passo é realizar o login do usuário e obter o seu token de segurança. Esse token de segurança será utilizado em todas as chamadas subsequentes.

O `sessionToken` e o `segmentToken` deverão ser obtidos mediante login na VTEX.

<Note>
  O `SecureToken` tem validade limitada e deve ser atualizado periodicamente.
</Note>

### Requisição

`POST /pub/widget/vendors/vtex/securelogin`

**Headers**

<ParamField header="X-Bq-Tenant" type="string" required>
  Identificador público da loja.
</ParamField>

**Body**

<ParamField body="sessionToken" type="string" required>
  Gerado pela plataforma de e-commerce após o login do consumidor.
</ParamField>

<ParamField body="segmentToken" type="string" required>
  Gerado pela plataforma de e-commerce.
</ParamField>

### Exemplo

```bash theme={null}
curl -X POST "https://api.bonifiq.com/pub/widget/vendors/vtex/securelogin" \
  -H "X-Bq-Tenant: {tenant_key}" \
  -H "Content-Type: application/json" \
  -d '{
    "sessionToken": "<session_token>",
    "segmentToken": "<segment_token>"
  }'
```

### Resposta

<ResponseField name="HasError" type="boolean">
  Indica se houve erro na requisição.
</ResponseField>

<ResponseField name="Item" type="object">
  <Expandable title="Properties">
    <ResponseField name="Email" type="string">
      E-mail do usuário.
    </ResponseField>

    <ResponseField name="Name" type="string">
      Nome completo do usuário.
    </ResponseField>

    <ResponseField name="UserId" type="string">
      Identificador do usuário.
    </ResponseField>

    <ResponseField name="SecureToken" type="string">
      Token de segurança do usuário, com validade de 60 minutos.
    </ResponseField>
  </Expandable>
</ResponseField>

```json theme={null}
{
  "HasError": false,
  "Message": null,
  "Item": {
    "Email": "usuario@dominio.com",
    "Name": "Nome Completo",
    "UserId": "usuario@dominio.com",
    "SecureToken": "742b9b93-c1dc-4ec1-8f92-6b3a1838c613"
  }
}
```

***

## 2. Obter Configuração do Checkout

Essa etapa é utilizada para obter as configurações do programa de fidelidade para o checkout, como cores, nome do programa e se utiliza pontos ou cashback.

### Requisição

`GET /pub/widget/rewards/checkout/configuration`

**Headers**

<ParamField header="X-Bq-Tenant" type="string" required>
  Identificador da loja.
</ParamField>

<ParamField header="X-Bq-SecureToken" type="string" required>
  Token do usuário obtido no login seguro.
</ParamField>

### Exemplo

```bash theme={null}
curl -X GET "https://api.bonifiq.com/pub/widget/rewards/checkout/configuration" \
  -H "X-Bq-Tenant: {tenant_key}" \
  -H "X-Bq-SecureToken: {secure_token}"
```

### Resposta

<ResponseField name="Text" type="string">
  Texto customizado para exibição no checkout.
</ResponseField>

<ResponseField name="ProgramName" type="string">
  Nome do programa de fidelidade.
</ResponseField>

<ResponseField name="Color" type="string">
  Cor principal do programa (hexadecimal).
</ResponseField>

<ResponseField name="Active" type="boolean">
  Indica se o programa está ativo.
</ResponseField>

<ResponseField name="UseCashback" type="boolean">
  Indica se o programa utiliza cashback.
</ResponseField>

<ResponseField name="UsePoints" type="boolean">
  Indica se o programa utiliza pontos.
</ResponseField>

```json theme={null}
{
  "Text": "Resgate seus pontos!",
  "ProgramName": "Programa Fidelidade",
  "Color": "#FF5722",
  "Active": true,
  "UseCashback": true,
  "UsePoints": true
}
```

***

## 3. Consultar Pontos da Compra

Essa etapa é utilizada para exibir ao cliente quantos pontos (ou cashback) ele ganhará na compra atual. Ideal para exibir mensagens como "Você ganhará X pontos nesta compra".

### Requisição

`GET /pub/widget/rewards/checkout/purchase-points`

**Headers**

<ParamField header="X-Bq-Tenant" type="string" required>
  Identificador da loja.
</ParamField>

<ParamField header="X-Bq-SecureToken" type="string" required>
  Token do usuário obtido no login seguro.
</ParamField>

**Query Parameters**

<ParamField query="purchaseValue" type="number" required>
  Valor da compra.
</ParamField>

<ParamField query="checkoutCode" type="string">
  Identificador do carrinho (order\_form\_id). Opcional.
</ParamField>

### Exemplo

```bash theme={null}
curl -X GET "https://api.bonifiq.com/pub/widget/rewards/checkout/purchase-points?purchaseValue=150.00&checkoutCode=abc123" \
  -H "X-Bq-Tenant: {tenant_key}" \
  -H "X-Bq-SecureToken: {secure_token}"
```

### Resposta

<ResponseField name="MinValueToReceive" type="number">
  Valor mínimo da compra para receber pontos.
</ResponseField>

<ResponseField name="PurchasePoints" type="integer">
  Quantidade de pontos que o cliente ganhará nesta compra.
</ResponseField>

<ResponseField name="PurchaseCashback" type="number">
  Valor de cashback que o cliente ganhará nesta compra (se aplicável).
</ResponseField>

<ResponseField name="HasPurchaseObjective" type="boolean">
  Indica se existe um objetivo de compra configurado.
</ResponseField>

```json theme={null}
{
  "MinValueToReceive": 50.00,
  "PurchasePoints": 150,
  "PurchaseCashback": 7.50,
  "HasPurchaseObjective": true
}
```

***

## 4. Buscar Recompensas

Essa etapa será utilizada para a listagem de recompensas disponíveis para o usuário logado.

### Requisição

`GET /pub/widget/rewards/checkout`

**Headers**

<ParamField header="X-Bq-Tenant" type="string" required>
  Identificador da loja.
</ParamField>

<ParamField header="X-Bq-SecureToken" type="string" required>
  Token do usuário obtido no login seguro.
</ParamField>

**Query Parameters**

<ParamField query="purchaseValue" type="number" required>
  Valor da compra. É utilizado para determinar quais recompensas (e valores) são válidos para o carrinho.
</ParamField>

### Exemplo

```bash theme={null}
curl -X GET "https://api.bonifiq.com/pub/widget/rewards/checkout?purchaseValue=100.00" \
  -H "X-Bq-Tenant: {tenant_key}" \
  -H "X-Bq-SecureToken: {secure_token}"
```

### Resposta

<ResponseField name="ProgramName" type="string">
  Nome do programa de fidelidade.
</ResponseField>

<ResponseField name="PointsBalance" type="integer">
  Saldo de pontos do cliente.
</ResponseField>

<ResponseField name="HasError" type="boolean">
  Indica se houve erro na requisição.
</ResponseField>

<ResponseField name="Item" type="array">
  Lista de recompensas.

  <Expandable title="Item Object">
    <ResponseField name="Id" type="integer">
      Identificador da recompensa.
    </ResponseField>

    <ResponseField name="Type" type="integer">
      Tipo da recompensa (0 = Percentual, 1 = Valor fixo).
    </ResponseField>

    <ResponseField name="Title" type="string">
      Título da recompensa.
    </ResponseField>

    <ResponseField name="Points" type="integer">
      Quantidade de pontos necessários para resgatar.
    </ResponseField>

    <ResponseField name="Description" type="string">
      Descrição da recompensa.
    </ResponseField>

    <ResponseField name="Enabled" type="boolean">
      Indica se a recompensa está habilitada.
    </ResponseField>

    <ResponseField name="CanUse" type="boolean">
      Indica se o cliente pode usar esta recompensa.
    </ResponseField>

    <ResponseField name="UseReason" type="integer">
      Motivo da disponibilidade/indisponibilidade (ver tabela abaixo).
    </ResponseField>

    <ResponseField name="RemainingToUse" type="number">
      Valor restante para atingir o mínimo (se `UseReason` for 2).
    </ResponseField>

    <ResponseField name="MinValueToUse" type="number">
      Valor mínimo do carrinho para usar esta recompensa.
    </ResponseField>
  </Expandable>
</ResponseField>

```json theme={null}
{
  "ProgramName": "VTEX IO QA",
  "PointsBalance": 10000,
  "HasError": false,
  "Message": null,
  "Item": [
    {
      "Id": 301,
      "Type": 1,
      "Title": "R$ 100,00",
      "Points": 100,
      "Description": "Descrição da recompensa...",
      "Enabled": true,
      "CanUse": true,
      "UseReason": 0,
      "RemainingToUse": 0,
      "MinValueToUse": 0
    }
  ]
}
```

#### Enumeração `UseReason`

| Valor | Descrição                               |
| :---- | :-------------------------------------- |
| 0     | CanUse (Recompensa disponível para uso) |
| 1     | NotEnoughPoints                         |
| 2     | MinValueNotReached                      |
| 3     | CashbackNotAvailable                    |
| 4     | NoCustomer                              |
| 5     | ValueRewardBiggerThanPurchase           |
| 6     | MinimumPercentPurchaseNotReached        |
| 7     | CustomerNotEnrolled                     |

***

## 4.1. Buscar Recompensas já Resgatadas

Essa etapa será utilizada para a listagem de recompensas já resgatadas e não utilizadas pelo consumidor.

### Requisição

`GET /pub/widget/rewards/checkout/redeemed`

**Headers**

<ParamField header="X-Bq-Tenant" type="string" required>
  Identificador da loja.
</ParamField>

<ParamField header="X-Bq-SecureToken" type="string" required>
  Token do usuário obtido no login seguro.
</ParamField>

**Query Parameters**

<ParamField query="purchaseValue" type="number" required>
  Valor da compra.
</ParamField>

### Exemplo

```bash theme={null}
curl -X GET "https://api.bonifiq.com/pub/widget/rewards/checkout/redeemed?purchaseValue=100.00" \
  -H "X-Bq-Tenant: {tenant_key}" \
  -H "X-Bq-SecureToken: {secure_token}"
```

### Resposta

```json theme={null}
{
  "HasError": false,
  "Message": null,
  "Item": [
    {
      "RedeemedId": 1302,
      "RedeemedPoints": -10,
      "RedeemedValue": 0,
      "Id": 302,
      "Type": 0,
      "Title": "10%",
      "Points": 10,
      "CanUse": true,
      "UseReason": 0
    }
  ]
}
```

***

## 5. Aplicar Recompensa

Essa etapa será utilizada para a aplicação de recompensas ainda não resgatadas.

### Requisição

`POST /pub/widget/rewards/redeem/{reward_id}`

**Headers**

<ParamField header="X-Bq-Tenant" type="string" required>
  Identificador da loja.
</ParamField>

<ParamField header="X-Bq-SecureToken" type="string" required>
  Token do usuário obtido no login seguro.
</ParamField>

**Path Parameters**

<ParamField path="reward_id" type="integer" required>
  ID da recompensa a ser resgatada.
</ParamField>

**Body (Opcional)**

<ParamField body="OriginalId" type="string">
  Identificador do carrinho (order\_form\_id).
</ParamField>

### Exemplo

```bash theme={null}
curl -X POST "https://api.bonifiq.com/pub/widget/rewards/redeem/301" \
  -H "X-Bq-Tenant: {tenant_key}" \
  -H "X-Bq-SecureToken: {secure_token}" \
  -H "Content-Type: application/json" \
  -d '{
    "OriginalId": "<order_form_id>"
  }'
```

### Resposta

```json theme={null}
{
  "HasError": false,
  "Message": "Tudo Certo! Em breve você irá receber um e-mail com mais instruções",
  "Item": {
    "Success": true,
    "ResultMessage": "Utilize seu cupom nesta compra:",
    "CouponCode": "c806711b278a463d8e787f5f5c409f89",
    "HasCouponCode": true,
    "Reward": {
      "RedeemedId": 1416,
      "Title": "2%",
      "Points": 2
    }
  }
}
```

***

## 5.1. Aplicar Recompensa já Resgatada

Essa etapa será utilizada para a aplicação de recompensas já resgatadas.

### Requisição

`POST /pub/widget/rewardredeemed/checkout/redeem/{reward_redeemed_id}`

<Warning>
  O valor de `reward_redeemed_id` deverá ser o valor retornado na propriedade `RedeemedId` da seção "Buscar Recompensas já Resgatadas".
</Warning>

**Headers**

<ParamField header="X-Bq-Tenant" type="string" required>
  Identificador da loja.
</ParamField>

<ParamField header="X-Bq-SecureToken" type="string" required>
  Token do usuário obtido no login seguro.
</ParamField>

**Path Parameters**

<ParamField path="reward_redeemed_id" type="integer" required>
  ID da recompensa resgatada.
</ParamField>

**Body (Opcional)**

<ParamField body="OriginalId" type="string">
  Identificador do carrinho (order\_form\_id).
</ParamField>

### Exemplo

```bash theme={null}
curl -X POST "https://api.bonifiq.com/pub/widget/rewardredeemed/checkout/redeem/1302" \
  -H "X-Bq-Tenant: {tenant_key}" \
  -H "X-Bq-SecureToken: {secure_token}" \
  -H "Content-Type: application/json" \
  -d '{
    "OriginalId": "<order_form_id>"
  }'
```

***

## 6. Validar Cashback

Essa etapa é utilizada para verificar se o cliente pode utilizar cashback e qual o valor disponível. Deve ser chamada antes de aplicar o cashback.

### Requisição

`GET /pub/widget/rewards/checkout/cashback/{ORDER_FORM_ID}`

ou

`POST /pub/widget/rewards/checkout/cashback`

**Headers**

<ParamField header="X-Bq-Tenant" type="string" required>
  Identificador da loja.
</ParamField>

<ParamField header="X-Bq-SecureToken" type="string" required>
  Token do usuário obtido no login seguro.
</ParamField>

**Path Parameters (GET)**

<ParamField path="ORDER_FORM_ID" type="string" required>
  Identificador do carrinho.
</ParamField>

**Body (POST)**

<ParamField body="CheckoutId" type="string" required>
  Identificador do carrinho (order\_form\_id).
</ParamField>

### Exemplo (GET)

```bash theme={null}
curl -X GET "https://api.bonifiq.com/pub/widget/rewards/checkout/cashback/abc123" \
  -H "X-Bq-Tenant: {tenant_key}" \
  -H "X-Bq-SecureToken: {secure_token}"
```

### Exemplo (POST)

```bash theme={null}
curl -X POST "https://api.bonifiq.com/pub/widget/rewards/checkout/cashback" \
  -H "X-Bq-Tenant: {tenant_key}" \
  -H "X-Bq-SecureToken: {secure_token}" \
  -H "Content-Type: application/json" \
  -d '{
    "CheckoutId": "<order_form_id>"
  }'
```

### Resposta

<ResponseField name="CashbackBalance" type="number">
  Saldo total de cashback do cliente.
</ResponseField>

<ResponseField name="UsableCashback" type="number">
  Valor de cashback que pode ser utilizado nesta compra.
</ResponseField>

<ResponseField name="MaxUsableCashback" type="number">
  Valor máximo de cashback permitido para esta compra.
</ResponseField>

<ResponseField name="CashbackRules" type="string">
  Regras de utilização do cashback (texto para exibição).
</ResponseField>

<ResponseField name="CanUse" type="boolean">
  Indica se o cliente pode usar cashback nesta compra.
</ResponseField>

<ResponseField name="CashbackWillReceiveText" type="string">
  Texto informando quanto cashback o cliente receberá.
</ResponseField>

<ResponseField name="RequiredToAddMoreText" type="string">
  Texto informando quanto falta para usar o cashback.
</ResponseField>

<ResponseField name="IsCashbackAvailable" type="boolean">
  Indica se o cashback está disponível.
</ResponseField>

<ResponseField name="RemainingToTotalCashback" type="number">
  Valor restante para usar todo o cashback.
</ResponseField>

<ResponseField name="RemainingToUse" type="number">
  Valor restante para atingir o mínimo necessário.
</ResponseField>

<ResponseField name="hasProductsIneligibleForCashback" type="boolean">
  Indica se há produtos no carrinho que não são elegíveis para cashback.
</ResponseField>

<ResponseField name="MinValueToUse" type="number">
  Valor mínimo do carrinho para usar cashback.
</ResponseField>

```json theme={null}
{
  "CashbackBalance": 50.00,
  "UsableCashback": 25.00,
  "MaxUsableCashback": 50.00,
  "CashbackRules": "Pague até 50% da compra com cashback.",
  "CanUse": true,
  "CashbackWillReceiveText": "Você receberá R$ 5,00 de cashback nesta compra",
  "RequiredToAddMoreText": null,
  "IsCashbackAvailable": true,
  "RemainingToTotalCashback": 0,
  "RemainingToUse": 0,
  "hasProductsIneligibleForCashback": false,
  "MinValueToUse": 20.00
}
```

***

## 6.1. Aplicar Cashback

Essa etapa será utilizada para a aplicação de cashback.

### Requisição

`POST /pub/widget/rewards/checkout/cashback/{ORDER_FORM_ID}/redeem`

ou

`POST /pub/widget/rewards/checkout/cashback/redeem`

**Headers**

<ParamField header="X-Bq-Tenant" type="string" required>
  Identificador da loja.
</ParamField>

<ParamField header="X-Bq-SecureToken" type="string" required>
  Token do usuário obtido no login seguro.
</ParamField>

**Path Parameters (primeira opção)**

<ParamField path="ORDER_FORM_ID" type="string" required>
  Identificador do carrinho.
</ParamField>

**Body**

<ParamField body="CheckoutId" type="string">
  Identificador do carrinho (order\_form\_id). Obrigatório na segunda opção (sem path param).
</ParamField>

<ParamField body="CashbackValue" type="number" required>
  Valor do cashback a ser resgatado.
</ParamField>

<ParamField body="RedeemOrigin" type="integer" required>
  Origem do resgate. Use `3` para checkout mobile.
</ParamField>

<ParamField body="Total" type="number" required>
  Valor do carrinho (sem descontos ou frete).
</ParamField>

### Exemplo (com path param)

```bash theme={null}
curl -X POST "https://api.bonifiq.com/pub/widget/rewards/checkout/cashback/abc123/redeem" \
  -H "X-Bq-Tenant: {tenant_key}" \
  -H "X-Bq-SecureToken: {secure_token}" \
  -H "Content-Type: application/json" \
  -d '{
    "CashbackValue": 25.00,
    "RedeemOrigin": 3,
    "Total": 150.00
  }'
```

### Exemplo (com body)

```bash theme={null}
curl -X POST "https://api.bonifiq.com/pub/widget/rewards/checkout/cashback/redeem" \
  -H "X-Bq-Tenant: {tenant_key}" \
  -H "X-Bq-SecureToken: {secure_token}" \
  -H "Content-Type: application/json" \
  -d '{
    "CheckoutId": "<order_form_id>",
    "CashbackValue": 25.00,
    "RedeemOrigin": 3,
    "Total": 150.00
  }'
```

### Resposta

```json theme={null}
{
  "AppliedCashback": 25.00,
  "Success": true,
  "CustomerMessage": "Cashback resgatado com sucesso.",
  "CashbackRules": "Pague até 50% da compra com cashback.",
  "InternalMessage": null,
  "CouponCode": null
}
```

***

## 6.2. Consultar Cashback Aplicado

Essa etapa é utilizada para verificar se há cashback aplicado ao carrinho.

### Requisição

`GET /pub/widget/rewards/checkout/cashback/{ORDER_FORM_ID}/redeemed`

ou

`POST /pub/widget/rewards/checkout/cashback/redeemed`

**Headers**

<ParamField header="X-Bq-Tenant" type="string" required>
  Identificador da loja.
</ParamField>

<ParamField header="X-Bq-SecureToken" type="string" required>
  Token do usuário obtido no login seguro.
</ParamField>

**Path Parameters (GET)**

<ParamField path="ORDER_FORM_ID" type="string" required>
  Identificador do carrinho.
</ParamField>

**Body (POST)**

<ParamField body="CheckoutId" type="string" required>
  Identificador do carrinho (order\_form\_id).
</ParamField>

### Exemplo (GET)

```bash theme={null}
curl -X GET "https://api.bonifiq.com/pub/widget/rewards/checkout/cashback/abc123/redeemed" \
  -H "X-Bq-Tenant: {tenant_key}" \
  -H "X-Bq-SecureToken: {secure_token}"
```

### Resposta

```json theme={null}
{
  "AppliedCashback": 25.00,
  "Success": true,
  "CustomerMessage": "Você está utilizando R$ 25,00 de cashback.",
  "CashbackRules": "Pague até 50% da compra com cashback.",
  "InternalMessage": null,
  "CouponCode": null
}
```

***

## 6.3. Atualizar Cashback (Refresh)

Essa etapa é utilizada para recalcular o cashback quando o carrinho é alterado (itens adicionados/removidos).

### Requisição

`POST /pub/widget/rewards/checkout/cashback/{ORDER_FORM_ID}/refresh`

ou

`POST /pub/widget/rewards/checkout/cashback/refresh`

**Headers**

<ParamField header="X-Bq-Tenant" type="string" required>
  Identificador da loja.
</ParamField>

<ParamField header="X-Bq-SecureToken" type="string" required>
  Token do usuário obtido no login seguro.
</ParamField>

**Path Parameters (primeira opção)**

<ParamField path="ORDER_FORM_ID" type="string" required>
  Identificador do carrinho.
</ParamField>

**Body (segunda opção)**

<ParamField body="CheckoutId" type="string" required>
  Identificador do carrinho (order\_form\_id).
</ParamField>

### Exemplo

```bash theme={null}
curl -X POST "https://api.bonifiq.com/pub/widget/rewards/checkout/cashback/refresh" \
  -H "X-Bq-Tenant: {tenant_key}" \
  -H "X-Bq-SecureToken: {secure_token}" \
  -H "Content-Type: application/json" \
  -d '{
    "CheckoutId": "<order_form_id>"
  }'
```

### Resposta

<ResponseField name="CashbackRemoved" type="boolean">
  Indica se o cashback foi removido (por exemplo, se o carrinho ficou abaixo do mínimo).
</ResponseField>

<ResponseField name="CustomerMessage" type="string">
  Mensagem para exibir ao cliente.
</ResponseField>

```json theme={null}
{
  "CashbackRemoved": false,
  "CustomerMessage": "Cashback atualizado com sucesso."
}
```

***

## 7. Consultar Recompensa Aplicada

Esta etapa será utilizada para o caso do cliente sair da tela do checkout e seja necessário reaplicar o estado de recompensa resgatada a ele.

### Requisição (GET)

`GET /pub/widget/rewards/checkout/{checkoutCode}`

### Requisição (POST)

`POST /pub/widget/rewards/checkout`

**Headers**

<ParamField header="X-Bq-Tenant" type="string" required>
  Identificador da loja.
</ParamField>

<ParamField header="X-Bq-SecureToken" type="string" required>
  Token do usuário obtido no login seguro.
</ParamField>

**Path Parameters (GET)**

<ParamField path="checkoutCode" type="string" required>
  Identificador do carrinho (order\_form\_id).
</ParamField>

**Body (POST)**

<ParamField body="CheckoutCode" type="string" required>
  Identificador do carrinho (order\_form\_id).
</ParamField>

### Exemplo (GET)

```bash theme={null}
curl -X GET "https://api.bonifiq.com/pub/widget/rewards/checkout/abc123" \
  -H "X-Bq-Tenant: {tenant_key}" \
  -H "X-Bq-SecureToken: {secure_token}"
```

### Exemplo (POST)

```bash theme={null}
curl -X POST "https://api.bonifiq.com/pub/widget/rewards/checkout" \
  -H "X-Bq-Tenant: {tenant_key}" \
  -H "X-Bq-SecureToken: {secure_token}" \
  -H "Content-Type: application/json" \
  -d '{
    "CheckoutCode": "<order_form_id>"
  }'
```

### Resposta

```json theme={null}
{
  "ProgramName": "VTEX IO QA",
  "HasError": false,
  "Item": {
    "Success": true,
    "CouponCode": "c806711b278a463d8e787f5f5c409f89",
    "Reward": {
      "Id": 302,
      "Title": "10%",
      "Points": 10,
      "CanUse": false
    }
  }
}
```

***

## 8. Remover Recompensa Aplicada

Esta etapa será utilizada para remoção de uma recompensa que foi aplicada ao carrinho.

<Warning>
  Este método apenas remove a recompensa resgatada do carrinho. Ele não realiza o estorno dos pontos para a carteira do consumidor e nem cancela o resgate da recompensa.
</Warning>

### Requisição

`POST /pub/widget/rewards/checkout/{reward_redeemed_id}/reverse`

**Headers**

<ParamField header="X-Bq-Tenant" type="string" required>
  Identificador da loja.
</ParamField>

<ParamField header="X-Bq-SecureToken" type="string" required>
  Token do usuário obtido no login seguro.
</ParamField>

**Path Parameters**

<ParamField path="reward_redeemed_id" type="integer" required>
  ID da recompensa resgatada a ser removida do carrinho.
</ParamField>

### Exemplo

```bash theme={null}
curl -X POST "https://api.bonifiq.com/pub/widget/rewards/checkout/1416/reverse" \
  -H "X-Bq-Tenant: {tenant_key}" \
  -H "X-Bq-SecureToken: {secure_token}"
```

***

## 8.1. Remover Cashback Aplicado

Esta etapa será utilizada para remoção de um cashback que foi aplicado ao carrinho.

<Warning>
  Este método remove o cashback do carrinho e também realiza o estorno dos pontos de volta à carteira do consumidor, diferentemente da remoção de recompensa.
</Warning>

### Requisição

`DELETE /pub/widget/rewards/checkout/cashback/{ORDER_FORM_ID}/redeem`

ou

`POST /pub/widget/rewards/checkout/cashback/redeem/remove`

**Headers**

<ParamField header="X-Bq-Tenant" type="string" required>
  Identificador da loja.
</ParamField>

<ParamField header="X-Bq-SecureToken" type="string" required>
  Token do usuário obtido no login seguro.
</ParamField>

**Path Parameters (DELETE)**

<ParamField path="ORDER_FORM_ID" type="string" required>
  Identificador do carrinho.
</ParamField>

**Body (POST)**

<ParamField body="CheckoutId" type="string" required>
  Identificador do carrinho (order\_form\_id).
</ParamField>

<ParamField body="Total" type="number">
  Valor do carrinho (sem descontos ou frete). Opcional.
</ParamField>

### Exemplo (DELETE)

```bash theme={null}
curl -X DELETE "https://api.bonifiq.com/pub/widget/rewards/checkout/cashback/abc123/redeem" \
  -H "X-Bq-Tenant: {tenant_key}" \
  -H "X-Bq-SecureToken: {secure_token}"
```

### Exemplo (POST)

```bash theme={null}
curl -X POST "https://api.bonifiq.com/pub/widget/rewards/checkout/cashback/redeem/remove" \
  -H "X-Bq-Tenant: {tenant_key}" \
  -H "X-Bq-SecureToken: {secure_token}" \
  -H "Content-Type: application/json" \
  -d '{
    "CheckoutId": "<order_form_id>",
    "Total": 150.00
  }'
```

### Resposta

<ResponseField name="Success" type="boolean">
  Indica se a operação foi bem sucedida.
</ResponseField>

<ResponseField name="CustomerMessage" type="string">
  Mensagem para exibir ao cliente.
</ResponseField>

```json theme={null}
{
  "Success": true,
  "CustomerMessage": "O cashback foi removido com sucesso"
}
```

***

## 9. Consultar Objetivos

Essa etapa é utilizada para listar os objetivos (missões) disponíveis para o cliente no programa de fidelidade. Objetivos são formas de ganhar pontos como compras, indicações, aniversário, etc.

### Requisição

`GET /pub/widget/objectives`

**Headers**

<ParamField header="X-Bq-Tenant" type="string" required>
  Identificador da loja.
</ParamField>

<ParamField header="X-Bq-SecureToken" type="string" required>
  Token do usuário obtido no login seguro.
</ParamField>

### Exemplo

```bash theme={null}
curl -X GET "https://api.bonifiq.com/pub/widget/objectives" \
  -H "X-Bq-Tenant: {tenant_key}" \
  -H "X-Bq-SecureToken: {secure_token}"
```

### Resposta

<ResponseField name="HasError" type="boolean">
  Indica se houve erro na requisição.
</ResponseField>

<ResponseField name="Item" type="array">
  Lista de objetivos disponíveis.

  <Expandable title="Objetivo Object">
    <ResponseField name="Id" type="integer">
      Identificador do objetivo. Corresponde ao `ObjectiveType`.
    </ResponseField>

    <ResponseField name="Type" type="integer">
      Tipo do objetivo (ver tabela abaixo).
    </ResponseField>

    <ResponseField name="Title" type="string">
      Título do objetivo.
    </ResponseField>

    <ResponseField name="Description" type="string">
      Descrição do objetivo.
    </ResponseField>

    <ResponseField name="DetailedDescription" type="string">
      Descrição detalhada (pode conter HTML).
    </ResponseField>

    <ResponseField name="Points" type="integer">
      Quantidade de pontos que o cliente ganha ao completar.
    </ResponseField>

    <ResponseField name="IsCompleted" type="boolean">
      Indica se o objetivo já foi completado pelo cliente.
    </ResponseField>

    <ResponseField name="CanRedeem" type="boolean">
      Indica se o objetivo pode ser resgatado pelo cliente.
    </ResponseField>

    <ResponseField name="MinPoints" type="number">
      Pontos mínimos ganhos (quando há faixa variável).
    </ResponseField>

    <ResponseField name="MaxPoints" type="number">
      Pontos máximos ganhos (quando há faixa variável).
    </ResponseField>

    <ResponseField name="HasMaxUses" type="boolean">
      Indica se o objetivo tem limite de usos.
    </ResponseField>

    <ResponseField name="MaxUses" type="integer">
      Número máximo de vezes que pode ser completado.
    </ResponseField>

    <ResponseField name="Value" type="number">
      Valor associado ao objetivo (ex: valor mínimo de compra).
    </ResponseField>
  </Expandable>
</ResponseField>

```json theme={null}
{
  "HasError": false,
  "Item": [
    {
      "Id": 0,
      "Type": 0,
      "Title": "Faça uma compra",
      "Description": "Ganhe pontos a cada compra realizada",
      "Points": 100,
      "IsCompleted": false,
      "CanRedeem": false,
      "MinPoints": 10,
      "MaxPoints": 500
    },
    {
      "Id": 2,
      "Type": 2,
      "Title": "Cadastre seu aniversário",
      "Description": "Ganhe pontos bônus no seu aniversário",
      "Points": 200,
      "IsCompleted": false,
      "CanRedeem": false,
      "BenefitStatus": 0
    },
    {
      "Id": 4,
      "Type": 4,
      "Title": "Indique um amigo",
      "Description": "Ganhe pontos por cada amigo que comprar",
      "Points": 500,
      "IsCompleted": false,
      "CanRedeem": false,
      "WhatsAppShareText": "Cadastre-se e ganhe desconto!"
    }
  ]
}
```

#### Enumeração `ObjectiveType`

| Valor | Tipo                       | Descrição            |
| :---- | :------------------------- | :------------------- |
| 0     | Purchase                   | Fazer uma compra     |
| 1     | Signup                     | Criar conta          |
| 2     | Birthday                   | Aniversário          |
| 3     | Review                     | Fazer avaliação      |
| 4     | Referral                   | Indicar amigo        |
| 5     | SocialMediaFollowInstagram | Seguir no Instagram  |
| 6     | SocialMediaFollowFacebook  | Seguir no Facebook   |
| 9     | SocialMediaFollowLinkedin  | Seguir no LinkedIn   |
| 10    | SocialMediaFollowTikTok    | Seguir no TikTok     |
| 999   | Custom                     | Objetivo customizado |

***

## 9.1. Objetivo de Compra (Purchase)

O objetivo de compra informa ao cliente quantos pontos ele ganhará ao realizar compras. Os pontos são atribuídos automaticamente quando a compra é confirmada.

<Note>
  Este objetivo é informativo. Os pontos são creditados automaticamente pela plataforma ao confirmar o pedido. Não é necessário chamar nenhum endpoint para "completar" este objetivo.
</Note>

**Campos específicos:**

| Campo        | Tipo    | Descrição                                      |
| ------------ | ------- | ---------------------------------------------- |
| `MinPoints`  | number  | Pontos mínimos que o cliente pode ganhar       |
| `MaxPoints`  | number  | Pontos máximos que o cliente pode ganhar       |
| `Value`      | number  | Valor em reais por ponto (ex: R\$ 1 = 1 ponto) |
| `HasMaxUses` | boolean | Se há limite de compras que geram pontos       |

**Exemplo de exibição:**

> "Ganhe de 10 a 500 pontos a cada compra realizada"

***

## 9.2. Objetivo de Aniversário (Birthday)

O objetivo de aniversário permite ao cliente cadastrar sua data de nascimento e receber um bônus. O bônus pode ser em **pontos** ou em **recompensa** (cupom de desconto).

### Fluxo

1. Verificar o `BenefitStatus` do objetivo
2. Se `BenefitStatus = 0`, exibir formulário para cadastrar data
3. Chamar endpoint para salvar aniversário
4. Se `BenefitStatus = 2`, o bônus está disponível para resgate

#### Enumeração `BenefitStatus`

| Valor | Status                              | Descrição                                    |
| ----- | ----------------------------------- | -------------------------------------------- |
| 0     | BirthDayDateNotSet                  | Data de nascimento não cadastrada            |
| 1     | BirthDayDateSetAfterAvailablePeriod | Data cadastrada, fora do período do bônus    |
| 2     | BirthDayBenefitAvailable            | Bônus de aniversário disponível para resgate |
| 3     | BirthDayBenefitRedeemed             | Bônus já resgatado                           |

### Cadastrar Aniversário

`POST /pub/widget/customer/setbirthday`

**Query Parameters**

<ParamField query="birthday" type="string" required>
  Data de aniversário no formato `dd/MM` ou `yyyy-MM-dd`.
</ParamField>

### Exemplo

```bash theme={null}
curl -X POST "https://api.bonifiq.com/pub/widget/customer/setbirthday?birthday=15/03" \
  -H "X-Bq-Tenant: {tenant_key}" \
  -H "X-Bq-SecureToken: {secure_token}"
```

**Campos específicos do objetivo de aniversário:**

| Campo                    | Tipo    | Descrição                                                    |
| ------------------------ | ------- | ------------------------------------------------------------ |
| `BenefitStatus`          | integer | Status atual do benefício (ver tabela acima)                 |
| `PointBasedBonification` | boolean | Se `true`, o bônus é em pontos. Se `false`, é uma recompensa |
| `RewardType`             | integer | Tipo da recompensa (quando não é por pontos)                 |
| `RewardValue`            | number  | Valor da recompensa                                          |
| `MinimalValue`           | number  | Valor mínimo de compra para usar a recompensa                |

<Warning>
  A data de aniversário só pode ser cadastrada uma vez. Após definida, não pode ser alterada.
</Warning>

***

## 9.3. Objetivo de Indicação (Referral)

O objetivo de indicação permite que o cliente indique amigos e ganhe pontos quando o amigo indicado realiza uma compra.

### 9.3.1. Indicar Amigo por Email

`POST /pub/widget/objectives/referral/refer`

**Body**

<ParamField body="email" type="string" required>
  E-mail do amigo a ser indicado.
</ParamField>

### Exemplo

```bash theme={null}
curl -X POST "https://api.bonifiq.com/pub/widget/objectives/referral/refer" \
  -H "X-Bq-Tenant: {tenant_key}" \
  -H "X-Bq-SecureToken: {secure_token}" \
  -H "Content-Type: application/json" \
  -d '{
    "email": "amigo@email.com"
  }'
```

### 9.3.2. Gerar Link de Indicação

`POST /pub/widget/objectives/referral/friend`

Gera um link de indicação que pode ser compartilhado via WhatsApp, redes sociais ou copiado.

**Body**

<ParamField body="channel" type="string">
  Canal de compartilhamento (ex: `whatsapp`, `copy`).
</ParamField>

### Exemplo

```bash theme={null}
curl -X POST "https://api.bonifiq.com/pub/widget/objectives/referral/friend" \
  -H "X-Bq-Tenant: {tenant_key}" \
  -H "X-Bq-SecureToken: {secure_token}" \
  -H "Content-Type: application/json" \
  -d '{
    "channel": "whatsapp"
  }'
```

### 9.3.3. Gerar Cupom para Amigo

`POST /pub/widget/objectives/referral/coupon`

Gera um cupom de desconto que será utilizado pelo amigo indicado na primeira compra.

### Exemplo

```bash theme={null}
curl -X POST "https://api.bonifiq.com/pub/widget/objectives/referral/coupon" \
  -H "X-Bq-Tenant: {tenant_key}" \
  -H "X-Bq-SecureToken: {secure_token}" \
  -H "Content-Type: application/json"
```

### 9.3.4. Consultar Indicações Enviadas

`GET /pub/widget/objectives/referral/sent`

Retorna a lista de indicações feitas pelo cliente e o status de cada uma.

### Exemplo

```bash theme={null}
curl -X GET "https://api.bonifiq.com/pub/widget/objectives/referral/sent" \
  -H "X-Bq-Tenant: {tenant_key}" \
  -H "X-Bq-SecureToken: {secure_token}"
```

**Campos específicos do objetivo de indicação:**

| Campo               | Tipo   | Descrição                                          |
| ------------------- | ------ | -------------------------------------------------- |
| `WhatsAppShareText` | string | Texto pré-formatado para compartilhar via WhatsApp |
| `ReferralUrl`       | string | URL base para o link de indicação                  |

***

## 9.4. Objetivo de Review (Review)

O objetivo de review recompensa o cliente por avaliar produtos ou a loja.

### Consultar URLs de Avaliação

`GET /pub/widget/objectives/review/urls`

Retorna as URLs de avaliação disponíveis para o cliente (ex: avaliações de pedidos recentes).

### Exemplo

```bash theme={null}
curl -X GET "https://api.bonifiq.com/pub/widget/objectives/review/urls" \
  -H "X-Bq-Tenant: {tenant_key}" \
  -H "X-Bq-SecureToken: {secure_token}"
```

### Resposta

```json theme={null}
{
  "HasError": false,
  "Item": [
    {
      "Url": "https://loja.com/review/pedido-123",
      "OrderId": "pedido-123"
    }
  ]
}
```

**Campos específicos do objetivo de review:**

| Campo                 | Tipo    | Descrição                                                |
| --------------------- | ------- | -------------------------------------------------------- |
| `IsStoreReview`       | boolean | Se `true`, é avaliação da loja. Se `false`, é de produto |
| `HasCommentPoint`     | boolean | Se comentários na avaliação dão pontos extras            |
| `CommentPoints`       | number  | Pontos extras por deixar um comentário                   |
| `HasPhotoPoint`       | boolean | Se enviar foto na avaliação dá pontos extras             |
| `PhotoPoints`         | number  | Pontos extras por enviar foto                            |
| `ReviewAllowRedirect` | boolean | Se deve redirecionar o cliente para a URL de review      |

**Exemplo de exibição:**

> "Avalie sua compra e ganhe 50 pontos + 20 pontos extras por comentário + 30 pontos extras por foto"

***

## 9.5. Objetivos de Redes Sociais

Esses objetivos recompensam o cliente por seguir a loja nas redes sociais.

### Registrar Follow

`POST /pub/widget/objectives/createpointsfollowsocialmedia`

**Body**

<ParamField body="pointTypeSocialMedia" type="integer" required>
  Tipo da rede social (ver tabela abaixo).
</ParamField>

#### Tipos de Rede Social

| Valor | Rede Social |
| ----- | ----------- |
| 5     | Instagram   |
| 6     | Facebook    |
| 9     | LinkedIn    |
| 10    | TikTok      |

### Exemplo

```bash theme={null}
curl -X POST "https://api.bonifiq.com/pub/widget/objectives/createpointsfollowsocialmedia" \
  -H "X-Bq-Tenant: {tenant_key}" \
  -H "X-Bq-SecureToken: {secure_token}" \
  -H "Content-Type: application/json" \
  -d '{
    "pointTypeSocialMedia": 5
  }'
```

### Resposta

```json theme={null}
{
  "HasError": false,
  "Item": {
    "Points": 100,
    "Valid": true
  }
}
```

<Note>
  Os pontos de redes sociais são baseados na confiança — a plataforma registra que o cliente clicou para seguir, mas não verifica automaticamente se ele realmente seguiu.
</Note>

***

## 9.6. Quiz

Quizzes são enquetes interativas que recompensam o cliente por responder perguntas.

### 9.6.1. Listar Quizzes

`GET /pub/widget/quiz`

### Exemplo

```bash theme={null}
curl -X GET "https://api.bonifiq.com/pub/widget/quiz" \
  -H "X-Bq-Tenant: {tenant_key}" \
  -H "X-Bq-SecureToken: {secure_token}"
```

### Resposta

```json theme={null}
{
  "HasError": false,
  "Item": [
    {
      "Id": 1,
      "Name": "Quiz de boas-vindas",
      "AmountOfPoints": 200,
      "AttemptsLeft": 1,
      "IsCompleted": false,
      "Questions": [
        {
          "Id": 10,
          "Question": "Qual sua cor favorita?",
          "Order": 1,
          "Type": 1,
          "Options": [
            { "Id": 100, "Text": "Azul", "Order": 1 },
            { "Id": 101, "Text": "Vermelho", "Order": 2 },
            { "Id": 102, "Text": "Verde", "Order": 3 }
          ]
        }
      ]
    }
  ]
}
```

#### Tipos de Questão

| Valor | Tipo      | Descrição                                               |
| ----- | --------- | ------------------------------------------------------- |
| 0     | Multiple  | Múltipla escolha (várias opções podem ser selecionadas) |
| 1     | Selection | Seleção única (apenas uma opção)                        |
| 2     | Open      | Resposta aberta (texto livre)                           |

### 9.6.2. Obter Quiz Específico

`GET /pub/widget/quiz/{uid}`

**Path Parameters**

<ParamField path="uid" type="string" required>
  Identificador único do quiz.
</ParamField>

### 9.6.3. Responder Quiz

`POST /pub/widget/answer`

**Body**

Array de respostas, onde cada item contém:

<ParamField body="QuizQuestionId" type="integer" required>
  ID da questão sendo respondida.
</ParamField>

<ParamField body="OptionIds" type="array">
  IDs das opções selecionadas (para questões Multiple e Selection).
</ParamField>

<ParamField body="OpenAnswer" type="string">
  Resposta em texto livre (para questões Open).
</ParamField>

### Exemplo

```bash theme={null}
curl -X POST "https://api.bonifiq.com/pub/widget/answer" \
  -H "X-Bq-Tenant: {tenant_key}" \
  -H "X-Bq-SecureToken: {secure_token}" \
  -H "Content-Type: application/json" \
  -d '[
    {
      "QuizQuestionId": 10,
      "OptionIds": [100]
    },
    {
      "QuizQuestionId": 11,
      "OpenAnswer": "Minha resposta em texto"
    }
  ]'
```

***

## 9.7. Objetivo Customizado (Custom)

Objetivos customizados são configurados pela loja e podem representar qualquer ação personalizada. Eles possuem um botão de ação que redireciona o cliente para uma URL externa.

**Campos específicos:**

| Campo              | Tipo   | Descrição                                  |
| ------------------ | ------ | ------------------------------------------ |
| `ActionButtonText` | string | Texto do botão de ação (ex: "Participar")  |
| `ActionButtonURL`  | string | URL para onde o cliente será redirecionado |
| `CustomIcon`       | string | URL do ícone customizado do objetivo       |

**Exemplo de exibição:**

> "Participe do evento exclusivo e ganhe 300 pontos"
> \[Botão: "Participar" → redireciona para URL]

***

## 9.8. Resgatar Objetivo

Para objetivos que permitem resgate manual (como aniversário ou signup), utilize este endpoint.

### Requisição

`GET /pub/widget/objectives/{objectiveType}/redeem`

**Headers**

<ParamField header="X-Bq-Tenant" type="string" required>
  Identificador da loja.
</ParamField>

<ParamField header="X-Bq-SecureToken" type="string" required>
  Token do usuário obtido no login seguro.
</ParamField>

**Path Parameters**

<ParamField path="objectiveType" type="integer" required>
  Tipo do objetivo a ser resgatado (ver tabela `ObjectiveType`).
</ParamField>

### Exemplo

```bash theme={null}
curl -X GET "https://api.bonifiq.com/pub/widget/objectives/2/redeem" \
  -H "X-Bq-Tenant: {tenant_key}" \
  -H "X-Bq-SecureToken: {secure_token}"
```

### Resposta

```json theme={null}
{
  "HasError": false,
  "Item": {
    "Success": true,
    "ResultMessage": "Pontos creditados com sucesso!",
    "CouponCode": null,
    "HasCouponCode": false
  }
}
```
