> ## 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.

# Integração com PDV (Point of Sale)

> Guia completo para integração de sistemas de PDV com a BonifiQ

## Introdução

A integração com PDV permite que sistemas de ponto de venda utilizem os recursos de fidelidade da BonifiQ diretamente no fluxo de compra do consumidor utilizando nossas APIs. Esta documentação cobre todos os endpoints e fluxos necessários para uma integração completa.

<Tip>
  Disponibilizamos um [projeto de referência no GitHub](https://github.com/bonifiq/pdv-bonifiqintegration-example) com um PDV mockado que implementa todos os fluxos descritos nesta documentação. Use-o como guia durante sua implantação.
</Tip>

<Info>
  **Base URL da API**: `https://api.bonifiq.com.br/v1/pvt/POS`

  Consulte também a [documentação interativa Swagger](https://api.bonifiq.com.br/apidocs/private/index.html?url=/swagger/Private%20APIs/swagger.json#/POS)
</Info>

## Autenticação

Saiba mais como utilizar a autenticação (Basic Authentication) com a BonifiQ acessando [esse link](https://developers.bonifiq.com.br/api-private/introduction#autentica%C3%A7%C3%A3o)

***

## Fluxo de Resgate de Recompensas

### Visão Geral

O diagrama abaixo ilustra o fluxo completo de resgate de uma recompensa no PDV:

<img src="https://mintcdn.com/bonifiq/-LDRMCFt4Nj6HYAo/images/pos-integration/01.png?fit=max&auto=format&n=-LDRMCFt4Nj6HYAo&q=85&s=436d98572d5b21ef5b19f1be34e2bb7a" alt="" width="899" height="741" data-path="images/pos-integration/01.png" />

O fluxo pode ser dividido em três etapas principais:

<CardGroup cols={3}>
  <Card title="1. Consulta de Recompensas" icon="search" color="#3B82F6">
    Consulta das recompensas disponíveis para o cliente
  </Card>

  <Card title="2. Validação (Opcional)" icon="shield-check" color="#EF4444">
    Verificação de identidade via código PIN
  </Card>

  <Card title="3. Resgate e Conclusão" icon="check-circle" color="#10B981">
    Resgate da recompensa e aplicação do desconto
  </Card>
</CardGroup>

***

### Consulta de Recompensas

Na BonifiQ é possível que sejam configuradas uma ou mais recompensas.
As recompensas podem ser aplicadas aos pedidos, oferecendo um desconto na compra do cliente.
Alguns exemplos: "desconto de 10% por 1000 pontos", "desconto de R\$ 10 por 100 pontos", "cashback de R\$ 10,00", etc

Para realizar essa consulta, pode-se chamar o endpoint POS/rewards/available. No corpo da chamada, deve-se informar o identificador do usuário (geralmente o CPF ou CNPJ). Esse endpoint retorna uma lista de Recompensas disponíveis para este consumidor.

As recompensas podem ser de 2 tipos:

* Desconto fixo (ex: R\$ 10,00) ou Desconto percentual (ex: 10%)
* Cashback (que também pode ser um desconto)

No caso em que exista mais de uma recompensa possível o PDV deverá exibir uma lista de recompensas ao vendedor, que escolhe apenas uma delas: somente uma recompensa é permitida por compra.

Caso a recompensa escolhida seja Cashback deverá ser possível ao vendedor informar o valor que deseja ser aplicado. Por ex: o cliente possui R\$ 20,00 de Cashback, mas deseja utilizar apenas R\$10,00 nesta compra.

Outro campo importante a se notar é o "Requirements", ele elenca as regras que serão aplicadas para que seja possível utilizar a recompensa. Por exemplo: A recompensa é R\$ 20,00 de Cashback, mas somente poderá ser utiliza em compras acima de R\$ 100,00.
Nesse caso, ao tentar utilizar uma recompensa que não atende às regras, a BonifiQ retorna um erro.

#### Mockups de Exemplo

Os mockups abaixo ilustram um fluxo comum de consulta de recompensas:

<img src="https://mintcdn.com/bonifiq/-LDRMCFt4Nj6HYAo/images/pos-integration/02.png?fit=max&auto=format&n=-LDRMCFt4Nj6HYAo&q=85&s=41b4e0706876822e8fbd7e9318135ebf" alt="" width="773" height="281" data-path="images/pos-integration/02.png" />

* O primeiro passo é a consulta das recompensas. É feita chamada para o endpoint, informando o documento do consumidor (apenas números) e o valor atual do pedido.

<img src="https://mintcdn.com/bonifiq/-LDRMCFt4Nj6HYAo/images/pos-integration/03.png?fit=max&auto=format&n=-LDRMCFt4Nj6HYAo&q=85&s=e41396784a361bc587f8f922d5aa9b00" alt="" width="1134" height="702" data-path="images/pos-integration/03.png" />

* A primeira possibilidade de retorno é uma lista de recompensas disponíveis de Desconto. A imagem detalha quais campos do retorno são utilizados na exibição de cada elemento. Esse cenário não contempla uso de Cashback.
  É importante notar que a última recompensa está inativa (CanUse=false) pois o consumidor não possui pontos suficientes.
  Ao clicar em Escolher o fluxo pode continuar.

<img src="https://mintcdn.com/bonifiq/-LDRMCFt4Nj6HYAo/images/pos-integration/04.png?fit=max&auto=format&n=-LDRMCFt4Nj6HYAo&q=85&s=4befb686bc36f2ab4532b29160af6888" alt="" width="1082" height="654" data-path="images/pos-integration/04.png" />

* A segunda possibilidade de retorno é o Cashback. É importante notar que é possível que sejam retornados Cashback e Descontos ao mesmo tempo.
  Ao clicar em Escolher, deve-se exibir o seletor de valor (vide abaixo).

<img src="https://mintcdn.com/bonifiq/-LDRMCFt4Nj6HYAo/images/pos-integration/05.png?fit=max&auto=format&n=-LDRMCFt4Nj6HYAo&q=85&s=a893381a063bdc6e56e7d52be5083648" alt="" width="1118" height="667" data-path="images/pos-integration/05.png" />

* Quando se deseja utilizar Cashback é possível que seja utilizado apenas parte do mesmo. No exemplo acima podemos observar:
  a) O valor total de cashback que o cliente tem é R\$100,00
  b) O máximo de cashback que ele pode utilizar na compra atual é R\$10,00 (devido à regra descrita em Requirements)
  c) O cliente pode escolher qualquer valor entre R\$1,00 e R\$10,00
  Ao clicar em Confirmar o fluxo pode continuar normalmente.

