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

# Venda a prazo (fatura e duplicatas)

> Como emitir NF-e de venda a prazo com o grupo cobranca: fatura, duplicatas e a coerência que a SEFAZ audita entre elas.

Venda a prazo B2B tem um dado que `pagamentos` não representa: o **parcelamento
em duplicatas**, com data de vencimento, que o financeiro do seu cliente concilia
depois. É o bloco **`cobranca`** na raiz do payload da NF-e.

`pagamentos` continua sendo a forma de pagamento efetiva (ex.: `"15"` boleto) e
segue fechando o total transmitido. `cobranca` é **informativo e financeiro**:
não altera `vNF` nem o que `pagamentos` já faz. O motor é **passthrough** aqui,
nada é calculado.

* **Só NF-e (modelo 55)**: NFC-e documenta venda com pagamento imediato ao
  consumidor final e recusa o bloco com `422`, mas só quando ele tem conteúdo
  de verdade (`{}` vazio passa batido, útil pra quem usa o mesmo payload nos
  dois modelos).
* **Duplicata não exige fatura**: no leiaute, `fatura` e `duplicatas` são
  independentes. Você pode informar só as duplicatas.
* **Fatura é tudo ou nada**: se você envia `fatura`, os 4 campos (`numero`,
  `valorOriginal`, `valorDesconto`, `valorLiquido`) são obrigatórios juntos, e
  `valorLiquido` precisa ser exatamente `valorOriginal − valorDesconto`.
* **Vencimento é obrigatório e auditado**: precisa ser uma data real (não só
  o formato), maior ou igual a hoje, e as parcelas precisam vir em ordem
  não-decrescente de vencimento.
* **Coerência auditada**: quando há fatura E duplicatas, a soma de
  `duplicatas[].valor` precisa bater com o líquido da fatura.

## Pré-requisitos

| Item               | Detalhe                                                                                                |
| ------------------ | ------------------------------------------------------------------------------------------------------ |
| Documento          | NF-e (modelo 55) apenas                                                                                |
| Emissor cadastrado | Com certificado A1 instalado e `ambienteFiscal` definido                                               |
| Forma de pagamento | `pagamentos[].forma` continua obrigatório e fecha o total (ex.: `"15"` boleto, `"05"` crédito em loja) |

## Emitindo com fatura e duplicatas

```bash theme={null}
curl -X POST https://api.engineapi.com.br/v1/nfe \
  -H "x-api-key: ek_live_..." \
  -H "Content-Type: application/json" \
  -d '{
    "naturezaOperacao": "Venda a prazo",
    "destinatario": {
      "cnpjCpf": "12345678000199",
      "nome": "Cliente Exemplo LTDA",
      "indicadorIE": 1,
      "ie": "123456789",
      "endereco": {
        "logradouro": "Rua A", "numero": "100", "bairro": "Centro",
        "codigoMunicipio": "5211701", "municipio": "JANDAIA",
        "uf": "GO", "cep": "75950000"
      }
    },
    "items": [
      {
        "codigo": "P1",
        "descricao": "Mercadoria vendida a prazo",
        "ncm": "61091000",
        "cfop": "5102",
        "unidade": "UN",
        "quantidade": 1,
        "valorUnitario": 3000,
        "icms": { "origem": 0, "csosn": "102" }
      }
    ],
    "pagamentos": [{ "forma": "15", "valor": 3000 }],
    "cobranca": {
      "fatura": {
        "numero": "FAT-2026-001",
        "valorOriginal": 3000,
        "valorDesconto": 0,
        "valorLiquido": 3000
      },
      "duplicatas": [
        { "numero": "001", "vencimento": "2026-09-01", "valor": 1000 },
        { "numero": "002", "vencimento": "2026-10-01", "valor": 1000 },
        { "numero": "003", "vencimento": "2026-11-01", "valor": 1000 }
      ]
    }
  }'
```

### O que sai no XML

O grupo vira `<cobr>` dentro de `infNFe`, entre `<transp>` e `<pag>`
(estrutura validada contra o XSD oficial da NF-e 4.00):

```xml theme={null}
<cobr>
  <fat>
    <nFat>FAT-2026-001</nFat>
    <vOrig>3000.00</vOrig>
    <vDesc>0.00</vDesc>
    <vLiq>3000.00</vLiq>
  </fat>
  <dup>
    <nDup>001</nDup>
    <dVenc>2026-09-01</dVenc>
    <vDup>1000.00</vDup>
  </dup>
  <dup>
    <nDup>002</nDup>
    <dVenc>2026-10-01</dVenc>
    <vDup>1000.00</vDup>
  </dup>
  <dup>
    <nDup>003</nDup>
    <dVenc>2026-11-01</dVenc>
    <vDup>1000.00</vDup>
  </dup>
</cobr>
```

Recupere o XML autorizado com `GET /v1/nfe/xml/{accessKey}`: ele é o artefato
real que a SEFAZ recebeu, nunca uma remontagem.

<Info>
  **`duplicatas[].numero` é opcional no payload, mas nunca fica de fora do
  documento.** Se você não numerar as parcelas, a engineAPI preenche
  sequencial (`001`, `002`...): o motor de emissão usa esse número como
  identificador interno da parcela, então ele nunca pode faltar no XML.
</Info>

## Campos do bloco `cobranca`

