> ## Documentation Index
> Fetch the complete documentation index at: https://docs.fire.rest/llms.txt
> Use this file to discover all available pages before exploring further.

# Injetar pedido

> Injete um pedido no Fire. O Fire gerencia o ciclo de vida do pedido e envia atualizações de status de volta via webhooks.

<ParamField header="Authorization" type="string" required>
  Token Bearer obtido em [POST /login](/pt/api-reference/login). Formato: `Bearer <accessToken>`.
</ParamField>

<ParamField header="x-api-key" type="string" required>
  Sua API key do Fire.
</ParamField>

<ParamField header="x-client-channel" type="string" required>
  Deve ser `integration`. Identifica a requisição como vinda de uma integração externa.
</ParamField>

<ParamField header="account" type="string" required>
  Identificador da conta à qual a requisição pertence.
</ParamField>

<ParamField body="orderId" type="string" required>
  Identificador único do pedido no seu sistema.
</ParamField>

<ParamField body="source" type="string" required>
  Origem do pedido. Exemplos: `App`, `Kiosco`.
</ParamField>

<ParamField body="platform" type="string">
  Plataforma do cliente. Exemplos: `Android`, `iOS`, `Web`.
</ParamField>

<ParamField body="channel" type="object" required>
  Detalhes do canal de venda. Use valores `uid` dos webhooks de publicação (por exemplo [`channel.updated`](/pt/webhook-reference/channel-updated)) ou da configuração de canais no painel ([Integrações de agregadores](/pt/configuration/backoffice-integrations)).

  <Expandable title="channel">
    <ParamField body="uid" type="string" required>UID do canal no Fire.</ParamField>

    <ParamField body="code" type="string" required>
      Código do tipo de canal. Um de: `POS`, `Kiosk`, `App`, `Web`, `CallCenter`, `Aggregator`.
    </ParamField>

    <ParamField body="metadata" type="object">Metadados adicionais do canal.</ParamField>
  </Expandable>
</ParamField>

<ParamField body="service" type="object" required>
  Detalhes do serviço de fulfillment. Use valores `uid` do array `services` nesses payloads de canal ou as mesmas fontes que `channel`.

  <Expandable title="service">
    <ParamField body="uid" type="string" required>UID do serviço no Fire.</ParamField>

    <ParamField body="code" type="string" required>
      Código do tipo de fulfillment. Um de: `DELIVERY`, `TAKEAWAY`, `PICKUP`, `DINE_IN`.
    </ParamField>

    <ParamField body="metadata" type="object">Metadados adicionais do serviço.</ParamField>
  </Expandable>
</ParamField>

<ParamField body="device" type="object">
  Detalhes do dispositivo. `null` para canais sem dispositivo físico.

  <Expandable title="device">
    <ParamField body="uid" type="string">UID do dispositivo.</ParamField>
    <ParamField body="name" type="string">Nome de exibição do dispositivo (ex.: `KIOSK`).</ParamField>
    <ParamField body="platform" type="string">Plataforma do dispositivo (ex.: `android`, `ios`).</ParamField>
    <ParamField body="metadata" type="object">Metadados adicionais do dispositivo.</ParamField>

    <ParamField body="externalId" type="string">
      Ponto de emissão fiscal do dispositivo. Usado apenas ao
      [solicitar o documento fiscal](/pt/api-reference/fiscal-documents); aqui é aceito e ignorado.
    </ParamField>
  </Expandable>
</ParamField>

<ParamField body="fiscal" type="object">
  Resultado de [Solicitar documento fiscal](/pt/api-reference/fiscal-documents), copiado tal
  como veio. Opcional: se você não fiscalizou antes de injetar, omita — o Fire resolve a
  fiscalização por conta própria.

  O Fire pega daqui os dados do comprovante para o pedido e ignora o resto. O status do
  documento perante o fisco é responsabilidade do Fire: `documentStatus` é ignorado se vier.
</ParamField>

<ParamField body="operator" type="object">
  Operador ou caixa que processou o pedido. `null` para canais self-service.

  <Expandable title="operator">
    <ParamField body="uid" type="string">UID do operador.</ParamField>
    <ParamField body="name" type="string">Nome de exibição do operador.</ParamField>

    <ParamField body="session" type="object">
      Detalhes da sessão ativa.

      <Expandable title="session">
        <ParamField body="uid" type="string">UID da sessão.</ParamField>
      </Expandable>
    </ParamField>

    <ParamField body="metadata" type="object">Metadados adicionais do operador.</ParamField>
  </Expandable>
</ParamField>

<ParamField body="selectedShippingMethod" type="string" required>
  Método de envio selecionado pelo cliente. Valores: `delivery`, `pickup`.
</ParamField>

<ParamField body="accumulatePoints" type="boolean">
  Indica se o cliente acumula pontos de fidelidade neste pedido.
</ParamField>

<ParamField body="redeemPoints" type="boolean">
  Indica se o cliente resgata pontos de fidelidade neste pedido.
</ParamField>

<ParamField body="discount" type="boolean">
  Indica se descontos são aplicados neste pedido.
</ParamField>

<ParamField body="orderComment" type="string">
  Comentário geral do cliente para o pedido inteiro.
</ParamField>

<ParamField body="client" type="object" required>
  Informações do cliente.

  <Expandable title="client">
    <ParamField body="uid" type="string">
      Identificador único do cliente vindo do provedor de autenticação.
    </ParamField>

    <ParamField body="name" type="string" required>
      Nome.
    </ParamField>

    <ParamField body="lastName" type="string">
      Sobrenome.
    </ParamField>

    <ParamField body="phone" type="string">
      Número de telefone.
    </ParamField>

    <ParamField body="email" type="string">
      Endereço de e-mail.
    </ParamField>

    <ParamField body="govIdType" type="string">
      Tipo de documento. Exemplo: `DNI`, `CI`.
    </ParamField>

    <ParamField body="govIdNumber" type="string">
      Número do documento.
    </ParamField>

    <ParamField body="externalId" type="string">
      ID do cliente em um sistema externo.
    </ParamField>

    <ParamField body="id" type="string">
      ID do cliente no Fire.
    </ParamField>

    <ParamField body="billingInformation" type="object">
      Dados de faturamento.

      <Expandable title="billingInformation">
        <ParamField body="businessName" type="string">Razão social ou nome da pessoa para a fatura.</ParamField>
        <ParamField body="govIdType" type="string">Tipo de documento para faturamento.</ParamField>
        <ParamField body="govIdNumber" type="string">Número de documento para faturamento.</ParamField>
        <ParamField body="phone" type="string">Telefone de faturamento.</ParamField>
        <ParamField body="email" type="string">E-mail de faturamento.</ParamField>
        <ParamField body="address" type="string">Endereço de faturamento.</ParamField>
        <ParamField body="externalId" type="string">ID de faturamento em sistema externo.</ParamField>
        <ParamField body="id" type="string">ID de faturamento no Fire.</ParamField>
      </Expandable>
    </ParamField>

    <ParamField body="additional_info" type="object">
      Dados adicionais do cliente (ex.: data de nascimento, gênero).
    </ParamField>
  </Expandable>
</ParamField>