<img src="https://mintcdn.com/bonifiq/-LDRMCFt4Nj6HYAo/images/pos-integration/06.png?fit=max&auto=format&n=-LDRMCFt4Nj6HYAo&q=85&s=4bf4f7dfd99b93b1cc9acf11311fa901" alt="" width="713" height="543" data-path="images/pos-integration/06.png" />

* Por fim, a terceira possibilidade desse fluxo é de que não há recompensas disponíveis para utilização.

#### API: Consultar Recompensas Disponíveis

<ParamField path="/rewards/available">
  Retorna a lista de recompensas disponíveis para um cliente específico.
</ParamField>

Este endpoint retorna todas as recompensas configuradas, mesmo aquelas que o cliente não pode usar no momento (por falta de pontos, por exemplo). Isso permite exibir ao cliente quais recompensas ele poderá obter no futuro.

<Accordion title="Request Body">
  <ParamField body="CustomerId" type="string" required>
    Identificador do cliente. Pode ser e-mail ou documento (CPF/CNPJ). **Importante**: Se for documento, utilize apenas números.
  </ParamField>

  <ParamField body="PurchaseValue" type="decimal" required>
    Valor atual do pedido. **Não deve incluir** descontos, cupons ou outras promoções.
  </ParamField>

  <ParamField body="DiscountValue" type="decimal">
    Valor de desconto já aplicado no pedido (que não seja da BonifiQ). A BonifiQ usa esta informação para retornar apenas recompensas que podem ser acumuladas com outros descontos. Se não houver desconto, envie `null` ou `0`.
  </ParamField>

  <CodeGroup>
    ```json Request theme={null}
    {
      "CustomerId": "12345678900",
      "PurchaseValue": 150.00,
      "DiscountValue": null
    }
    ```

    ```json Response - Com Recompensas theme={null}
    {
      "HasRewards": true,
      "ShouldValidateCustomer": true,
      "AvailablePoints": 1500,
      "CashbackEnabled": true,
      "AvailableCashback": 25.00,
      "MaxCashbackForCurrentPurchase": 15.00,
      "Rewards": [
        {
          "Id": 1,
          "Title": "R\$10,00 de desconto",
          "RewardType": 1,
          "Value": 10.00,
          "CanSelectValue": false,
          "IsCashback": false,
          "Requirements": "Válido para compras acima de R\$50,00",
          "AvailableCashback": 0,
          "MaxCashbackForCurrentPurchase": 0,
          "CanUse": true,
          "Points": 100,
          "RewardCanBeCumulative": true
        },
        {
          "Id": 2,
          "Title": "15% de desconto",
          "RewardType": 0,
          "Value": 15.00,
          "CanSelectValue": false,
          "IsCashback": false,
          "Requirements": "Válido para compras acima de R\$100,00",
          "AvailableCashback": 0,
          "MaxCashbackForCurrentPurchase": 0,
          "CanUse": true,
          "Points": 500,
          "RewardCanBeCumulative": false
        },
        {
          "Id": 3,
          "Title": "Usar Cashback",
          "RewardType": 3,
          "Value": 1.00,
          "CanSelectValue": true,
          "IsCashback": true,
          "Requirements": "Máximo de 10% do valor da compra",
          "AvailableCashback": 25.00,
          "MaxCashbackForCurrentPurchase": 15.00,
          "CanUse": true,
          "Points": 1500,
          "RewardCanBeCumulative": true
        }
      ]
    }
    ```

    ```json Response - Sem Recompensas theme={null}
    {
      "HasRewards": false,
      "ShouldValidateCustomer": false,
      "AvailablePoints": 50,
      "CashbackEnabled": false,
      "AvailableCashback": 0,
      "MaxCashbackForCurrentPurchase": 0,
      "Rewards": []
    }
    ```
  </CodeGroup>
</Accordion>

<Accordion title="Campos de Resposta">
  ##### Campos de Resposta Importantes

  <ResponseField name="HasRewards" type="boolean">
    Se `false`, não há recompensas disponíveis. O fluxo de recompensas deve ser ignorado.
  </ResponseField>

  <ResponseField name="ShouldValidateCustomer" type="boolean">
    Se `true`, o fluxo deve seguir para a validação do cliente (envio de código PIN). Se `false`, a validação pode ser pulada.
  </ResponseField>

  <ResponseField name="AvailablePoints" type="integer">
    Quantidade de pontos que o cliente possui atualmente.
  </ResponseField>

  <ResponseField name="CashbackEnabled" type="boolean">
    Se `true`, existe uma recompensa de Cashback configurada.
  </ResponseField>

  <ResponseField name="AvailableCashback" type="decimal">
    Valor total de cashback que o cliente possui.
  </ResponseField>

  <ResponseField name="MaxCashbackForCurrentPurchase" type="decimal">
    Valor máximo de cashback que pode ser utilizado na compra atual, considerando as regras configuradas.
  </ResponseField>

  ##### Campos de Cada Recompensa

  <ResponseField name="Rewards[].Id" type="integer">
    ID único da recompensa. Usado posteriormente no resgate.
  </ResponseField>

  <ResponseField name="Rewards[].Title" type="string">
    Título amigável da recompensa para exibição ao usuário. Exemplos: "R\$50,00 de desconto", "10% de desconto", "Usar Cashback"
  </ResponseField>

  <ResponseField name="Rewards[].RewardType" type="enum">
    Tipo da recompensa:

    * `0` - Desconto Percentual (ex: 15% off)
    * `1` - Desconto em Valor (ex: R\$10,00)
    * `3` - Cashback (ex: R\$10,00 em compras acima de R\$30,00)
    * `4` - Recompensa Customizada (ex: Brinde)
  </ResponseField>

  <ResponseField name="Rewards[].Value" type="decimal">
    Valor da recompensa:

    * **Desconto Percentual**: Valor do percentual (ex: `10.00` para 10%)
    * **Desconto em Valor**: Valor em reais (ex: `10.00` para R\$10,00)
    * **Cashback**: Valor de cada ponto em reais
  </ResponseField>

  <ResponseField name="Rewards[].CanUse" type="boolean">
    Se `true`, o cliente pode usar esta recompensa. Se `false`, exiba a recompensa como desabilitada para que o cliente saiba o que pode conquistar no futuro.
  </ResponseField>

  <ResponseField name="Rewards[].Points" type="integer">
    Quantidade de pontos necessários para resgatar esta recompensa.
  </ResponseField>

  <ResponseField name="Rewards[].Requirements" type="string">
    Texto amigável descrevendo os requisitos para usar a recompensa. Exemplo: "Válido para compras acima de R\$50,00"
  </ResponseField>

  <ResponseField name="Rewards[].IsCashback" type="boolean">
    Se `true`, esta é uma recompensa de cashback e o cliente pode escolher o valor a utilizar.
  </ResponseField>

  <ResponseField name="Rewards[].MaxCashbackForCurrentPurchase" type="decimal">
    Para cashback, o valor máximo que pode ser usado nesta compra específica.
  </ResponseField>

  <ResponseField name="Rewards[].RewardCanBeCumulative" type="boolean">
    Se `true`, a recompensa pode ser usada junto com outros descontos. Se `false`, a recompensa só pode ser usada se não houver outros descontos no pedido.
  </ResponseField>