| Campo                     | Obrigatório                | Formato           | Observação                                                                                                                                             |
| ------------------------- | -------------------------- | ----------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------ |
| `fatura.numero`           | Só se `fatura` for enviada | 1 a 60 caracteres | Número da fatura (`nFat` do leiaute)                                                                                                                   |
| `fatura.valorOriginal`    | Só se `fatura` for enviada | R\$, 2 casas      | Valor original da fatura (`vOrig`)                                                                                                                     |
| `fatura.valorDesconto`    | Só se `fatura` for enviada | R\$, 2 casas      | Valor do desconto da fatura (`vDesc`). Não pode ser maior que `valorOriginal`                                                                          |
| `fatura.valorLiquido`     | Só se `fatura` for enviada | R\$, 2 casas      | Valor líquido da fatura (`vLiq`). Precisa ser igual a `valorOriginal − valorDesconto`, e igual à soma de `duplicatas[].valor` quando houver duplicatas |
| `duplicatas[].numero`     | Não                        | 1 a 60 caracteres | Número da duplicata (`nDup`). Ausente = sequencial automático                                                                                          |
| `duplicatas[].vencimento` | **Sim**                    | `AAAA-MM-DD`      | Data de vencimento da duplicata (`dVenc`). Calendário real, `>=` hoje, e não-decrescente entre as parcelas                                             |
| `duplicatas[].valor`      | **Sim**                    | R\$, mínimo 0.01  | Valor da duplicata (`vDup`), até 120 por nota                                                                                                          |

<Info>
  `fatura` e `duplicatas` são independentes: você pode enviar só `duplicatas`
  (parcelamento sem número de fatura formal) ou só `fatura` (sem detalhar as
  parcelas). No leiaute, `dup` não é filho de `fat`, os dois vivem direto sob
  `cobranca`.
</Info>

<Warning>
  **A soma das duplicatas precisa bater com o líquido da fatura**, quando os
  dois são informados. A comparação usa o valor **como vai no documento** (2
  casas decimais) e é uma igualdade EXATA sobre esse valor, não uma
  tolerância. Divergência em qualquer direção (soma maior OU menor) devolve
  `422 COBRANCA_INVALIDA` antes da numeração, citando os dois valores.
</Warning>

<Warning>
  **Vencimento fora de ordem entre as parcelas recusa.** As duplicatas
  precisam vir em ordem não-decrescente de `vencimento` (a 2ª parcela não
  pode vencer antes da 1ª). Um vencimento anterior à data de emissão também
  recusa: a engineAPI não emite nota com parcela "vencida antes de nascer".
</Warning>

## Erros comuns

| O que aconteceu                                                                             | Resposta                          | Como corrigir                                                                                      |
| ------------------------------------------------------------------------------------------- | --------------------------------- | -------------------------------------------------------------------------------------------------- |
| Soma de `duplicatas[].valor` diverge do líquido da fatura                                   | `422 COBRANCA_INVALIDA`           | Ajuste os valores, ou omita `fatura` se as duplicatas não representam o parcelamento integral dela |
| `fatura.valorLiquido` != `valorOriginal − valorDesconto`                                    | `422 COBRANCA_INVALIDA`           | Corrija o valor líquido                                                                            |
| `fatura.valorDesconto` maior que `valorOriginal`                                            | `422 COBRANCA_INVALIDA`           | O desconto não pode ser maior que o valor original                                                 |
| `duplicatas[].vencimento` anterior a hoje, ou fora de ordem entre as parcelas               | `422 COBRANCA_INVALIDA`           | Ajuste as datas: `>=` hoje e não-decrescente entre parcelas                                        |
| `cobranca` com conteúdo (fatura ou duplicatas) numa NFC-e                                   | `422 COBRANCA_NAO_SUPORTADA_NFCE` | Emita uma NF-e (modelo 55). NFC-e não tem o conceito de fatura a prazo                             |
| `duplicatas[]` sem `valor` ou sem `vencimento`                                              | `400` nomeando o campo            | Os dois são obrigatórios por duplicata                                                             |
| `vencimento` fora do formato `AAAA-MM-DD`, ou uma data que não existe (ex.: `"2026-02-30"`) | `400` nomeando o campo            | Use o formato ISO com uma data de calendário real                                                  |
| `fatura` enviada com só alguns dos 4 campos                                                 | `400` nomeando o campo            | Os 4 campos (`numero`, `valorOriginal`, `valorDesconto`, `valorLiquido`) são obrigatórios juntos   |
| Mais de 120 duplicatas                                                                      | `400` nomeando o campo            | O leiaute limita `dup` a 120 ocorrências por nota                                                  |

Todos os `422` acima são **locais**: acontecem antes de qualquer chamada à
SEFAZ e antes da numeração, então nada é emitido e nenhum número fiscal é
consumido. Em lote (`POST /v1/nfe/batch`) o item falha no pré-voo e sai
`FAILED` com o mesmo `code`, sem retry.

## Referências

* **MOC (Manual de Orientação do Contribuinte) Anexo I**, grupo Y (`cobr`/
  `fat`/`dup`): regras de negócio da fatura (Y04/Y05/Y06), do número da
  duplicata (Y07/Y08), do vencimento (Y09) e da soma das duplicatas contra a
  fatura (Y10).
* **Leiaute NF-e 4.00**, elemento `cobr` dentro de `infNFe` (irmão de `transp`
  e `pag`).
* [Catálogo de erros](/guides/errors): todos os `code` de negócio da API.
* [Emitir NF-e](/guides/emitir-nfe): o payload completo, campo a campo.
* [Campos de NFe](/api-reference/campos-nfe): referência de todo campo aceito.