<ParamField body="store" type="object" required>
  Loja onde o pedido é realizado.

  <Expandable title="store">
    <ParamField body="id" type="integer" required>ID da loja.</ParamField>
    <ParamField body="name" type="string">Nome de exibição da loja.</ParamField>
    <ParamField body="code" type="string">Código da loja.</ParamField>
    <ParamField body="vendorId" type="integer">Identificador da marca.</ParamField>
    <ParamField body="vendorName" type="string">Nome da marca.</ParamField>
    <ParamField body="latitude" type="string">Latitude da loja.</ParamField>
    <ParamField body="longitude" type="string">Longitude da loja.</ParamField>
  </Expandable>
</ParamField>

<ParamField body="order" type="object" required>
  Conteúdo do pedido.

  <Expandable title="order">
    <ParamField body="products" type="object[]" required>
      Produtos pedidos.

      <Expandable title="products[n]">
        <ParamField body="productId" type="string" required>Identificador do produto.</ParamField>
        <ParamField body="product" type="string">Nome de exibição do produto.</ParamField>

        <ParamField body="type" type="string" required>
          Tipo do item. Valores aceitos: `COMBO` (produto com grupos de modificadores não vazios), `PRODUCT` (produto simples vendável), `MODIFIER` (opção de modificador puro — usar em `selectedModifiers[]`), `PACKAGING` (item de embalagem). Sem valor padrão — omiti-lo torna o payload inválido.
        </ParamField>

        <ParamField body="quantity" type="integer" required>Quantidade pedida.</ParamField>
        <ParamField body="comment" type="string">Opcional. Comentário do cliente para esta linha de produto.</ParamField>
        <ParamField body="rewardId" type="string">Recompensa ou cupom aplicado a este produto.</ParamField>

        <ParamField body="price" type="object">
          Detalhamento do preço desta linha. Modificadores usam a mesma forma em `modifierGroups[n].selectedModifiers[n].price`.

          <Expandable title="price">
            <ParamField body="unitPrice" type="object">
              Valores por **uma unidade** (antes de multiplicar por `quantity`).

              <Expandable title="unitPrice">
                <ParamField body="currencyCode" type="string" required>Código de moeda ISO 4217 (ex.: `BRL`, `USD`).</ParamField>
                <ParamField body="totalBeforeSale" type="string">Opcional. Preço antes de preços promocionais.</ParamField>
                <ParamField body="subtotalWithoutTaxes" type="string">Subtotal sem impostos. Em JSON pode vir como número ou string.</ParamField>
                <ParamField body="discountPercentage" type="string">Percentual de desconto aplicado.</ParamField>
                <ParamField body="discountsValue" type="string">Valor do desconto.</ParamField>
                <ParamField body="subtotalIncludeDiscounts" type="string">Subtotal após descontos, antes dos impostos.</ParamField>
                <ParamField body="taxesPercentage" type="string">Percentual de imposto agregado da faixa.</ParamField>
                <ParamField body="taxValue" type="string">Valor de imposto da faixa.</ParamField>
                <ParamField body="total" type="string">Total final da faixa.</ParamField>
                <ParamField body="suggestedPrice" type="string">Preço de lista sugerido.</ParamField>

                <ParamField body="taxes" type="object[]">
                  Detalhamento por imposto (ex.: `IVA`, ou ICMS, PIS, COFINS no Brasil). Entradas podem omitir `metadata` quando não aplicável.

                  <Expandable title="taxes[n]">
                    <ParamField body="name" type="string" required>Código ou rótulo do imposto (ex.: `IVA`, `icms`, `pis`, `cofins`).</ParamField>
                    <ParamField body="rate" type="string">Alíquota desta linha (geralmente string decimal como `0.00`).</ParamField>
                    <ParamField body="amount" type="string">Valor do imposto nesta linha.</ParamField>
                    <ParamField body="metadata" type="object">Opcional. Campos fiscais por região (ex.: `cst` no ICMS).</ParamField>
                  </Expandable>
                </ParamField>
              </Expandable>
            </ParamField>

            <ParamField body="totalPrice" type="object">
              Mesmas chaves que `unitPrice`. Representa a **linha inteira** (em geral valores unitários escalados pela `quantity`). Inclua a mesma forma de `taxes[]` quando a API retornar detalhe fiscal por linha.
            </ParamField>
          </Expandable>
        </ParamField>

        <ParamField body="modifierGroups" type="object[]">
          Grupos de modificadores selecionados.

          <Expandable title="modifierGroups[n]">
            <ParamField body="id" type="string">ID do grupo de modificadores.</ParamField>
            <ParamField body="description" type="string">Descrição do grupo de modificadores.</ParamField>

            <ParamField body="selectedModifiers" type="object[]">
              Opções de modificador escolhidas.

              <Expandable title="selectedModifiers[n]">
                <ParamField body="answerId" type="string">ID da resposta/opção.</ParamField>
                <ParamField body="productId" type="string">Produto usado como esta opção de modificador.</ParamField>
                <ParamField body="product" type="string">Nome da opção de modificador.</ParamField>

                <ParamField body="type" type="string" required>
                  Tipo do item. Valores aceitos: `COMBO` (produto com grupos de modificadores não vazios), `PRODUCT` (produto vendável usado como opção de modificador), `MODIFIER` (opção de modificador puro), `PACKAGING` (item de embalagem). Sem valor padrão — omiti-lo torna o payload inválido.
                </ParamField>

                <ParamField body="quantity" type="integer">Quantidade adicionada.</ParamField>
                <ParamField body="removedQuantity" type="integer">Quantidade removida (para remover ingredientes).</ParamField>
                <ParamField body="rewardId" type="string">Recompensa aplicada a este modificador.</ParamField>
                <ParamField body="price" type="object">Preço do modificador. Mesma estrutura que o preço do produto.</ParamField>
                <ParamField body="modifierGroups" type="object[]">Grupos de modificadores aninhados (até 3 níveis).</ParamField>
                <ParamField body="additional_info" type="object">Dados do campo `additionalInfo` do menu. Passe o valor como recebido no payload do webhook de menu.</ParamField>
              </Expandable>
            </ParamField>
          </Expandable>
        </ParamField>

        <ParamField body="additional_info" type="object">Dados do campo `additionalInfo` do menu. Passe o valor como recebido no payload do webhook de menu.</ParamField>
      </Expandable>
    </ParamField>
  </Expandable>
</ParamField>