</Accordion>

***

### Validação do Cliente (Opcional)

Essa é uma etapa de segurança, que visa reduzir chances de mal-uso dos benefícios. Sua aplicação é opcional e configurável dentro da BonifiQ.

<Info>
  Para determinar se o PDV deve executar este fluxo, verifique o campo `ShouldValidateCustomer` retornado pela chamada `/POS/rewards/available`:

  * Se `true`: o fluxo de validação **deve** acontecer.
  * Se `false`: o fluxo de validação **não** deve acontecer (deve ser pulado) e o PDV deve ir direto para a etapa de resgate da recompensa.
</Info>

Quando a validação for necessária, após a escolha da recompensa, o PDV deverá chamar o endpoint POS/customers/{id}/challenge. O {id} nesse caso é o CPF ou CNPJ do consumidor. O endpoint também pode receber um número de telefone, para o caso de ainda não existir um número cadastrado.

A BonifiQ, então, irá enviar um código PIN ao consumidor. Ele deverá informar esse código ao vendedor, que por fim, informa ao PDV. O PDV, então, informa esse código ao endpoint POS/customers/{id}/challengevalidate. Se houver uma resposta positiva, o PDV libera para que a compra seja concluída.

<img src="https://mintcdn.com/bonifiq/SNHEO1ekaOfYWdcr/images/pos-integration/07.png?fit=max&auto=format&n=SNHEO1ekaOfYWdcr&q=85&s=0bee86262987957834027a209a405a84" alt="" width="1180" height="565" data-path="images/pos-integration/07.png" />

<Steps>
  <Step title="Enviar Challenge">
    Chame o endpoint de challenge para enviar o código PIN ao cliente.
  </Step>

  <Step title="Cliente Recebe o Código">
    O cliente recebe o código PIN pelo canal configurado.
  </Step>

  <Step title="Validar Código">
    O cliente informa o código ao vendedor, que valida através da API.
  </Step>
</Steps>

#### API: Enviar Challenge

<ParamField path="/customers/{id}/challenge">
  Envia um código PIN de validação para o cliente.
</ParamField>

##### Path Parameters

<ParamField path="id" type="string" required>
  Identificador do cliente (CPF/CNPJ apenas números, ou e-mail).
</ParamField>

<Accordion title="Request Body e Resposta">
  <ParamField body="TransactionId" type="string">
    ID único para identificar esta transação. Pode ser qualquer string vinculada à compra atual. Se não houver um ID disponível, use o timestamp atual.
  </ParamField>

  <ParamField body="Phone" type="string">
    Telefone do cliente. Use este campo se o cliente ainda não tiver telefone cadastrado na BonifiQ.
  </ParamField>

  <ParamField body="Email" type="string">
    E-mail do cliente. Use este campo se o cliente ainda não tiver e-mail cadastrado na BonifiQ.
  </ParamField>

  <CodeGroup>
    ```json Request theme={null}
    {
      "TransactionId": "PDV-001-2024-01-15-10:30",
      "Phone": "11999998888",
      "Email": null
    }
    ```

    ```json Response - Sucesso theme={null}
    {
      "Success": true,
      "FriendlyErrorMessage": null,
      "ShouldInformPhone": false,
      "ShouldInformEmail": false,
      "SentBySMS": true,
      "SentByEmail": false,
      "TransactionId": "PDV-001-2024-01-15-10:30",
      "ErrorMessage": null
    }
    ```

    ```json Response - Telefone Necessário theme={null}
    {
      "Success": false,
      "FriendlyErrorMessage": "É necessário informar o telefone do cliente",
      "ShouldInformPhone": true,
      "ShouldInformEmail": false,
      "SentBySMS": false,
      "SentByEmail": false,
      "TransactionId": "PDV-001-2024-01-15-10:30",
      "ErrorMessage": "Customer phone not found"
    }
    ```
  </CodeGroup>

  ##### Campos de Resposta

  <ResponseField name="Success" type="boolean">
    Se `true`, o challenge foi enviado com sucesso.
  </ResponseField>

  <ResponseField name="SentBySMS" type="boolean">
    Se `true`, o código foi enviado por SMS.
  </ResponseField>

  <ResponseField name="SentByEmail" type="boolean">
    Se `true`, o código foi enviado por e-mail.
  </ResponseField>

  <ResponseField name="ShouldInformPhone" type="boolean">
    Se `true` e `Success=false`, é necessário informar o telefone do cliente em uma nova requisição.
  </ResponseField>

  <ResponseField name="ShouldInformEmail" type="boolean">
    Se `true` e `Success=false`, é necessário informar o e-mail do cliente em uma nova requisição.
  </ResponseField>

  <ResponseField name="FriendlyErrorMessage" type="string">
    Mensagem de erro amigável para exibição ao usuário.
  </ResponseField>
</Accordion>

#### API: Validar Challenge

<ParamField path="/customers/{id}/challengevalidate">
  Valida o código PIN informado pelo cliente.
</ParamField>

##### Path Parameters

<ParamField path="id" type="string" required>
  Identificador do cliente (mesmo usado no challenge).
</ParamField>

<Accordion title="Request Body e Resposta">
  <ParamField body="TransactionId" type="string">
    Mesmo ID usado na chamada de challenge.
  </ParamField>

  <ParamField body="Code" type="string" required>
    Código PIN informado pelo cliente.
  </ParamField>

  <CodeGroup>
    ```json Request theme={null}
    {
      "TransactionId": "PDV-001-2024-01-15-10:30",
      "Code": "123456"
    }
    ```

    ```json Response - Sucesso theme={null}
    {
      "TransactionId": "PDV-001-2024-01-15-10:30",
      "Success": true,
      "FriendlyErrorMessage": null
    }
    ```

    ```json Response - Código Inválido theme={null}
    {
      "TransactionId": "PDV-001-2024-01-15-10:30",
      "Success": false,
      "FriendlyErrorMessage": "Código inválido. Tente novamente."
    }
    ```
  </CodeGroup>
</Accordion>

<Warning>
  Se `success=false`, o fluxo não deve continuar. O vendedor pode solicitar um novo código ou cancelar a operação.
</Warning>

***

### Resgate da Recompensa

Agora, ao finalizar a compra, o PDV chama o endpoint de resgate de recompensa confirmando o resgate. Deve-se utilizar o endpoint POS/rewards/{id}/redeem.

Com a resposta positiva da API, o PDV deve então aplicar o respectivo desconto no pedido.

#### API: Resgatar Recompensa

<ParamField path="/rewards/{id}/redeem">
  Realiza o resgate de uma recompensa para o cliente.
</ParamField>

<Note>
  **Importante**: Diferente de outros endpoints da BonifiQ, este endpoint **NÃO** gera um cupom automaticamente. O PDV é responsável por aplicar o desconto diretamente no pedido.
</Note>

##### Path Parameters

<ParamField path="id" type="integer" required>
  ID da recompensa a ser resgatada (obtido no endpoint `/rewards/available`).
</ParamField>

<Accordion title="Request Body">
  <ParamField body="CustomerId" type="string" required>
    Identificador do cliente (CPF/CNPJ ou e-mail).
  </ParamField>

  <ParamField body="Value" type="decimal">
    **Obrigatório apenas para Cashback**. Valor de cashback que o cliente deseja utilizar. Deve estar entre R\$1,00 e o `maxCashbackForCurrentPurchase`.
  </ParamField>

  <ParamField body="Points" type="integer">
    **Alternativa ao Value para Cashback**. Quantidade de pontos a utilizar. Use `Value` ou `Points`, não ambos.
  </ParamField>

  <ParamField body="OriginalKey" type="string" required>
    Chave única para garantir idempotência. Mesmo que a requisição seja feita mais de uma vez, o resgate acontecerá apenas uma vez.

    **Sugestão de formato**: `{rewardId}-{customerId}-{orderId}-{value}`

    Exemplo: `3-12345678900-PDV001-15.00`
  </ParamField>

  <ParamField body="Branch" type="object">
    Informações da filial/loja onde a compra está sendo realizada.

    <Expandable title="Propriedades">
      <ParamField body="Branch.OriginalId" type="string">
        ID da filial no sistema do cliente.
      </ParamField>

      <ParamField body="Branch.Name" type="string">
        Nome da filial.
      </ParamField>
    </Expandable>
  </ParamField>

  <ParamField body="SalesPerson" type="object">
    Informações do vendedor responsável pela venda.

    <Expandable title="Propriedades">
      <ParamField body="SalesPerson.OriginalId" type="string">
        ID do vendedor no sistema do cliente.
      </ParamField>

      <ParamField body="SalesPerson.Name" type="string">
        Nome do vendedor.
      </ParamField>
    </Expandable>
  </ParamField>

  <ParamField body="Metadatas" type="array">
    Lista de metadados customizados para necessidades específicas do negócio.

    <Expandable title="Propriedades">
      <ParamField body="Metadatas[].Name" type="string">
        Nome do metadado.
      </ParamField>

      <ParamField body="Metadatas[].Value" type="string">
        Valor do metadado.
      </ParamField>
    </Expandable>
  </ParamField>

  <CodeGroup>
    ```json Request - Desconto Fixo theme={null}
    {
      "CustomerId": "12345678900",
      "Value": null,
      "Points": null,
      "OriginalKey": "1-12345678900-PDV001",
      "Branch": {
        "OriginalId": "LOJA-001",
        "Name": "Loja Centro"
      },
      "SalesPerson": {
        "OriginalId": "VEND-123",
        "Name": "João Silva"
      }
    }
    ```

    ```json Request - Cashback theme={null}
    {
      "CustomerId": "12345678900",
      "Value": 15.00,
      "Points": null,
      "OriginalKey": "3-12345678900-PDV001-15.00",
      "Branch": {
        "OriginalId": "LOJA-001",
        "Name": "Loja Centro"
      }
    }
    ```

    ```json Response - Sucesso theme={null}
    {
      "HasError": false,
      "ErrorMessage": null,
      "Result": {
        "RewardId": 456,
        "Point": {
          "PointId": 789,
          "Quantity": -100,
          "Metadatas": null
        },
        "ExternalCode": "BNF-2024-ABC123",
        "OriginalKey": "1-12345678900-PDV001",
        "Coupon": null
      }
    }
    ```
  </CodeGroup>
</Accordion>

<Accordion title="Campos de Resposta">
  <ResponseField name="Result.RewardId" type="integer">
    ID único do resgate realizado. Use este ID para cancelar a recompensa se necessário.
  </ResponseField>

  <ResponseField name="Result.ExternalCode" type="string">
    **IMPORTANTE**: Este código deve ser enviado no campo `Coupon` quando o pedido for cadastrado na BonifiQ. Isso vincula o resgate ao pedido.
  </ResponseField>

  <ResponseField name="Result.OriginalKey" type="string">
    Mesma chave enviada na requisição, confirmando a idempotência.
  </ResponseField>

  <ResponseField name="Result.Point.PointId" type="integer">
    ID do registro de pontos gerado pelo resgate.
  </ResponseField>

  <ResponseField name="Result.Point.Quantity" type="integer">
    Quantidade de pontos utilizados (valor negativo indica débito).
  </ResponseField>
</Accordion>

<Tip>
  Após receber a resposta de sucesso, aplique o desconto correspondente no pedido do PDV. O tipo e valor do desconto foram informados no endpoint `/rewards/available`.
</Tip>

***

## Cadastro de Pedidos

Após a conclusão de uma venda, esta deve ser enviada à BonifiQ para que os pontos sejam creditados ao cliente.

<Note>
  **Importante**: *Todos* os pedidos devem ser enviados à BonifiQ - mesmo aqueles em que não se utilizou um benefício.
</Note>

### Cadastrar Pedido