<ParamField body="shippingMethod" type="object" required>
  Detalhes do envio conforme `selectedShippingMethod`.

  <Expandable title="shippingMethod">
    <ParamField body="delivery" type="object">
      Detalhes de delivery. Presente quando `selectedShippingMethod` é `delivery`.

      <Expandable title="delivery">
        <ParamField body="deliveryDate" type="string">Data/hora estimada de entrega.</ParamField>
        <ParamField body="latitude" type="string">Latitude do endereço de entrega.</ParamField>
        <ParamField body="longitude" type="string">Longitude do endereço de entrega.</ParamField>
        <ParamField body="country" type="string">País.</ParamField>
        <ParamField body="city" type="string">Cidade.</ParamField>
        <ParamField body="mainStreet" type="string">Rua principal.</ParamField>
        <ParamField body="number" type="string">Número da rua.</ParamField>
        <ParamField body="secondaryStreet" type="string">Rua secundária ou transversal.</ParamField>
        <ParamField body="reference" type="string">Referência ou ponto de referência para a entrega.</ParamField>
        <ParamField body="propertyId" type="integer">ID do tipo de imóvel.</ParamField>
        <ParamField body="observationsAddress" type="string">Instruções de entrega.</ParamField>
        <ParamField body="numberContactAddress" type="string">Número de contato no endereço de entrega.</ParamField>
        <ParamField body="zipCode" type="string">CEP ou código postal.</ParamField>
        <ParamField body="nickName" type="string">Apelido do endereço (ex.: "casa", "escritório").</ParamField>
        <ParamField body="externalId" type="string">ID do endereço em sistema externo.</ParamField>
        <ParamField body="id" type="string">ID do endereço no Fire.</ParamField>
        <ParamField body="driverArrivalDateInStore" type="string">Timestamp ISO 8601 de quando o entregador chegou à loja.</ParamField>

        <ParamField body="additional_info" type="object">
          Dados adicionais da entrega.

          <Expandable title="additionalInfo">
            <ParamField body="deliveryConfirmationCode" type="string">Opcional. Código de confirmação para verificar a entrega na porta.</ParamField>
          </Expandable>
        </ParamField>
      </Expandable>
    </ParamField>

    <ParamField body="pickup" type="object">
      Detalhes de pickup. Presente quando `selectedShippingMethod` é `pickup`.

      <Expandable title="pickup">
        <ParamField body="pickupDate" type="string">Data/hora agendada do pickup.</ParamField>
        <ParamField body="prepDate" type="string">Data/hora de início do preparo.</ParamField>
        <ParamField body="prepTimeUnit" type="string">Unidade do tempo de preparo. Exemplo: `minute`.</ParamField>
        <ParamField body="prepTime" type="integer">Valor do tempo de preparo.</ParamField>
        <ParamField body="propertyId" type="integer">ID do tipo de imóvel.</ParamField>
        <ParamField body="carryOutOptions" type="string">Rótulo da opção de retirada.</ParamField>

        <ParamField body="contactMethods" type="object[]">
          Métodos de contato para a notificação de pickup.

          <Expandable title="contactMethods[n]">
            <ParamField body="type" type="string">Tipo de contato: `pager`, `sms`, `whatsapp`.</ParamField>
            <ParamField body="identifier" type="string">Identificador (para pager).</ParamField>
            <ParamField body="countryCode" type="string">Código de país do telefone.</ParamField>
            <ParamField body="phoneNumber" type="string">Número de telefone.</ParamField>
          </Expandable>
        </ParamField>
      </Expandable>
    </ParamField>
  </Expandable>
</ParamField>