<ParamField path="/orders">
  Cadastra um pedido na BonifiQ para que o cliente receba os pontos correspondentes.
</ParamField>

Deve-se notar que o campo OrderTotal deve conter o valor pago pelo consumidor, portanto não deve conter valores de descontos, cupons, cashback, promoções, etc.

<Accordion title="Request Body">
  <ParamField body="OriginalId" type="string" required>
    ID do pedido no sistema do cliente (PDV).
  </ParamField>

  <ParamField body="OrderPlacementDate" type="datetime" required>
    Data/hora em que o pedido foi realizado.
  </ParamField>

  <ParamField body="OrderCompletedDate" type="datetime">
    Data/hora em que o pedido foi concluído. Obrigatório se `IsCompleted=true`.
  </ParamField>

  <ParamField body="OrderCancelledDate" type="datetime">
    Data/hora do cancelamento. Obrigatório se `IsCancelledOrReturned=true`.
  </ParamField>

  <ParamField body="OrderStatus" type="string">
    Status do pedido no sistema de origem (informativo).
  </ParamField>

  <ParamField body="IsCompleted" type="boolean" required>
    Se `true`, o pedido está finalizado e os pontos serão concedidos ao cliente.
  </ParamField>

  <ParamField body="IsCancelledOrReturned" type="boolean" required>
    Se `true`, o pedido foi cancelado ou devolvido.
  </ParamField>

  <ParamField body="OrderTotal" type="decimal" required>
    **Valor pago pelo cliente**. Este valor determina quantos pontos o cliente receberá.

    <Warning>
      **NÃO inclua** neste valor:

      * Frete
      * Descontos
      * Cupons
      * Cashback
      * Promoções
      * Gift cards
    </Warning>
  </ParamField>

  <ParamField body="Coupon" type="string">
    **IMPORTANTE**: Se o pedido utilizou uma recompensa da BonifiQ, informe aqui o `ExternalCode` retornado no resgate. Se não utilizou recompensa BonifiQ mas usou outro cupom, informe o código do cupom.
  </ParamField>

  <ParamField body="Customer" type="object" required>
    Dados do cliente comprador.

    <Expandable title="Propriedades">
      <ParamField body="Customer.OriginalId" type="string" required>
        ID do cliente no sistema de origem.
      </ParamField>

      <ParamField body="Customer.Name" type="string" required>
        Nome do cliente.
      </ParamField>

      <ParamField body="Customer.Email" type="string">
        E-mail do cliente.
      </ParamField>

      <ParamField body="Customer.Phone" type="string">
        Telefone do cliente.
      </ParamField>

      <ParamField body="Customer.Document" type="string">
        CPF ou CNPJ do cliente (apenas números).
      </ParamField>

      <ParamField body="Customer.BirthdayDate" type="datetime">
        Data de nascimento do cliente.
      </ParamField>

      <ParamField body="Customer.SignupDate" type="datetime">
        Data de cadastro do cliente.
      </ParamField>

      <ParamField body="Customer.IsEnrolled" type="boolean">
        Se `true`, o cliente participa do programa de fidelidade. Default: `true`.
      </ParamField>
    </Expandable>
  </ParamField>

  <ParamField body="Products" type="array">
    Lista de produtos do pedido.

    <Expandable title="Propriedades">
      <ParamField body="Products[].OriginalId" type="string">
        ID do produto.
      </ParamField>

      <ParamField body="Products[].Name" type="string">
        Nome do produto.
      </ParamField>

      <ParamField body="Products[].Quantity" type="integer">
        Quantidade.
      </ParamField>

      <ParamField body="Products[].Price" type="decimal">
        Preço unitário.
      </ParamField>
    </Expandable>
  </ParamField>

  <ParamField body="PaymentMethod" type="object">
    Método de pagamento utilizado.

    <Expandable title="Propriedades">
      <ParamField body="PaymentMethod.OriginalId" type="string">
        ID do método de pagamento.
      </ParamField>

      <ParamField body="PaymentMethod.Name" type="string">
        Nome do método (ex: "Cartão Visa Crédito", "PIX", "Dinheiro").
      </ParamField>
    </Expandable>
  </ParamField>

  <ParamField body="Branch" type="object">
    Filial onde a compra foi realizada.

    <Expandable title="Propriedades">
      <ParamField body="Branch.OriginalId" type="string">
        ID da filial.
      </ParamField>

      <ParamField body="Branch.Name" type="string">
        Nome da filial.
      </ParamField>
    </Expandable>
  </ParamField>

  <ParamField body="SalesPerson" type="object">
    Vendedor responsável pela venda.

    <Expandable title="Propriedades">
      <ParamField body="SalesPerson.OriginalId" type="string">
        ID do vendedor.
      </ParamField>

      <ParamField body="SalesPerson.Name" type="string">
        Nome do vendedor.
      </ParamField>
    </Expandable>
  </ParamField>

  <ParamField body="Metadatas" type="array">
    Lista de metadados customizados.

    <Expandable title="Propriedades">
      <ParamField body="Metadatas[].Name" type="string">
        Nome do metadado.
      </ParamField>

      <ParamField body="Metadatas[].Value" type="string">
        Valor do metadado.
      </ParamField>
    </Expandable>
  </ParamField>
</Accordion>

<Accordion title="Exemplos de Requisição e Resposta">
  <CodeGroup>
    ```json Request - Pedido com Recompensa BonifiQ theme={null}
    {
      "OriginalId": "PDV-2024-001234",
      "OrderPlacementDate": "2024-01-15T10:30:00Z",
      "OrderCompletedDate": "2024-01-15T10:35:00Z",
      "OrderCancelledDate": null,
      "OrderStatus": "Concluído",
      "IsCancelledOrReturned": false,
      "IsCompleted": true,
      "OrderTotal": 140.00,
      "Coupon": "BNF-2024-ABC123",
      "Customer": {
        "OriginalId": "CLI-12345",
        "Name": "Maria Silva",
        "Email": "maria@email.com",
        "Phone": "11999998888",
        "Document": "12345678900",
        "BirthdayDate": "1990-05-15",
        "SignupDate": "2023-06-01T00:00:00Z",
        "IsEnrolled": true
      },
      "Products": [
        {
          "OriginalId": "PROD-001",
          "Name": "Camiseta Azul M",
          "Quantity": 2,
          "Price": 75.00
        }
      ],
      "PaymentMethod": {
        "OriginalId": "PIX",
        "Name": "PIX"
      },
      "Branch": {
        "OriginalId": "LOJA-001",
        "Name": "Loja Centro"
      },
      "SalesPerson": {
        "OriginalId": "VEND-123",
        "Name": "João Silva"
      },
      "Metadatas": [
        {
          "Name": "canal_venda",
          "Value": "presencial"
        }
      ]
    }
    ```

    ```json Request - Pedido sem Recompensa theme={null}
    {
      "OriginalId": "PDV-2024-001235",
      "OrderPlacementDate": "2024-01-15T11:00:00Z",
      "OrderCompletedDate": "2024-01-15T11:05:00Z",
      "OrderCancelledDate": null,
      "OrderStatus": "Concluído",
      "IsCancelledOrReturned": false,
      "IsCompleted": true,
      "OrderTotal": 200.00,
      "Coupon": null,
      "Customer": {
        "OriginalId": "CLI-67890",
        "Name": "João Santos",
        "Email": "joao@email.com",
        "Phone": "11888887777",
        "Document": "98765432100",
        "IsEnrolled": true
      }
    }
    ```

    ```json Response - Sucesso theme={null}
    {
      "HasError": false,
      "ErrorMessage": null,
      "Result": {
        "OriginalId": "PDV-2024-001234",
        "OrderPlacementDate": "2024-01-15T10:30:00Z",
        "OrderCompletedDate": "2024-01-15T10:35:00Z",
        "OrderCancelledDate": null,
        "OrderStatus": "Concluído",
        "IsCancelledOrReturned": false,
        "IsCompleted": true,
        "OrderTotal": 140.00,
        "Coupon": "BNF-2024-ABC123",
        "State": 2,
        "Origin": 1,
        "Customer": {
          "OriginalId": "CLI-12345",
          "Name": "Maria Silva",
          "Email": "maria@email.com"
        }
      }
    }
    ```
  </CodeGroup>
</Accordion>

***

### Cancelar Pedido

<ParamField path="/orders/{orderId}/cancel">
  Cancela um pedido existente na BonifiQ.
</ParamField>

Quando um pedido é cancelado, a BonifiQ automaticamente:

* Marca o pedido como Cancelado (refletido nos relatórios)
* Estorna os pontos concedidos ao cliente (se houver)
* Estorna as recompensas utilizadas (se houver)

#### Path Parameters

<ParamField path="orderId" type="string" required>
  O `OriginalId` do pedido que foi enviado quando o pedido foi criado.
</ParamField>

<Accordion title="Request Body e Resposta">
  <ParamField body="OrderCancelledDate" type="datetime" required>
    Data/hora do cancelamento.
  </ParamField>

  <ParamField body="OrderStatus" type="string">
    Novo status do pedido (informativo).
  </ParamField>

  <CodeGroup>
    ```json Request theme={null}
    {
      "OrderCancelledDate": "2024-01-15T15:30:00Z",
      "OrderStatus": "Cancelado"
    }
    ```

    ```json Response theme={null}
    {
      "HasError": false,
      "Result": {
        "IsCanceled": true,
        "UpdatedAt": "2024-01-15T15:30:00Z",
        "Status": {
          "Code": 3,
          "Description": "Cancelado"
        }
      }
    }
    ```
  </CodeGroup>
</Accordion>

***

### Cancelamento Parcial de Pedido

<ParamField path="/{orderId}/partialcancel">
  Cancela parcialmente um pedido, estornando pontos/cashback proporcionalmente.
</ParamField>

Use este endpoint quando o cliente devolve apenas parte dos produtos de uma compra.

#### Path Parameters

<ParamField path="orderId" type="string" required>
  O `OriginalId` do pedido.
</ParamField>

<Accordion title="Request Body e Resposta">
  <ParamField body="ValueToRefund" type="decimal" required>
    Valor a ser estornado. Deve ser maior que zero e menor ou igual ao `OrderTotal` original.
  </ParamField>

  <ParamField body="CancelKey" type="string" required>
    Chave única para garantir idempotência. Evita cancelamentos duplicados do mesmo valor. Use um ID único para cada solicitação de cancelamento parcial.
  </ParamField>

  <CodeGroup>
    ```json Request theme={null}
    {
      "ValueToRefund": 50.00,
      "CancelKey": "REFUND-PDV001-2024-001"
    }
    ```

    ```json Response theme={null}
    {
      "HasError": false,
      "Result": {
        "IsCanceled": true,
        "UpdatedAt": "2024-01-15T16:00:00Z",
        "Status": {
          "Code": 2,
          "Description": "Completo"
        }
      }
    }
    ```
  </CodeGroup>
</Accordion>

<Note>
  O cancelamento parcial estorna pontos/cashback proporcionalmente ao valor devolvido. Por exemplo, se o pedido original era de R\$200,00 e rendeu 200 pontos, um estorno de R\$50,00 removerá aproximadamente 50 pontos do cliente.
</Note>

***

## Cancelamento de Recompensas

Quando um resgate é realizado, os pontos correspondentes são debitados do cliente.
Se a venda ainda não foi concluída, é possível cancelar o resgate - devolvendo os pontos (ou cashback) de volta ao cliente.

Existem duas formas de cancelar uma recompensa resgatada:

### Cancelar por ID da Recompensa

<ParamField path="/rewards/{id}">
  Cancela uma recompensa pelo ID do resgate.
</ParamField>

#### Path Parameters

<ParamField path="id" type="integer" required>
  O `RewardId` retornado no endpoint de resgate.
</ParamField>

<Accordion title="Exemplo de Requisição e Resposta">
  <CodeGroup>
    ```bash Request theme={null}
    DELETE /v1/pvt/POS/rewards/456
    ```

    ```json Response theme={null}
    {
      "HasError": false,
      "Result": {
        "Id": 456,
        "Customer": {
          "OriginalId": "12345678900",
          "Name": "Maria Silva",
          "Email": "maria@email.com"
        },
        "ExternalCode": "BNF-2024-ABC123",
        "CashValue": 10.00,
        "IsCanceled": true,
        "RedeemDate": "2024-01-15T10:30:00Z",
        "Points": {
          "Id": 789,
          "Points": -100,
          "Type": 4,
          "EventKey": "reward-456"
        }
      }
    }
    ```
  </CodeGroup>
</Accordion>

### Cancelar por OriginalKey

<ParamField path="/rewards">
  Cancela uma recompensa pela OriginalKey usada no resgate.
</ParamField>