<ParamField body="payments" type="object" required>
  Detalhamento dos pagamentos.

  <Expandable title="payments">
    <ParamField body="totals" type="object[]">
      Totais do pedido com detalhamento de impostos e descontos. Cada entrada é um objeto price com `currencyCode`, `subtotalWithoutTaxes`, `discountPercentage`, `discountsValue`, `subtotalIncludeDiscounts`, `taxesPercentage`, `taxValue`, `total` e opcionalmente `rewardId`.
    </ParamField>

    <ParamField body="shippingCost" type="object[]">
      Linhas de frete. Cada entrada usa a **mesma faixa de preço** que `totals[]`—envie o valor já calculado (base, imposto e `total`). O Fire armazena como enviado. Consulte [Frete e descontos](#frete-e-descontos).

      <Expandable title="shippingCost[n]">
        <ParamField body="currencyCode" type="string">Código de moeda ISO 4217.</ParamField>
        <ParamField body="subtotalWithoutTaxes" type="string">Valor antes dos impostos.</ParamField>
        <ParamField body="discountPercentage" type="string">Percentual de desconto aplicado a esta linha.</ParamField>
        <ParamField body="discountsValue" type="string">Valor do desconto.</ParamField>
        <ParamField body="subtotalIncludeDiscounts" type="string">Subtotal após descontos, antes dos impostos.</ParamField>
        <ParamField body="taxesPercentage" type="string">Percentual de imposto aplicado.</ParamField>
        <ParamField body="taxValue" type="string">Valor do imposto.</ParamField>
        <ParamField body="total" type="string">Total da linha com impostos.</ParamField>
      </Expandable>
    </ParamField>

    <ParamField body="extraCharges" type="object[]">
      Cobranças adicionais como gorjetas ou custos de embalagem.

      <Expandable title="extraCharges[n]">
        <ParamField body="type" type="string" required>
          Tipo do item. Valores aceitos: `COMBO` (produto com grupos de modificadores não vazios), `PRODUCT` (produto simples vendável), `MODIFIER` (opção de modificador puro), `PACKAGING` (item de embalagem). Normalmente `PACKAGING` para itens neste array. Sem valor padrão — omiti-lo torna o payload inválido.
        </ParamField>

        <ParamField body="quantity" type="integer">Quantidade.</ParamField>
        <ParamField body="productId" type="string">ID do produto associado, se houver.</ParamField>
        <ParamField body="description" type="string">Descrição da cobrança (ex.: `tip`, `packing cost`).</ParamField>
        <ParamField body="currencyCode" type="string">Código da moeda.</ParamField>
        <ParamField body="subtotalWithoutTaxes" type="string">Valor antes dos impostos.</ParamField>
        <ParamField body="taxValue" type="string">Valor do imposto.</ParamField>
        <ParamField body="total" type="string">Total com impostos incluídos.</ParamField>
      </Expandable>
    </ParamField>

    <ParamField body="discounts" type="object[]">
      Linhas de desconto de promoções ou cupons que o **estabelecimento absorve** (o custo fica por conta do restaurante). Cada entrada usa os **mesmos campos de faixa de preço** que `totals[]` e `shippingCost[]`. **Deixe este array vazio para descontos do agregador** — esses são modelados como uma entrada em `paymentMethods[]`. Consulte [Descontos do agregador](#descontos-do-agregador).

      <Expandable title="discounts[n]">
        <ParamField body="currencyCode" type="string">Código de moeda ISO 4217.</ParamField>
        <ParamField body="subtotalWithoutTaxes" type="string">Base tributável antes do desconto.</ParamField>
        <ParamField body="discountPercentage" type="string">Percentual de desconto nesta linha.</ParamField>
        <ParamField body="discountsValue" type="string">Valor abatido pelo desconto.</ParamField>
        <ParamField body="subtotalIncludeDiscounts" type="string">Subtotal após o desconto, antes dos impostos.</ParamField>
        <ParamField body="taxesPercentage" type="string">Percentual de imposto aplicado após o desconto.</ParamField>
        <ParamField body="taxValue" type="string">Valor do imposto.</ParamField>
        <ParamField body="total" type="string">Total da linha com impostos.</ParamField>
      </Expandable>
    </ParamField>

    <ParamField body="taxes" type="object[]">
      Resumo de impostos.

      <Expandable title="taxes[n]">
        <ParamField body="name" type="string">Nome do imposto (ex.: `IVA 15%`).</ParamField>
        <ParamField body="currencyCode" type="string">Código da moeda.</ParamField>
        <ParamField body="subtotalWithoutTaxes" type="string">Base tributável.</ParamField>
        <ParamField body="percentage" type="string">Percentual do imposto.</ParamField>
        <ParamField body="total" type="string">Valor total do imposto.</ParamField>
      </Expandable>
    </ParamField>

    <ParamField body="paymentMethods" type="object[]">
      Métodos de pagamento utilizados.

      <Expandable title="paymentMethods[n]">
        <ParamField body="processor" type="string">Nome do processador de pagamento (ex.: `Kushki`, `Efectivo`).</ParamField>
        <ParamField body="currencyCode" type="string">Código da moeda.</ParamField>
        <ParamField body="paymentMethodCode" type="string">Código do método de pagamento. Use `AGGREGATOR_DISCOUNT` quando o agregador cobre um desconto promocional e reembolsa o estabelecimento — sempre combinado com `transactionType: "BENEFIT"`. Consulte [Descontos do agregador](#descontos-do-agregador).</ParamField>
        <ParamField body="transactionType" type="string">Tipo de transação. Valores comuns: `ONLINE`, `CREDIT`, `CASH`. Use `BENEFIT` quando `paymentMethodCode` for `AGGREGATOR_DISCOUNT`.</ParamField>
        <ParamField body="transactionId" type="string">Identificador da transação.</ParamField>
        <ParamField body="transactionStatus" type="string">Status da transação (ex.: `APPROVED`).</ParamField>
        <ParamField body="exactPayment" type="boolean">Indica se o valor exato foi entregue.</ParamField>
        <ParamField body="totalBill" type="string">Valor cobrado com este método.</ParamField>
        <ParamField body="id_auth" type="string | null">Número de autorização NFCE (código SiTef 952 / IdAuth). Opcional.</ParamField>
        <ParamField body="receipt_customer" type="string | null">Via do cliente: texto do comprovante impresso para o portador (código SiTef 121 / ReceiptCustomer). Opcional.</ParamField>
        <ParamField body="receipt_merchant" type="string | null">Via do estabelecimento: texto do comprovante impresso para o lojista (código SiTef 122 / ReceiptMerchant). Opcional.</ParamField>

        <ParamField body="acquirer" type="object | null">
          Dados do banco adquirente. Envie `null` para métodos de pagamento sem credenciadora.

          <Expandable title="acquirer">
            <ParamField body="code" type="string">Código da credenciadora.</ParamField>
            <ParamField body="name" type="string">Nome da credenciadora.</ParamField>
            <ParamField body="cnpj" type="string">CNPJ da credenciadora para NFCE (código SiTef 950 / CNPJAuth). Opcional.</ParamField>
          </Expandable>
        </ParamField>

        <ParamField body="card" type="object | null">
          Dados do cartão. Envie `null` para métodos sem cartão (ex.: `AGGREGATOR_DISCOUNT`).

          <Expandable title="card">
            <ParamField body="brand" type="string">Bandeira do cartão (ex.: `VISA`, `MASTERCARD`, `AMEX`).</ParamField>
            <ParamField body="bin" type="string">Primeiros 6 dígitos do número do cartão (BIN).</ParamField>
            <ParamField body="mask" type="string">Número do cartão mascarado.</ParamField>
            <ParamField body="lastFourDigits" type="string">Últimos 4 dígitos do número do cartão.</ParamField>
            <ParamField body="holder" type="string">Nome do titular.</ParamField>
            <ParamField body="cardCountry" type="string">País de emissão do cartão.</ParamField>
            <ParamField body="externalCardBrandId" type="string">Identificador de bandeira específico do processador.</ParamField>
            <ParamField body="media" type="string">Tipo de leitura do cartão (código SiTef 2090 / Media). Valores aceitos: `CHIP`, `MAGNETIC`, `NFC`, `MANUAL`. Opcional.</ParamField>
          </Expandable>
        </ParamField>

        <ParamField body="transactionDate" type="object">Data da transação com info de fuso horário.</ParamField>
        <ParamField body="metadata" type="object">Metadados específicos do processador.</ParamField>
      </Expandable>
    </ParamField>
  </Expandable>
</ParamField>

<ParamField body="marketing" type="object">
  Informações de fidelidade e cupons.

  <Expandable title="marketing">
    <ParamField body="loyalty" type="object">
      Detalhamento de acumulação e resgate de pontos de fidelidade.

      <Expandable title="loyalty">
        <ParamField body="accumulation" type="object">Pontos ganhos: `storeCost`, `marketingCost`, `totalPoints`.</ParamField>
        <ParamField body="redemption" type="object">Pontos resgatados: `storeCost`, `marketingCost`, `totalPoints`.</ParamField>
        <ParamField body="accountBalancePoints" type="string">Saldo de pontos atual do cliente.</ParamField>
      </Expandable>
    </ParamField>

    <ParamField body="coupons" type="object[]">
      Cupons e recompensas aplicados.

      <Expandable title="coupons[n]">
        <ParamField body="rewardId" type="string">Identificador da recompensa.</ParamField>
        <ParamField body="name" type="string">Nome de exibição da recompensa.</ParamField>
        <ParamField body="additional_info" type="object">Dados adicionais da recompensa.</ParamField>
      </Expandable>
    </ParamField>
  </Expandable>
</ParamField>

<ParamField body="additional_info" type="object">
  Metadados extras a nível de pedido (ex.: endereço IP do quiosque).
</ParamField>

## Valores e faixas de preço

<Warning>
  O Fire **não** escala nem recalcula preços. Envie valores na **unidade final da moeda** (por exemplo `"8.99"` para USD 8,99, não centavos). Seu POS ou agregador deve enviar montantes já calculados.
</Warning>

Linhas de produto, `payments.totals[]`, `payments.shippingCost[]` e `payments.discounts[]` usam as mesmas chaves de **faixa de preço**: `currencyCode`, `subtotalWithoutTaxes`, `discountPercentage`, `discountsValue`, `subtotalIncludeDiscounts`, `taxesPercentage`, `taxValue`, `total`.

| Campo da faixa             | Significado usual                          |
| -------------------------- | ------------------------------------------ |
| `subtotalWithoutTaxes`     | Base tributável antes do desconto da linha |
| `discountsValue`           | Valor do desconto nesta linha              |
| `subtotalIncludeDiscounts` | Base após desconto, antes dos impostos     |
| `taxValue`                 | Imposto sobre a base com desconto          |
| `total`                    | Total da linha como enviado                |

## Frete e descontos

### Descontos por linha de produto

Aplique descontos em `order.products[n].price.unitPrice` e `totalPrice` (mesmos números quando `quantity` é 1). Exemplo: **10% de desconto** em base **15.00** com **IVA 12%** → `discountsValue` **1.50**, `subtotalIncludeDiscounts` **13.50**, `taxValue` **1.62**, `total` da linha **15.12**.

### `payments.shippingCost[]`

Taxas de entrega como uma ou mais linhas na faixa de preço. Nos exemplos, o imposto do frete segue a mesma lógica dos produtos.

### `payments.discounts[]`

Descontos em nível de pedido (promos, cupons) como linhas na faixa de preço. Use quando o desconto **não** estiver totalmente refletido no `discountsValue` de cada produto e o custo é **absorvido pelo estabelecimento**. Descontos de produto e `payments.discounts[]` podem ser combinados; concilie com `paymentMethods[].totalBill`.

### `payments.totals[]`

Resumo da parte de **produtos** do pedido. Ao conciliar: **produtos (totals) + frete − descontos do pedido ≈ valor pago**.

<Note>
  O Fire não rejeita a requisição se `paymentMethods[].totalBill` divergir levemente da soma das faixas — mesmo assim envie valores consistentes do seu sistema de origem.
</Note>

## Descontos de combo

Quando um produto combo tem **preço do contêiner igual a 0** (ou seja, `type: "COMBO"` com `subtotalWithoutTaxes: 0`), o desconto do combo **não deve ser colocado** na linha do contêiner. Atribuir `discountsValue` a uma base zero produz totais negativos, que o Fire rejeita.

Em vez disso, **distribua o valor total do desconto entre os `selectedModifiers`** que compõem o combo.

### Regras

| Regra                           | Detalhe                                                                                                                                 |
| ------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------- |
| Contêiner COMBO (`price === 0`) | Todos os campos de preço devem ser `0` — sem `discountsValue`, sem valores negativos                                                    |
| Localização do desconto         | Distribuir `discountsValue` entre os modificadores proporcionalmente ao preço base de cada um                                           |
| Restrição não negativa          | Após aplicar o desconto, cada modificador deve ter `subtotalIncludeDiscounts >= 0` e `total >= 0`                                       |
| Reconciliação de totais         | `SUM(modifier.totalPrice.discountsValue)` deve ser igual ao desconto total do combo, e as somas devem coincidir com `payments.totals[]` |

### Algoritmo de distribuição

```
D = desconto total do combo
B = SUM(modifier.price.totalPrice.subtotalWithoutTaxes)

discount_i = ROUND(D × (base_i / B), 2)
net_i      = base_i − discount_i        // deve ser >= 0
```

Ajustar o arredondamento no último modificador para que `SUM(discount_i) === D` exatamente. Se a distribuição proporcional deixasse algum modificador com `net_i < 0`, limitar o desconto desse item à sua base (`discount_i = base_i`, líquido = 0) e redistribuir o restante entre os demais.

### Exemplo — desconto BRL 17,94 em um combo (base BRL 89,68)

<Warning>
  A seguir é mostrado o padrão **incorreto** (desconto no contêiner) e o padrão **correto** (desconto distribuído entre os modificadores).
</Warning>

```json Incorreto — desconto no COMBO com base zero (totais negativos) theme={null}
{
  "type": "COMBO",
  "price": {
    "unitPrice": {
      "subtotalWithoutTaxes": "0",
      "discountsValue": "17.94",
      "subtotalIncludeDiscounts": "-17.94",
      "total": "-17.94"
    }
  }
}
```

```json Correto — contêiner COMBO em zero, desconto nos modificadores theme={null}
{
  "type": "COMBO",
  "price": {
    "unitPrice":  { "subtotalWithoutTaxes": "0", "discountsValue": "0", "subtotalIncludeDiscounts": "0", "total": "0" },
    "totalPrice": { "subtotalWithoutTaxes": "0", "discountsValue": "0", "subtotalIncludeDiscounts": "0", "total": "0" }
  },
  "modifierGroups": [
    {
      "selectedModifiers": [
        {
          "product": "12 Coxinhas da Asa",
          "type": "MODIFIER",
          "price": {
            "unitPrice":  { "subtotalWithoutTaxes": "22.30", "discountsValue": "4.46", "subtotalIncludeDiscounts": "17.84", "total": "17.84" },
            "totalPrice": { "subtotalWithoutTaxes": "22.30", "discountsValue": "4.46", "subtotalIncludeDiscounts": "17.84", "total": "17.84" }
          }
        },
        {
          "product": "Batata Média",
          "type": "MODIFIER",
          "price": {
            "unitPrice":  { "subtotalWithoutTaxes": "4.59", "discountsValue": "0.92", "subtotalIncludeDiscounts": "3.67", "total": "3.67" },
            "totalPrice": { "subtotalWithoutTaxes": "4.59", "discountsValue": "0.92", "subtotalIncludeDiscounts": "3.67", "total": "3.67" }
          }
        }
      ]
    }
  ]
}
```

Distribuição completa para este exemplo (todos os 7 modificadores):

| Modificador         |      Base | `discountsValue` |   Líquido |
| ------------------- | --------: | ---------------: | --------: |
| 12 Coxinhas da Asa  |     22,30 |             4,46 |     17,84 |
| Batata Média        |      4,59 |             0,92 |      3,67 |
| Onion Rings         |      7,50 |             1,50 |      6,00 |
| Batata Grande       |      6,50 |             1,30 |      5,20 |
| Molho Secreto 120g  |      4,09 |             0,82 |      3,27 |
| Água sem Gás (×2)   |     29,80 |             5,96 |     23,84 |
| Água com gás        |     14,90 |             2,98 |     11,92 |
| **Contêiner COMBO** |     **0** |            **0** |     **0** |
| **Total**           | **89,68** |        **17,94** | **71,74** |

`payments.totals[0].subtotalWithoutTaxes` = **89,68**, `subtotalIncludeDiscounts` = **71,74** ✓

## Descontos do agregador

Quando a plataforma do agregador (iFood, Rappi, UberEats, etc.) aplica um desconto promocional ao cliente, o **agregador reembolsa o estabelecimento** — o local sempre recebe o valor integral. Por isso o desconto não reduz a receita do estabelecimento e **não deve aparecer em `payments.discounts[]`**.

Modele como uma entrada adicional em `payments.paymentMethods[]`:

| Quem paga                  | O quê                                                       | Como modelar                                                                |
| -------------------------- | ----------------------------------------------------------- | --------------------------------------------------------------------------- |
| Cliente                    | Produtos + frete + cobranças extras − desconto do agregador | `paymentMethods[n]` com o código de pagamento real (`CREDIT`, `CASH`, etc.) |
| Agregador                  | Valor do desconto (reembolso ao estabelecimento)            | `paymentMethods[n]` com `paymentMethodCode: "AGGREGATOR_DISCOUNT"`          |
| **Estabelecimento recebe** | **Produtos + frete + cobranças extras completos**           | —                                                                           |

### Campos obrigatórios na entrada `AGGREGATOR_DISCOUNT`

| Campo               | Valor                                                            |
| ------------------- | ---------------------------------------------------------------- |
| `paymentMethodCode` | `"AGGREGATOR_DISCOUNT"` — mesmo código para todos os agregadores |
| `processor`         | Nome do agregador: `"IFOOD"`, `"RAPPI"`, `"UBEREATS"`, …         |
| `transactionType`   | `"BENEFIT"`                                                      |
| `transactionStatus` | `"APPROVED"`                                                     |
| `card`              | `null`                                                           |
| `totalBill`         | Valor do desconto                                                |

### Regra de saldo

A soma de **todos** os `paymentMethods[].totalBill` — incluindo a entrada `AGGREGATOR_DISCOUNT` — deve ser igual ao total bruto do pedido:

```
SUM(paymentMethods[].totalBill)
  = SUM(order.products[].price.totalPrice.total)
  + SUM(payments.extraCharges[].total)
  + SUM(payments.shippingCost[].total)
```

`payments.discounts[]` fica **vazio**.

<RequestExample>
  ```json Entrega simples (sem descontos) theme={null}
  {
    "orderId": "AGG-SIMPLE-001",
    "source": "App",
    "platform": "Android",
    "channel": { "uid": "CH-IFOOD-001", "code": "Aggregator", "metadata": {} },
    "service": { "uid": "3", "code": "DELIVERY", "metadata": {} },
    "selectedShippingMethod": "delivery",
    "client": { "name": "Jane", "lastName": "Doe", "phone": "+1555000111" },
    "store": { "id": 10, "name": "Gran Santa Fe", "code": "T001", "vendorId": 8 },
    "order": {
      "products": [
        {
          "productId": "991117",
          "product": "Classic Burger",
          "type": "PRODUCT",
          "quantity": 1,
          "price": {
            "unitPrice": {
              "currencyCode": "USD",
              "subtotalWithoutTaxes": "7.7826",
              "discountPercentage": "0.0000",
              "discountsValue": "0.0000",
              "subtotalIncludeDiscounts": "7.7826",
              "taxesPercentage": "15.0000",
              "taxValue": "1.1739",
              "total": "8.9900"
            },
            "totalPrice": {
              "currencyCode": "USD",
              "subtotalWithoutTaxes": "7.7826",
              "discountPercentage": "0.0000",
              "discountsValue": "0.0000",
              "subtotalIncludeDiscounts": "7.7826",
              "taxesPercentage": "15.0000",
              "taxValue": "1.1739",
              "total": "8.9900"
            }
          },
          "additional_info": { "externalCode": "burger-classic-ext-001" }
        }
      ]
    },
    "shippingMethod": {
      "delivery": {
        "city": "Guayaquil",
        "mainStreet": "Av. Principal 123",
        "zipCode": "090101",
        "additional_info": {
          "deliveryConfirmationCode": "4821"
        }
      }
    },
    "payments": {
      "totals": [
        {
          "currencyCode": "USD",
          "subtotalWithoutTaxes": "7.7826",
          "discountPercentage": "0.0000",
          "discountsValue": "0.0000",
          "subtotalIncludeDiscounts": "7.7826",
          "taxesPercentage": "15.0000",
          "taxValue": "1.1739",
          "total": "8.9900"
        }
      ],
      "shippingCost": [
        {
          "currencyCode": "USD",
          "subtotalWithoutTaxes": "1.5000",
          "discountPercentage": "0.0000",
          "discountsValue": "0.0000",
          "subtotalIncludeDiscounts": "1.5000",
          "taxesPercentage": "15.0000",
          "taxValue": "0.2250",
          "total": "1.7250"
        }
      ],
      "discounts": [],
      "paymentMethods": [
        {
          "processor": "Kushki",
          "currencyCode": "USD",
          "transactionStatus": "APPROVED",
          "totalBill": "10.7150"
        }
      ]
    }
  }
  ```

  ```json Desconto na linha e frete theme={null}
  {
    "orderId": "AGG-DISC-LINE-001",
    "source": "Kiosco",
    "platform": "Android",
    "channel": { "uid": "CH-KIOSK-001", "code": "Kiosk", "metadata": {} },
    "service": { "uid": "3", "code": "DELIVERY", "metadata": {} },
    "selectedShippingMethod": "delivery",
    "client": { "name": "Maria", "phone": "+5511999999999" },
    "store": { "id": 20, "name": "Centro", "code": "T020", "vendorId": 16 },
    "order": {
      "products": [
        {
          "productId": "SKU-COMBO-001",
          "product": "Combo Especial",
          "type": "COMBO",
          "quantity": 1,
          "comment": "Sin cebolla",
          "price": {
            "unitPrice": {
              "currencyCode": "BRL",
              "subtotalWithoutTaxes": "15.00",
              "discountPercentage": "10.0000",
              "discountsValue": "1.50",
              "subtotalIncludeDiscounts": "13.50",
              "taxesPercentage": "12.0000",
              "taxValue": "1.62",
              "total": "15.12"
            },
            "totalPrice": {
              "currencyCode": "BRL",
              "subtotalWithoutTaxes": "15.00",
              "discountPercentage": "10.0000",
              "discountsValue": "1.50",
              "subtotalIncludeDiscounts": "13.50",
              "taxesPercentage": "12.0000",
              "taxValue": "1.62",
              "total": "15.12"
            }
          },
          "modifierGroups": [
            {
              "id": "MG-SAUCE-001",
              "description": "Molho",
              "selectedModifiers": [
                {
                  "answerId": "ANS-BBQ-001",
                  "productId": "MOD-BBQ-001",
                  "product": "Molho BBQ",
                  "type": "MODIFIER",
                  "quantity": 1,
                  "additional_info": { "externalCode": "sauce-bbq-ext-001" }
                }
              ]
            }
          ],
          "additional_info": { "externalCode": "combo-especial-ext-001" }
        }
      ]
    },
    "shippingMethod": {
      "delivery": {
        "city": "São Paulo",
        "mainStreet": "Rua Exemplo 100",
        "zipCode": "01310-100"
      }
    },
    "payments": {
      "totals": [
        {
          "currencyCode": "BRL",
          "subtotalWithoutTaxes": "15.00",
          "discountPercentage": "10.0000",
          "discountsValue": "1.50",
          "subtotalIncludeDiscounts": "13.50",
          "taxesPercentage": "12.0000",
          "taxValue": "1.62",
          "total": "15.12"
        }
      ],
      "shippingCost": [
        {
          "currencyCode": "BRL",
          "subtotalWithoutTaxes": "3.50",
          "discountPercentage": "0.0000",
          "discountsValue": "0.0000",
          "subtotalIncludeDiscounts": "3.50",
          "taxesPercentage": "12.0000",
          "taxValue": "0.42",
          "total": "3.92"
        }
      ],
      "discounts": [],
      "paymentMethods": [
        {
          "processor": "CREDIT_CARD",
          "currencyCode": "BRL",
          "transactionStatus": "APPROVED",
          "totalBill": "19.04"
        }
      ]
    }
  }
  ```

  ```json Vários produtos, frete e desconto do pedido theme={null}
  {
    "orderId": "AGG-PROMO-001",
    "source": "Aggregator",
    "channel": { "uid": "CH-AGG-001", "code": "Aggregator", "metadata": {} },
    "service": { "uid": "3", "code": "DELIVERY", "metadata": {} },
    "selectedShippingMethod": "delivery",
    "client": { "name": "João", "lastName": "Silva", "phone": "+5511987654321" },
    "store": { "id": 30, "name": "Lab Brasil", "code": "K000", "vendorId": 8 },
    "order": {
      "products": [
        {
          "productId": "BURG-001",
          "product": "Hamburguesa Clásica",
          "type": "PRODUCT",
          "quantity": 2,
          "price": {
            "unitPrice": {
              "currencyCode": "BRL",
              "subtotalWithoutTaxes": "11.52",
              "discountPercentage": "0.0000",
              "discountsValue": "0.0000",
              "subtotalIncludeDiscounts": "11.52",
              "taxesPercentage": "12.0000",
              "taxValue": "1.38",
              "total": "12.90"
            },
            "totalPrice": {
              "currencyCode": "BRL",
              "subtotalWithoutTaxes": "23.04",
              "discountPercentage": "0.0000",
              "discountsValue": "0.0000",
              "subtotalIncludeDiscounts": "23.04",
              "taxesPercentage": "12.0000",
              "taxValue": "2.76",
              "total": "25.80"
            }
          },
          "additional_info": { "externalCode": "hamburguesa-clasica-ext-001" }
        },
        {
          "productId": "BEV-001",
          "product": "Refresco 500ml",
          "type": "PRODUCT",
          "quantity": 1,
          "price": {
            "unitPrice": {
              "currencyCode": "BRL",
              "subtotalWithoutTaxes": "4.46",
              "discountPercentage": "0.0000",
              "discountsValue": "0.0000",
              "subtotalIncludeDiscounts": "4.46",
              "taxesPercentage": "12.0000",
              "taxValue": "0.54",
              "total": "5.00"
            },
            "totalPrice": {
              "currencyCode": "BRL",
              "subtotalWithoutTaxes": "4.46",
              "discountPercentage": "0.0000",
              "discountsValue": "0.0000",
              "subtotalIncludeDiscounts": "4.46",
              "taxesPercentage": "12.0000",
              "taxValue": "0.54",
              "total": "5.00"
            }
          },
          "additional_info": { "externalCode": "refresco-500ml-ext-001" }
        }
      ]
    },
    "shippingMethod": {
      "delivery": { "city": "São Paulo", "mainStreet": "Av. Paulista 1000" }
    },
    "payments": {
      "totals": [
        {
          "currencyCode": "BRL",
          "subtotalWithoutTaxes": "27.50",
          "discountPercentage": "0.0000",
          "discountsValue": "0.0000",
          "subtotalIncludeDiscounts": "27.50",
          "taxesPercentage": "12.0000",
          "taxValue": "3.30",
          "total": "30.80"
        }
      ],
      "shippingCost": [
        {
          "currencyCode": "BRL",
          "subtotalWithoutTaxes": "3.50",
          "discountPercentage": "0.0000",
          "discountsValue": "0.0000",
          "subtotalIncludeDiscounts": "3.50",
          "taxesPercentage": "0.0000",
          "taxValue": "0.0000",
          "total": "3.50"
        }
      ],
      "discounts": [
        {
          "currencyCode": "BRL",
          "subtotalWithoutTaxes": "34.30",
          "discountPercentage": "0.0000",
          "discountsValue": "2.00",
          "subtotalIncludeDiscounts": "32.30",
          "taxesPercentage": "0.0000",
          "taxValue": "0.0000",
          "total": "2.00"
        }
      ],
      "paymentMethods": [
        {
          "processor": "99",
          "currencyCode": "BRL",
          "transactionStatus": "APPROVED",
          "totalBill": "32.30"
        }
      ]
    }
  }
  ```

  ```json Desconto do agregador (iFood reembolsa BRL 1.00) theme={null}
  {
    "orderId": "AGG-DISC-IFOOD-001",
    "source": "Aggregator",
    "channel": { "uid": "CH-IFOOD-001", "code": "Aggregator", "metadata": {} },
    "service": { "uid": "3", "code": "DELIVERY", "metadata": {} },
    "selectedShippingMethod": "delivery",
    "client": { "name": "João", "lastName": "Silva", "phone": "+5511987654321" },
    "store": { "id": 30, "name": "Lab Brasil", "code": "K000", "vendorId": 8 },
    "order": {
      "products": [
        {
          "productId": "PROD-TESTE-001",
          "product": "PEDIDO DE TESTE Suc",
          "type": "PRODUCT",
          "quantity": 2,
          "price": {
            "unitPrice": {
              "currencyCode": "BRL",
              "subtotalWithoutTaxes": "14.90",
              "discountPercentage": "0.0000",
              "discountsValue": "0.0000",
              "subtotalIncludeDiscounts": "14.90",
              "taxesPercentage": "0.0000",
              "taxValue": "0.0000",
              "total": "14.90"
            },
            "totalPrice": {
              "currencyCode": "BRL",
              "subtotalWithoutTaxes": "29.80",
              "discountPercentage": "0.0000",
              "discountsValue": "0.0000",
              "subtotalIncludeDiscounts": "29.80",
              "taxesPercentage": "0.0000",
              "taxValue": "0.0000",
              "total": "29.80"
            }
          },
          "additional_info": { "externalCode": "pedido-teste-ext-001" }
        }
      ]
    },
    "shippingMethod": {
      "delivery": { "city": "São Paulo", "mainStreet": "Av. Paulista 1000", "zipCode": "01310-100" }
    },
    "payments": {
      "totals": [
        {
          "currencyCode": "BRL",
          "subtotalWithoutTaxes": "29.80",
          "discountPercentage": "0.0000",
          "discountsValue": "0.0000",
          "subtotalIncludeDiscounts": "29.80",
          "taxesPercentage": "0.0000",
          "taxValue": "0.0000",
          "total": "29.80"
        }
      ],
      "shippingCost": [
        {
          "currencyCode": "BRL",
          "subtotalWithoutTaxes": "8.90",
          "discountPercentage": "0.0000",
          "discountsValue": "0.0000",
          "subtotalIncludeDiscounts": "8.90",
          "taxesPercentage": "0.0000",
          "taxValue": "0.0000",
          "total": "8.90"
        }
      ],
      "extraCharges": [
        {
          "type": "PACKAGING",
          "quantity": 1,
          "description": "Taxa de serviço",
          "currencyCode": "BRL",
          "subtotalWithoutTaxes": "0.99",
          "taxValue": "0.0000",
          "total": "0.99"
        }
      ],
      "discounts": [],
      "paymentMethods": [
        {
          "processor": "IFOOD",
          "currencyCode": "BRL",
          "paymentMethodCode": "CREDIT",
          "transactionType": "ONLINE",
          "transactionStatus": "APPROVED",
          "exactPayment": true,
          "totalBill": "38.69",
          "id_auth": "123456",
          "receipt_customer": "COMPROVANTE CLIENTE\nAMEX ****1234\nAPROVADO",
          "receipt_merchant": "COMPROVANTE ESTABELECIMENTO\nAMEX ****1234\nAPROVADO",
          "card": {
            "brand": "AMEX",
            "bin": "378282",
            "mask": "3782 82****1234",
            "lastFourDigits": "1234",
            "holder": "JOAO SILVA",
            "cardCountry": "BR",
            "externalCardBrandId": "",
            "media": "CHIP"
          },
          "acquirer": {
            "code": "01",
            "name": "CIELO",
            "cnpj": "01.027.058/0001-91"
          }
        },
        {
          "processor": "IFOOD",
          "currencyCode": "BRL",
          "paymentMethodCode": "AGGREGATOR_DISCOUNT",
          "transactionType": "BENEFIT",
          "transactionId": "0ec06303-28f8-4d1f-aa3d-8b88aadb9814",
          "transactionStatus": "APPROVED",
          "exactPayment": true,
          "totalBill": "1.00",
          "card": null,
          "acquirer": { "code": "", "name": "" }
        }
      ]
    }
  }
  ```
</RequestExample>

## Conciliação dos exemplos

| Exemplo                   | Produtos (`totals[].total`) | Frete (`shippingCost[].total`) | Desconto do pedido (`discounts[].discountsValue`) |                                   Pago (`totalBill`) |
| ------------------------- | --------------------------: | -----------------------------: | ------------------------------------------------: | ---------------------------------------------------: |
| Entrega simples           |                        8.99 |                           1.73 |                                                 — |                                            **10.72** |
| Desconto na linha + frete |                       15.12 |                           3.92 |                                                 — |                                            **19.04** |
| Vários produtos + promo   |                       30.80 |                           3.50 |                                              2.00 |                                            **32.30** |
| Desconto do agregador     |                       29.80 |                           8.90 |                                                 — | **39.69** (CREDIT 38.69 + AGGREGATOR\_DISCOUNT 1.00) |

Notas de cálculo:

* **Entrega simples:** 8.99 + 1.73 = **10.72**.
* **Desconto na linha:** 10% sobre 15.00 → IVA sobre 13.50 → produto **15.12**; frete 3.50 + IVA 12% = **3.92**; **15.12 + 3.92 = 19.04**.
* **Vários produtos + promo:** hambúrgueres **25.80** + bebida **5.00** = **30.80**; + frete **3.50** = 34.30; − promo **2.00** = **32.30** pago.
* **Desconto do agregador:** produtos **29.80** + embalagem **0.99** + frete **8.90** = **39.69** bruto; cliente paga **38.69** (CREDIT) + agregador reembolsa **1.00** (AGGREGATOR\_DISCOUNT) = **39.69** ✓. `payments.discounts` fica vazio.

<ResponseExample>
  ```json 200 theme={null}
  {
    "data": {
      "uid": "92eb4720-dbee-4786-ad76-b0b01aa47f36",
      "order_code": "99-2c6970fd-a164-48bd-9f45-d5098a679a8f",
      "account_uid": "100",
      "vendor_uid": "100.6.1350",
      "store_uid": "100.6.1350.1",
      "catalog_uid": "200a6bf1-55dd-4c9b-af2b-07a62cb0d6f2",
      "channel": {
        "uid": "200a6bf1-55dd-4c9b-af2b-07a62cb0d6f2",
        "code": "KEETA",
        "metadata": {
          "partner": "99"
        }
      },
      "service": {
        "uid": "91c2c168-5a4b-4944-977e-75a1ea7a77e7",
        "code": "DELIVERY",
        "metadata": {}
      },
      "device": {
        "uid": "99-aggregator-device",
        "name": "99 Aggregator",
        "metadata": {
          "ip": "0.0.0.0"
        }
      },
      "operator": {
        "uid": "99-operator",
        "name": "99",
        "session": {
          "uid": "sess-99-aggregator"
        }
      },
      "store": {
        "uid": "100.6.1350.1",
        "code": "K000",
        "name": "Laboratorio Brasil",
        "latitude": "-23.5632",
        "longitude": "-46.6543",
        "vendor_uid": "100.6.1350",
        "vendor_name": "Sandbox Brasil"
      },
      "anonymous_customer_uid": "99-client-e24b0c40-43ff-4d0e-b384-b1f3e1173193",
      "customer_uid": null,
      "customer": {
        "uid": "99-client-e24b0c40-43ff-4d0e-b384-b1f3e1173193",
        "name": "João",
        "email": "joao.silva@email.com",
        "phone": "11987654321",
        "last_name": "Silva",
        "gov_id_type": "CPF",
        "gov_id_number": "123.456.789-09"
      },
      "billing_uid": null,
      "billing": null,
      "fulfillment": {
        "method": "DELIVERY",
        "details": {
          "uid": "99-client-e24b0c40-43ff-4d0e-b384-b1f3e1173193",
          "city": "São Paulo",
          "country": "Brasil",
          "latitude": "-23.5632",
          "zip_code": "01310-100",
          "longitude": "-46.6543",
          "reference": "Apto 42",
          "main_street": "Av. Paulista 1000",
          "delivery_date": "2026-05-11T14:38:16.360Z"
        },
        "catalog_uid": "200a6bf1-55dd-4c9b-af2b-07a62cb0d6f2"
      },
      "status": "COMPLETED",
      "payment_status": "SUCCEEDED",
      "payment_methods": [
        {
          "uid": "6781726c-4dbb-4cb9-a8e6-a76a7283b102",
          "total": "347800",
          "method": "99",
          "details": {
            "mid": null,
            "tid": null,
            "card": {
              "bin": "",
              "mask": "",
              "brand": "",
              "holder": "",
              "card_country": "",
              "last_four_digits": "",
              "external_card_brand_id": "CASH"
            },
            "voucher": null,
            "acquirer": {
              "code": "",
              "name": ""
            },
            "metadata": {},
            "processor": "99",
            "total_bill": "347800",
            "currency_code": "BRL",
            "exact_payment": false,
            "transaction_id": "99-txn-5d7faa7d-f1aa-4af2-9f57-614cf5346eb4",
            "reference_number": null,
            "transaction_date": {
              "date": "2026-05-11T14:38:17.482Z",
              "time_zone_name": "UTC",
              "time_zone_type": "0"
            },
            "transaction_type": "cash",
            "authorization_code": "",
            "transaction_status": "APPROVED",
            "customer_cash_amount": "0"
          },
          "metadata": {},
          "currency_code": "BRL"
        }
      ],
      "metadata": {
        "pos": {
          "discount": false,
          "order_id": "99-2c6970fd-a164-48bd-9f45-d5098a679a8f",
          "account_id": "100",
          "created_at": "2026-05-11T14:38:16.360Z",
          "order_comment": ""
        },
        "additional_info": {}
      },
      "created_at": "2026-05-11 14:38:18.767989",
      "updated_at": "2026-05-11 14:38:18.767989",
      "deleted_at": null,
      "order_lines": [
        {
          "uid": "2fe6b60a-50e0-40f3-8040-91a26f1888b5",
          "hash": "001224591808cb3551c9d0c248b739ef07dd8dd3f958d3eb1251ca5f022bad48",
          "price": {
            "unit_price": [
              {
                "taxes": [
                  {
                    "name": "IVA",
                    "percentage": "0"
                  }
                ],
                "metadata": {},
                "discounts": [],
                "net_price": "17.39",
                "gross_price": "17.39",
                "taxes_value": "0",
                "currency_code": "BRL",
                "discount_value": "0",
                "subtotal_before_taxes": "17.39"
              }
            ],
            "total_price": [
              {
                "taxes": [
                  {
                    "name": "IVA",
                    "percentage": "0"
                  }
                ],
                "metadata": {},
                "discounts": [],
                "net_price": "34.78",
                "gross_price": "34.78",
                "taxes_value": "0",
                "currency_code": "BRL",
                "discount_value": "0",
                "subtotal_before_taxes": "34.78"
              }
            ]
          },
          "item_id": "001224591808cb3551c9d0c248b739ef07dd8dd3f958d3eb1251ca5f022bad48",
          "quantity": "2",
          "item_type": "PRODUCT",
          "store_uid": "100.6.1350.1",
          "updated_at": "2026-05-11T14:38:17.481Z",
          "vendor_uid": "100.6.1350",
          "fulfillment": {
            "method": "DELIVERY",
            "catalog_uid": "200a6bf1-55dd-4c9b-af2b-07a62cb0d6f2"
          },
          "line_totals": [
            {
              "taxes": [
                {
                  "name": "IVA",
                  "percentage": "0"
                }
              ],
              "total": "34.78",
              "subtotal": "34.78",
              "discounts": [],
              "taxes_value": "0",
              "currency_code": "BRL",
              "discount_value": "0",
              "subtotal_before_taxes": "34.78"
            }
          ],
          "modifier_groups": [],
          "item_description": "X-Burguer",
          "selected_currency": "BRL"
        }
      ],
      "totals": [
        {
          "taxes": [
            {
              "name": "IVA",
              "percentage": "0"
            }
          ],
          "total": "34.78",
          "subtotal": "34.78",
          "discounts": [],
          "taxes_value": "0",
          "currency_code": "BRL",
          "discount_value": "0",
          "subtotal_before_taxes": "34.78"
        }
      ]
    },
    "isArray": false,
    "status": 200,
    "method": "POST",
    "pathname": "/stage/api/v4/aggregator/orders",
    "duration": 4900,
    "traceId": "1-6a01e9d9-7c9577787de4d07a2c14686b;Parent"
  }
  ```

  ```json 400 theme={null}
  {
    "error": {
      "code": "validation_error",
      "message": "channelId is required"
    }
  }
  ```

  ```json 409 theme={null}
  {
    "error": {
      "code": "duplicate_order",
      "message": "An order with orderId '0000012194-081101' already exists"
    }
  }
  ```
</ResponseExample>