<Accordion title="Request Body e Resposta">
  <ParamField body="OriginalKey" type="string" required>
    A mesma `OriginalKey` utilizada no momento do resgate.
  </ParamField>

  <CodeGroup>
    ```json Request theme={null}
    {
      "OriginalKey": "1-12345678900-PDV001"
    }
    ```

    ```json Response theme={null}
    {
      "HasError": false,
      "Result": {
        "Id": 456,
        "Customer": {
          "OriginalId": "12345678900",
          "Name": "Maria Silva",
          "Email": "maria@email.com"
        },
        "ExternalCode": "BNF-2024-ABC123",
        "CashValue": 10.00,
        "IsCanceled": true,
        "RedeemDate": "2024-01-15T10:30:00Z",
        "Points": {
          "Id": 789,
          "Points": -100,
          "Type": 4,
          "EventKey": "reward-456"
        }
      }
    }
    ```
  </CodeGroup>
</Accordion>

<Warning>
  O cancelamento de uma recompensa **devolve os pontos ao cliente**. Esta operação não pode ser desfeita.
</Warning>

***

## Tratamento de Erros

Todos os endpoints retornam erros no seguinte formato:

```json theme={null}
{
  "HasError": true,
  "ErrorMessage": "Descrição técnica do erro",
  "FriendlyErrorMessage": "Mensagem amigável para o usuário"
}
```

### Códigos de Erro Comuns

| Cenário                                | Ação Recomendada                                       |
| -------------------------------------- | ------------------------------------------------------ |
| Cliente não encontrado                 | Verificar se o documento foi digitado corretamente     |
| Pontos insuficientes                   | Informar ao cliente que ele não tem pontos suficientes |
| Valor de compra abaixo do mínimo       | Informar o valor mínimo necessário                     |
| Challenge expirado                     | Solicitar novo código ao cliente                       |
| Código PIN inválido                    | Permitir nova tentativa ou cancelar                    |
| Recompensa já resgatada (idempotência) | A operação já foi realizada, prosseguir                |

***

## Boas Práticas

<AccordionGroup>
  <Accordion title="Sempre use OriginalKey para idempotência">
    Em sistemas distribuídos, falhas de rede podem causar requisições duplicadas. Use sempre a `OriginalKey` com um valor único e consistente para evitar resgates ou cancelamentos duplicados.
  </Accordion>

  <Accordion title="Vincule o resgate ao pedido">
    Sempre envie o `ExternalCode` retornado no resgate como valor do campo `Coupon` ao cadastrar o pedido. Isso permite rastreamento completo.
  </Accordion>

  <Accordion title="Não inclua descontos no OrderTotal">
    O `OrderTotal` deve refletir apenas o valor efetivamente pago pelo cliente, sem frete, descontos, cupons ou promoções. Isso garante o cálculo correto de pontos.
  </Accordion>

  <Accordion title="Trate a validação como opcional">
    Verifique o campo `shouldValidateCustomer` antes de iniciar o fluxo de challenge. Se `false`, pule direto para o resgate.
  </Accordion>

  <Accordion title="Exiba recompensas indisponíveis como desabilitadas">
    Mesmo que `canUse=false`, exiba a recompensa ao cliente (em estado desabilitado). Isso o motiva a acumular mais pontos para futuras compras.
  </Accordion>
</AccordionGroup>

***

## Projeto de Referência

Disponibilizamos um **repositório público no GitHub** com um PDV mockado que demonstra a integração completa com a BonifiQ. Este projeto pode ser usado como referência para auxiliar no desenvolvimento da sua integração.

<Card title="PDV BonifiQ Integration Example" icon="github" href="https://github.com/bonifiq/pdv-bonifiqintegration-example">
  Repositório com código-fonte de um PDV de exemplo integrado com a API da BonifiQ. Inclui implementação de todos os fluxos documentados nesta página.
</Card>

O projeto de referência inclui:

* Implementação completa do fluxo de resgate de recompensas
* Exemplos de tratamento de erros
* Integração com autenticação Basic Auth
* Interface de usuário mockada para testes

***

## Checklist de Implementação

Use esta lista para acompanhar seu progresso na integração:

<AccordionGroup>
  <Accordion title="Configuração Inicial">
    * [ ] Obter credenciais de API (usuário e senha)
    * [ ] Configurar autenticação Basic Auth no sistema
    * [ ] Testar conexão com a API em ambiente de sandbox
  </Accordion>

  <Accordion title="Fluxo de Recompensas">
    * [ ] Implementar consulta de recompensas (`/rewards/available`)
    * [ ] Exibir lista de recompensas disponíveis ao vendedor
    * [ ] Tratar cenário "sem recompensas disponíveis"
    * [ ] Implementar seleção de valor para Cashback
    * [ ] Implementar validação via challenge (se aplicável)
    * [ ] Implementar resgate de recompensa (`/rewards/{id}/redeem`)
    * [ ] Aplicar desconto no pedido após resgate
  </Accordion>

  <Accordion title="Gestão de Pedidos">
    * [ ] Implementar cadastro de pedidos (`/orders`)
    * [ ] Enviar `ExternalCode` no campo `Coupon` quando houver resgate
    * [ ] Implementar cancelamento total de pedidos
    * [ ] Implementar cancelamento parcial (se necessário)
  </Accordion>

  <Accordion title="Tratamento de Erros">
    * [ ] Tratar erros de autenticação
    * [ ] Tratar erros de cliente não encontrado
    * [ ] Tratar erros de pontos insuficientes
    * [ ] Exibir mensagens amigáveis ao usuário
  </Accordion>

  <Accordion title="Testes e Validação">
    * [ ] Testar fluxo completo de resgate em sandbox
    * [ ] Testar cancelamento de recompensa
    * [ ] Testar cadastro de pedido com e sem recompensa
    * [ ] Validar idempotência com `OriginalKey`
    * [ ] Testar em produção com valores reais
  </Accordion>
</AccordionGroup>

***

## Ambiente de Testes (Sandbox)

Para desenvolvimento e testes, utilize o mesmo endpoint de produção, porém com credenciais específicas de sandbox, fornecidas pela BonifiQ.

<Info>
  **URL de Sandbox**: `https://api.bonifiq.com.br/v1/pvt/POS`

  Entre em contato com o suporte para obter credenciais de teste.
</Info>

## Limites da API (Rate Limits)

Para garantir a estabilidade do serviço, a API possui limites de requisições:

| Tipo de Limite          | Valor  | Período     |
| ----------------------- | ------ | ----------- |
| Requisições por segundo | 10     | Por segundo |
| Requisições por minuto  | 300    | Por minuto  |
| Requisições por hora    | 10.000 | Por hora    |

<Note>
  Se você atingir o limite, receberá uma resposta HTTP `429 Too Many Requests`. Implemente um mecanismo de retry com backoff exponencial para lidar com esses casos.
</Note>

***

## Glossário

<AccordionGroup>
  <Accordion title="Recompensa">
    Benefício que o cliente pode resgatar usando seus pontos acumulados. Pode ser um desconto fixo (ex: R\$10,00), desconto percentual (ex: 15% off), ou cashback.
  </Accordion>

  <Accordion title="Pontos">
    Unidade de crédito acumulada pelo cliente a cada compra. A quantidade de pontos é calculada com base no valor do pedido e nas regras configuradas pelo lojista.
  </Accordion>

  <Accordion title="Cashback">
    Pontos e Cashback são intercambiáveis - cada ponto possui um valor em reais definido pelo lojista. Ao resgatar uma recompensa de cashback, o cliente utiliza seus pontos para obter um saldo em reais.
    Ela é um tipo especial de recompensa: diferente dos pontos, o cliente pode escolher quanto do cashback deseja utilizar.
  </Accordion>

  <Accordion title="Challenge">
    Processo de validação de identidade onde um código PIN é enviado ao cliente. O cliente deve informar este código ao vendedor para confirmar que é o titular da conta.
  </Accordion>

  <Accordion title="OriginalKey">
    Chave única usada para garantir idempotência nas operações. Se a mesma OriginalKey for enviada mais de uma vez, a API garante que a operação será executada apenas uma vez, evitando duplicações.
  </Accordion>

  <Accordion title="ExternalCode">
    Código informado no momento do resgate de uma recompensa. Este código deve ser enviado no campo `Coupon` ao cadastrar o pedido, permitindo vincular o resgate ao pedido final.
  </Accordion>

  <Accordion title="PDV (Point of Sale)">
    Sistema de Ponto de Venda utilizado em lojas físicas para processar vendas. A integração com a BonifiQ permite que o PDV consulte e resgate recompensas durante o processo de venda.
  </Accordion>

  <Accordion title="OrderTotal">
    Valor efetivamente pago pelo cliente, excluindo frete, descontos, cupons e promoções. Este valor é usado para calcular os pontos que o cliente receberá pela compra.
  </Accordion>
</AccordionGroup>

***

## FAQ - Perguntas Frequentes

<AccordionGroup>
  <Accordion title="O que acontece se eu enviar o mesmo pedido duas vezes?">
    Se você enviar um pedido com o mesmo `OriginalId`, a BonifiQ atualizará o pedido já existente na base.
  </Accordion>

  <Accordion title="Posso usar mais de uma recompensa por compra?">
    Não. O sistema permite apenas uma recompensa por compra. Se houver múltiplas recompensas disponíveis, o vendedor deve apresentar as opções ao cliente para que ele escolha qual deseja utilizar.
  </Accordion>

  <Accordion title="O PIN será enviado por e-mail, WhatsApp ou SMS?">
    O e-mail sempre é enviado, quando disponível. WhatsApp e SMS precisam ser contratados à parte com a BonifiQ. Também é possível enviar o PIN via webhooks para disparos externos.
  </Accordion>

  <Accordion title="Quanto tempo o código PIN do challenge é válido?">
    O código PIN é válido por **60 minutos** após o envio. Se expirar, o vendedor deve solicitar um novo código através do endpoint de challenge.
  </Accordion>

  <Accordion title="O cliente precisa estar cadastrado previamente na BonifiQ?">
    Não necessariamente. Se o cliente não existir, ele será criado automaticamente quando o primeiro pedido for cadastrado. Porém, para consultar recompensas e resgatar benefícios, o cliente precisa ter um histórico de compras que tenha gerado pontos.
  </Accordion>

  <Accordion title="Como sei se devo pedir validação por challenge?">
    Verifique o campo `ShouldValidateCustomer` na resposta do endpoint `/rewards/available`. Se for `true`, você deve executar o fluxo de challenge antes do resgate. Se for `false`, pode pular direto para o resgate.
  </Accordion>

  <Accordion title="Posso cancelar uma recompensa já resgatada?">
    Sim, desde que o pedido ainda não tenha sido finalizado. Use o endpoint de cancelamento de recompensa (`DELETE /rewards/{id}`) ou envie a `OriginalKey` para cancelar. Os pontos/cashback serão devolvidos ao cliente.
  </Accordion>

  <Accordion title="O que é a OriginalKey e como devo gerá-la?">
    A `OriginalKey` é uma chave única que identifica uma operação específica. Recomendamos o formato: `{rewardId}-{customerId}-{orderId}-{timestamp}`. Ela garante que mesmo se houver falha de rede e você reenviar a requisição, a operação será executada apenas uma vez.
  </Accordion>

  <Accordion title="Por que meu OrderTotal deve excluir descontos?">
    O `OrderTotal` representa o valor real da compra para cálculo de pontos. Se incluir descontos, o cliente receberia menos pontos do que deveria. Envie sempre o valor dos produtos antes de qualquer desconto, cupom ou promoção.
  </Accordion>

  <Accordion title="Preciso enviar pedidos que não usaram benefícios da BonifiQ?">
    Sim! **Todos os pedidos** devem ser enviados à BonifiQ, independentemente de terem utilizado recompensas ou não. Isso é essencial para que os clientes acumulem pontos em todas as compras.
  </Accordion>

  <Accordion title="Como funciona o cancelamento parcial de pedido?">
    O cancelamento parcial permite estornar apenas parte do valor do pedido (ex: devolução de um item). A BonifiQ calcula proporcionalmente os pontos a serem removidos. Por exemplo, se um pedido de R\$200 gerou 200 pontos e você estorna R\$50, aproximadamente 50 pontos serão removidos do cliente.
  </Accordion>
</AccordionGroup>

***

## Suporte

Em caso de dúvidas ou problemas na integração:

* **Documentação Swagger**: [API Docs](https://api.bonifiq.com.br/apidocs/private/index.html?url=/swagger/Private%20APIs/swagger.json#/POS)
* **Central de Ajuda**: [suporte.bonifiq.com.br](https://suporte.bonifiq.com.br)
* **E-mail**: [suporte@bonifiq.com.br](mailto:suporte@bonifiq.com.br)
