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

# Criar NF-e

> Emite uma NF-e (modelo 55) de forma síncrona: a chamada só retorna depois da resposta da SEFAZ, com o desfecho real no `status` do envelope (`AUTHORIZED` ou `REJECTED`, nunca um estado intermediário). Para emitir muitas notas de uma vez sem manter a conexão aberta, use `POST /v1/nfe/batch` (assíncrono, consultado depois em `GET /v1/nfe/queue`). Rejeição da SEFAZ volta como `400` com `error.erros[]` (código e descrição do motivo, ver [Erros e Rejeições](/guides/errors)); campo inválido no payload também é `400`, mas sem `erros[]` (validação nossa, a nota nunca chega na SEFAZ). Use `Idempotency-Key` para reenviar com segurança em caso de timeout/retry.



## OpenAPI

````yaml /openapi.json post /v1/nfe
openapi: 3.1.0
info:
  title: EngineAPI - Motor Fiscal SaaS
  description: >-

    ## API de Emissão Fiscal B2B2B


    EngineAPI é uma plataforma SaaS para emissão de documentos fiscais
    eletrônicos brasileiros.


    ### Documentos Suportados

    - **NF-e** (Modelo 55) - Nota Fiscal Eletrônica

    - **NFC-e** (Modelo 65) - Nota Fiscal de Consumidor Eletrônica

    - **NFS-e** - Nota Fiscal de Serviços Eletrônica


    > CTe (57) e MDFe (58): roadmap sem data, fora da superfície pública.


    ### Autenticação

    Todas as rotas protegidas requerem:

    ```

    Authorization: Bearer <seu_token>    # JWT (painel web)

    x-api-key: ek_live_<sua_key>         # API Key (server-to-server)

    ```


    ### Rate Limits

    - **Por plano** (janela de 1 segundo): Dev 5 · Starter 20 · Growth 60 ·
    Scale 200 req/s

    - Headers `X-RateLimit-Limit`/`Remaining`/`Reset` em toda resposta;
    `Retry-After` no 429


    ### Idempotency

    POSTs aceitam header `Idempotency-Key` para prevenir duplicatas:

    ```

    Idempotency-Key: <uuid-único-por-operação>

    ```


    ### Ambientes

    - **Homologação**: Para testes (SEFAZ sandbox)

    - **Produção**: Emissões reais


    ### Suporte

    - Email: suporte@engineapi.com.br

    - Docs: https://docs.engineapi.com.br
        
  version: 2.1.0
  contact:
    name: engineAPI
    url: https://engineapi.com.br
    email: suporte@engineapi.com.br
  license:
    name: Proprietário
    url: https://engineapi.com.br/legal/termos
servers:
  - url: https://api.engineapi.com.br
    description: Produção
security: []
tags:
  - name: Cérebro Fiscal
    description: >-
      Classificação fiscal assistida + tributação IBS/CBS (tier 80%, apoio à
      decisão)
  - name: Autenticação
    description: Login, registro de conta e API Keys
  - name: Empresas
    description: Gestão de empresas emitentes (Issuers)
  - name: NFe
    description: Nota Fiscal Eletrônica (Modelo 55)
  - name: NFCe
    description: Nota Fiscal de Consumidor (Modelo 65)
  - name: NFSe
    description: Nota Fiscal de Serviços Eletrônica
  - name: Consultas
    description: Consulta de CNPJ e CPF
  - name: Webhooks
    description: Configuração, entregas e reenvio de eventos assíncronos
  - name: Status
    description: Status público por serviço e canário de deploy
  - name: Saúde
    description: Liveness/readiness do processo e sanidade de autenticação
paths:
  /v1/nfe:
    post:
      tags:
        - NFe
      summary: Criar NF-e
      description: >-
        Emite uma NF-e (modelo 55) de forma síncrona: a chamada só retorna
        depois da resposta da SEFAZ, com o desfecho real no `status` do envelope
        (`AUTHORIZED` ou `REJECTED`, nunca um estado intermediário). Para emitir
        muitas notas de uma vez sem manter a conexão aberta, use `POST
        /v1/nfe/batch` (assíncrono, consultado depois em `GET /v1/nfe/queue`).
        Rejeição da SEFAZ volta como `400` com `error.erros[]` (código e
        descrição do motivo, ver [Erros e Rejeições](/guides/errors)); campo
        inválido no payload também é `400`, mas sem `erros[]` (validação nossa,
        a nota nunca chega na SEFAZ). Use `Idempotency-Key` para reenviar com
        segurança em caso de timeout/retry.
      operationId: create
      parameters: []
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/CreateNfeDto'
      responses:
        '201':
          description: NF-e autorizada pela SEFAZ
        '400':
          description: >-
            Payload inválido (validação nossa) ou rejeição da SEFAZ
            (`error.erros[]`)
        '422':
          description: >-
            Emissão assistida (`resolverTributacao: true`) sem fonte para
            resolver um campo obrigatório, ou cadastro/certificado do emissor
            incompleto
      security:
        - bearer: []
components:
  schemas:
    CreateNfeDto:
      type: object
      properties:
        issuerId:
          description: >-
            UUID do emissor (retornado por POST /v1/companies). Opcional com 1
            emissor cadastrado; obrigatório com 2+
          type: string
          format: uuid
          pattern: >-
            ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
        naturezaOperacao:
          description: 'Natureza da operação, texto livre (ex.: "VENDA DE MERCADORIA")'
          type: string
        serie:
          description: Série da NF-e. Ausente = série padrão do emissor
          type: integer
          minimum: -9007199254740991
          maximum: 9007199254740991
        numero:
          description: >-
            Número da NF-e (passthrough). Ausente = alocado automaticamente pela
            engineAPI
          type: integer
          minimum: -9007199254740991
          maximum: 9007199254740991
        tpNF:
          description: 'Tipo de operação: 0=entrada, 1=saída. Padrão: saída'
          type: integer
          minimum: -9007199254740991
          maximum: 9007199254740991
        idDest:
          description: >-
            Identificador de local de destino: 1=interna (mesma UF),
            2=interestadual, 3=exterior
          type: integer
          minimum: -9007199254740991
          maximum: 9007199254740991
        indFinal:
          description: 'Indica operação com consumidor final: 0=não, 1=sim'
          type: integer
          minimum: -9007199254740991
          maximum: 9007199254740991
        indPres:
          description: >-
            Indicador de presença do comprador: 0=não se aplica, 1=presencial,
            2=internet, 3=teleatendimento, etc.
          type: integer
          minimum: -9007199254740991
          maximum: 9007199254740991
        finNFe:
          description: >-
            Finalidade da emissão: 1=normal, 2=complementar, 3=ajuste,
            4=devolução
          type: integer
          minimum: -9007199254740991
          maximum: 9007199254740991
        destinatario:
          type: object
          properties:
            cnpjCpf:
              type: string
              minLength: 11
              maxLength: 14
              description: >-
                CNPJ (14 dígitos) ou CPF (11 dígitos) do destinatário, só
                números
            nome:
              type: string
              minLength: 1
              description: Razão social ou nome completo do destinatário
            ie:
              description: >-
                Inscrição Estadual do destinatário. Obrigatória (validada pela
                SEFAZ contra o CNPJ) quando indicadorIE = 1
              type: string
            indicadorIE:
              description: >-
                Indicador de IE do destinatário: 1 = contribuinte (exige ie); 2
                = isento; 9 = não contribuinte
              type: integer
              minimum: -9007199254740991
              maximum: 9007199254740991
            email:
              description: E-mail do destinatário (informativo, não usado para envio)
              type: string
            endereco:
              type: object
              properties:
                logradouro:
                  type: string
                  minLength: 1
                  description: Nome da rua/avenida do destinatário
                numero:
                  type: string
                  minLength: 1
                  description: Número do endereço (aceita "S/N")
                complemento:
                  description: Complemento do endereço (apto, sala, bloco)
                  type: string
                bairro:
                  type: string
                  minLength: 1
                  description: Bairro do destinatário
                codigoMunicipio:
                  type: string
                  minLength: 1
                  description: >-
                    Código IBGE do município (7 dígitos, ex.: "5208707" para
                    Goiânia)
                municipio:
                  type: string
                  minLength: 1
                  description: Nome do município
                uf:
                  type: string
                  minLength: 2
                  maxLength: 2
                  description: 'Sigla da UF, 2 letras maiúsculas (ex.: "GO", "SP")'
                cep:
                  type: string
                  minLength: 1
                  description: CEP do destinatário, só dígitos ou com hífen
              required:
                - logradouro
                - numero
                - bairro
                - codigoMunicipio
                - municipio
                - uf
                - cep
              additionalProperties: false
          required:
            - cnpjCpf
            - nome
            - endereco
          additionalProperties: false
        items:
          minItems: 1
          type: array
          items:
            type: object
            properties:
              codigo:
                type: string
                minLength: 1
                description: Código interno do produto (seu SKU)
              ean:
                description: Código de barras EAN/GTIN do produto. Ausente = "SEM GTIN"
                type: string
              descricao:
                type: string
                minLength: 1
                description: Descrição do produto
              ncm:
                type: string
                minLength: 8
                maxLength: 8
                description: Nomenclatura Comum do Mercosul, 8 dígitos exatos
              cest:
                description: >-
                  Código Especificador da Substituição Tributária, 7 dígitos sem
                  pontuação (ex.: "0100100"). Transmitido no produto do
                  documento; formato inválido devolve 422 CEST_INVALIDO
                type: string
              cBenef:
                type: string
                description: >-
                  Código do benefício fiscal (cBenef) concedido pela UF, exigido
                  por algumas UFs quando o CST/CSOSN indica benefício (ex.: GO
                  exige cBenef no CST 61 monofásico). Passthrough: o código vem
                  da tabela de benefícios da própria UF, o motor não calcula nem
                  confere
              cfop:
                type: string
                minLength: 1
                description: >-
                  Código Fiscal de Operações e Prestações (ex.: "5102" venda
                  estadual, "6102" interestadual)
              unidade:
                type: string
                minLength: 1
                description: 'Unidade comercial: "UN", "KG", "MT", "CX", etc.'
              quantidade:
                type: number
                minimum: 0.0001
                description: Quantidade vendida (mínimo 0.0001)
              valorUnitario:
                type: number
                minimum: 0.01
                description: Valor unitário do produto em R$ (mínimo 0.01)
              valorTotal:
                description: >-
                  Redundante: sempre recalculado como quantidade ×
                  valorUnitario. Se enviado e divergente, 400
                type: number
              desconto:
                description: >-
                  Desconto INCONDICIONAL do item em R$ (vDesc do leiaute). Reduz
                  a base do ICMS e do IBS/CBS. NÃO informe desconto condicional
                  (sob condição/evento posterior): por lei ele integra a base e
                  não tem campo no item
                type: number
                minimum: 0
              valorFrete:
                description: >-
                  Frete do item em R$ (vFrete do leiaute), cobrado pelo próprio
                  emitente e destacado no documento. Soma no vNF e integra a
                  base do ICMS e do IBS/CBS
                type: number
                minimum: 0
              valorSeguro:
                description: >-
                  Seguro do item em R$ (vSeg do leiaute). Soma no vNF e integra
                  a base do ICMS e do IBS/CBS
                type: number
                minimum: 0
              outrasDespesas:
                description: >-
                  Outras despesas acessórias do item em R$ (vOutro do leiaute).
                  Soma no vNF e integra a base do ICMS e do IBS/CBS
                type: number
                minimum: 0
              indTot:
                description: >-
                  Indica se o vProd do item compõe o vProd/vNF do total da nota
                  (indTot do leiaute): 1 = compõe (ausente = 1, default do
                  leiaute); 0 = não compõe. Não afeta a tributação do próprio
                  item, só a composição do total
                anyOf:
                  - type: number
                    const: 0
                  - type: number
                    const: 1
              icms:
                description: >-
                  Tributação de ICMS do item (obrigatório de fato só sem
                  resolverTributacao)
                type: object
                properties:
                  origem:
                    description: >-
                      Origem da mercadoria: 0=nacional, 1=estrangeira
                      (importação direta), 2=estrangeira (mercado interno),
                      3/4/5=nacional com % de conteúdo importado. Ausente = 0
                    type: integer
                    minimum: -9007199254740991
                    maximum: 9007199254740991
                  cst:
                    description: >-
                      Código de Situação Tributária do ICMS (Lucro
                      Real/Presumido), ex.: "00" tributada integralmente, "40"
                      isenta. "02" e "61" são a tributação monofásica de
                      combustíveis e valem nos dois regimes, inclusive Simples
                      Nacional (exigem o grupo combustivel e os campos
                      qBCMono/adRemICMS/vICMSMono ou
                      qBCMonoRet/adRemICMSRet/vICMSMonoRet)
                    type: string
                    pattern: ^\d{1,3}$
                  csosn:
                    description: >-
                      Código de Situação da Operação do Simples Nacional, ex.:
                      "102" tributada pelo Simples sem crédito, "400" não
                      tributada
                    type: string
                    pattern: ^\d{1,3}$
                  aliquota:
                    description: Alíquota do ICMS em % (só com cst, regime CST)
                    type: number
                  baseCalculo:
                    description: Base de cálculo do ICMS em R$ (só com cst, regime CST)
                    type: number
                  valor:
                    description: Valor do ICMS em R$ (só com cst, regime CST)
                    type: number
                  baseCalculoST:
                    description: >-
                      Base de cálculo do ICMS-ST em R$. AINDA NÃO SUPORTADO:
                      informar ST devolve 422 ICMS_ST_NAO_SUPORTADO (o motor não
                      emite documento sem a ST que você informou)
                    type: number
                  aliquotaST:
                    description: >-
                      Alíquota do ICMS-ST em %. AINDA NÃO SUPORTADO: ver
                      baseCalculoST (422 ICMS_ST_NAO_SUPORTADO)
                    type: number
                  valorST:
                    description: >-
                      Valor do ICMS-ST em R$. AINDA NÃO SUPORTADO: ver
                      baseCalculoST (422 ICMS_ST_NAO_SUPORTADO)
                    type: number
                  qBCMono:
                    description: >-
                      CST 02: quantidade tributada do ICMS monofásico próprio,
                      na unidade de medida do produto (não em R$). Obrigatória
                      com cst "02" (a SEFAZ rejeita com 767)
                    type: number
                  adRemICMS:
                    description: >-
                      CST 02: alíquota AD REM do ICMS monofásico, em R$ por
                      unidade (não é percentual). Definida na legislação para o
                      produto ANP
                    type: number
                  vICMSMono:
                    description: >-
                      CST 02: valor do ICMS monofásico próprio em R$. Precisa
                      bater com qBCMono × adRemICMS (tolerância de R$ 0,01);
                      divergente devolve 422 ICMS_MONOFASICO_INVALIDO antes de
                      emitir
                    type: number
                  qBCMonoRet:
                    description: >-
                      CST 61: quantidade tributada do ICMS monofásico retido
                      anteriormente, na unidade do produto (não em R$).
                      Obrigatória com cst "61" (a SEFAZ rejeita com 769)
                    type: number
                  adRemICMSRet:
                    description: >-
                      CST 61: alíquota AD REM do ICMS retido anteriormente, em
                      R$ por unidade (não é percentual)
                    type: number
                  vICMSMonoRet:
                    description: >-
                      CST 61: valor do ICMS monofásico retido anteriormente em
                      R$. Precisa bater com qBCMonoRet × adRemICMSRet
                      (tolerância de R$ 0,01)
                    type: number
                additionalProperties: false
              pis:
                description: >-
                  Tributação de PIS do item (passthrough: vai como informado
                  para o documento)
                type: object
                properties:
                  cst:
                    description: >-
                      Código de Situação Tributária do PIS. Tributado por
                      alíquota: "01"/"02" (exige baseCalculo, aliquota e valor).
                      Não tributado: "04"-"09" (só o CST vai no documento).
                      Outras operações: "49"-"56", "60"-"67", "70"-"75", "98" e
                      "99". Ausente = "99" com valores zerados
                    type: string
                    pattern: ^\d{1,3}$
                  baseCalculo:
                    description: Base de cálculo do PIS em R$ (transmitida como vBC)
                    type: number
                  aliquota:
                    description: Alíquota do PIS em % (transmitida como pPIS)
                    type: number
                  valor:
                    description: >-
                      Valor do PIS em R$ (transmitido como vPIS e somado no
                      total da nota)
                    type: number
                additionalProperties: false
              cofins:
                description: >-
                  Tributação de COFINS do item (passthrough: vai como informado
                  para o documento)
                type: object
                properties:
                  cst:
                    description: >-
                      Código de Situação Tributária da COFINS. Mesmas faixas do
                      PIS: "01"/"02" por alíquota (exige baseCalculo, aliquota e
                      valor), "04"-"09" não tributado, outras operações:
                      "49"-"56", "60"-"67", "70"-"75", "98" e "99". Ausente =
                      "99" com valores zerados
                    type: string
                    pattern: ^\d{1,3}$
                  baseCalculo:
                    description: Base de cálculo da COFINS em R$ (transmitida como vBC)
                    type: number
                  aliquota:
                    description: Alíquota da COFINS em % (transmitida como pCOFINS)
                    type: number
                  valor:
                    description: >-
                      Valor da COFINS em R$ (transmitido como vCOFINS e somado
                      no total da nota)
                    type: number
                additionalProperties: false
              ipi:
                description: >-
                  Tributação de IPI do item (indústria/importação). Só na NF-e:
                  a NFC-e não tem IPI no leiaute. O valor informado compõe o
                  total da nota
                type: object
                properties:
                  cst:
                    description: >-
                      Código de Situação Tributária do IPI (obrigatório quando o
                      grupo ipi é enviado). Tributados: "00", "49", "50", "99"
                      (exigem baseCalculo, aliquota e valor). Não tributados:
                      "01".."05" e "51".."55" (só o CST vai no documento)
                    type: string
                    pattern: ^\d{1,3}$
                  baseCalculo:
                    description: Base de cálculo do IPI em R$ (transmitida como vBC)
                    type: number
                  aliquota:
                    description: Alíquota do IPI em % (transmitida como pIPI)
                    type: number
                  valor:
                    description: >-
                      Valor do IPI em R$ (transmitido como vIPI). Atenção: o IPI
                      COMPÕE o total da nota: vNF = produtos + IPI, e os
                      pagamentos precisam fechar com esse total
                    type: number
                  cEnq:
                    description: >-
                      Código de Enquadramento Legal do IPI, 1 a 3 dígitos
                      (tabela da Receita). Ausente = "999" (demais casos)
                    type: string
                additionalProperties: false
              ibsCbs:
                description: >-
                  Grupo IBS/CBS da Reforma Tributária (opcional, NT 2025.002).
                  Aceita o grupo completo (passthrough) ou só { cClassTrib };
                  nesse caso o Cérebro Fiscal resolve os percentuais oficiais da
                  classe (requer resolverTributacao: true)
                anyOf:
                  - type: object
                    properties:
                      cst:
                        description: >-
                          Código de Situação Tributária do IBS/CBS (Reforma
                          Tributária). Ausente = "000"
                        type: string
                        pattern: ^\d{1,3}$
                      cClassTrib:
                        description: >-
                          Código de Classificação Tributária do IBS/CBS. Ausente
                          = "000001" (tributação integral)
                        type: string
                        pattern: ^\d{1,6}$
                      vBC:
                        description: >-
                          Base de cálculo do IBS/CBS em R$. Ausente = vProd −
                          desconto + valorFrete + valorSeguro + outrasDespesas
                          do item (LC 214/2025 art. 12 § 1º III soma
                          frete/seguro/outras despesas; art. 12 § 2º III:
                          descontos incondicionais não integram a base)
                        type: number
                        minimum: 0
                      ibsUf:
                        type: object
                        properties:
                          p:
                            type: number
                            minimum: 0
                            description: >-
                              Alíquota EFETIVA do componente, em % (ex.: 0.04).
                              É ela que gera o valor do tributo (v = p × vBC).
                              Em item COM redução, vai no documento dentro de
                              gRed/pAliqEfet
                          pNominal:
                            description: >-
                              Alíquota NOMINAL do componente, em % (ex.: 0.1). É
                              a alíquota cheia, antes da redução do cClassTrib,
                              e a que o documento grava em pIBSUF/pIBSMun/pCBS.
                              Obrigatória junto com pRedAliq; ausente = item sem
                              redução (nominal = efetiva)
                            type: number
                            minimum: 0
                          pRedAliq:
                            description: >-
                              Percentual de redução de alíquota do cClassTrib,
                              em % (ex.: 60 para o Anexo VII). Presente e maior
                              que 0 faz o documento emitir o grupo
                              gRed{pRedAliq, pAliqEfet}. Obrigatória junto com
                              pNominal
                            type: number
                            minimum: 0
                            maximum: 100
                          v:
                            description: >-
                              Valor do componente em R$. Ausente = calculado
                              como p × vBC
                            type: number
                            minimum: 0
                        required:
                          - p
                        additionalProperties: false
                        description: >-
                          Componente estadual do IBS (Imposto sobre Bens e
                          Serviços)
                      ibsMun:
                        type: object
                        properties:
                          p:
                            type: number
                            minimum: 0
                            description: >-
                              Alíquota EFETIVA do componente, em % (ex.: 0.04).
                              É ela que gera o valor do tributo (v = p × vBC).
                              Em item COM redução, vai no documento dentro de
                              gRed/pAliqEfet
                          pNominal:
                            description: >-
                              Alíquota NOMINAL do componente, em % (ex.: 0.1). É
                              a alíquota cheia, antes da redução do cClassTrib,
                              e a que o documento grava em pIBSUF/pIBSMun/pCBS.
                              Obrigatória junto com pRedAliq; ausente = item sem
                              redução (nominal = efetiva)
                            type: number
                            minimum: 0
                          pRedAliq:
                            description: >-
                              Percentual de redução de alíquota do cClassTrib,
                              em % (ex.: 60 para o Anexo VII). Presente e maior
                              que 0 faz o documento emitir o grupo
                              gRed{pRedAliq, pAliqEfet}. Obrigatória junto com
                              pNominal
                            type: number
                            minimum: 0
                            maximum: 100
                          v:
                            description: >-
                              Valor do componente em R$. Ausente = calculado
                              como p × vBC
                            type: number
                            minimum: 0
                        required:
                          - p
                        additionalProperties: false
                        description: Componente municipal do IBS
                      vIbs:
                        description: >-
                          Valor total do IBS em R$ (UF + Município). Ausente =
                          vIbsUf + vIbsMun
                        type: number
                        minimum: 0
                      cbs:
                        type: object
                        properties:
                          p:
                            type: number
                            minimum: 0
                            description: >-
                              Alíquota EFETIVA do componente, em % (ex.: 0.04).
                              É ela que gera o valor do tributo (v = p × vBC).
                              Em item COM redução, vai no documento dentro de
                              gRed/pAliqEfet
                          pNominal:
                            description: >-
                              Alíquota NOMINAL do componente, em % (ex.: 0.1). É
                              a alíquota cheia, antes da redução do cClassTrib,
                              e a que o documento grava em pIBSUF/pIBSMun/pCBS.
                              Obrigatória junto com pRedAliq; ausente = item sem
                              redução (nominal = efetiva)
                            type: number
                            minimum: 0
                          pRedAliq:
                            description: >-
                              Percentual de redução de alíquota do cClassTrib,
                              em % (ex.: 60 para o Anexo VII). Presente e maior
                              que 0 faz o documento emitir o grupo
                              gRed{pRedAliq, pAliqEfet}. Obrigatória junto com
                              pNominal
                            type: number
                            minimum: 0
                            maximum: 100
                          v:
                            description: >-
                              Valor do componente em R$. Ausente = calculado
                              como p × vBC
                            type: number
                            minimum: 0
                        required:
                          - p
                        additionalProperties: false
                        description: >-
                          CBS (Contribuição sobre Bens e Serviços, componente
                          federal)
                    required:
                      - ibsUf
                      - ibsMun
                      - cbs
                    additionalProperties: false
                  - type: object
                    properties:
                      cClassTrib:
                        type: string
                        pattern: ^\d{1,6}$
                        description: >-
                          Classe de tributação IBS/CBS a estampar no item. O
                          motor busca os percentuais oficiais dela para o NCM e
                          recusa (422) se a classe não valer para este NCM ou
                          para o modelo do documento. Requer resolverTributacao:
                          true. Neste formato NENHUM outro campo do grupo é
                          aceito; inclusive vBC, que hoje é sempre o vProd do
                          item
                    required:
                      - cClassTrib
                    additionalProperties: false
              combustivel:
                description: >-
                  Grupo de combustíveis do leiaute (comb/LA). Obrigatório quando
                  o CFOP do item é de operação com combustível (rejeição 660 da
                  SEFAZ): sem ele a emissão é recusada com 422
                  COMBUSTIVEL_GRUPO_OBRIGATORIO. Passthrough: o motor não
                  calcula nada aqui
                type: object
                properties:
                  cProdANP:
                    type: string
                    pattern: ^\d{9}$
                    description: >-
                      Código do produto na tabela SIMP da ANP, 9 dígitos (ex.:
                      "210203001" para GLP). Código inexistente na tabela da ANP
                      é rejeitado pela SEFAZ (cStat 761)
                  descANP:
                    type: string
                    minLength: 2
                    maxLength: 95
                    description: >-
                      Descrição do produto conforme a ANP (tabela SIMP), 2 a 95
                      caracteres (ex.: "GLP")
                  ufConsumo:
                    type: string
                    minLength: 2
                    maxLength: 2
                    description: >-
                      Sigla da UF de consumo do combustível (campo UFCons do
                      leiaute, obrigatório). Use "EX" para exterior
                  pGLP:
                    description: >-
                      Percentual do GLP derivado de petróleo no produto, 0 a
                      100. SÓ para cProdANP "210203001" (GLP); em outro produto
                      a emissão é recusada com 422 COMBUSTIVEL_INVALIDO (a SEFAZ
                      rejeitaria com cStat 461)
                    type: number
                    minimum: 0
                    maximum: 100
                  pGNn:
                    description: >-
                      Percentual de gás natural NACIONAL (GLGNn) no produto GLP,
                      0 a 100. Mesma restrição de pGLP
                    type: number
                    minimum: 0
                    maximum: 100
                  pGNi:
                    description: >-
                      Percentual de gás natural IMPORTADO (GLGNi) no produto
                      GLP, 0 a 100. Mesma restrição de pGLP. Regra da SEFAZ:
                      pGLP + pGNn + pGNi = 100 (cStat 855)
                    type: number
                    minimum: 0
                    maximum: 100
                  vPart:
                    description: >-
                      Valor de partida em R$ por quilograma, SEM ICMS.
                      Obrigatório para GLP (cStat 856) e aceito apenas nele
                    type: number
                    minimum: 0
                required:
                  - cProdANP
                  - descANP
                  - ufConsumo
                additionalProperties: false
            required:
              - codigo
              - descricao
              - ncm
              - cfop
              - unidade
              - quantidade
              - valorUnitario
            additionalProperties: false
          description: 'Itens da nota (mínimo 1). Atenção: o campo é "items", não "itens"'
        transporte:
          description: Dados de transporte. Se enviado, modFrete é obrigatório
          type: object
          properties:
            modFrete:
              anyOf:
                - type: number
                  const: 0
                - type: number
                  const: 1
                - type: number
                  const: 2
                - type: number
                  const: 3
                - type: number
                  const: 4
                - type: number
                  const: 9
              description: >-
                Modalidade do frete: 0=por conta do remetente/emitente (CIF),
                1=por conta do destinatário (FOB), 2=por conta de terceiros,
                3=transporte próprio por conta do remetente, 4=transporte
                próprio por conta do destinatário, 9=sem ocorrência de
                transporte
            transportadora:
              type: object
              properties:
                cnpjCpf:
                  description: CNPJ ou CPF da transportadora
                  type: string
                nome:
                  description: Razão social ou nome da transportadora
                  type: string
                ie:
                  description: Inscrição Estadual da transportadora
                  type: string
                endereco:
                  description: Endereço da transportadora
                  type: string
                municipio:
                  description: Município da transportadora
                  type: string
                uf:
                  description: UF da transportadora
                  type: string
              additionalProperties: false
            volumes:
              type: array
              items:
                type: object
                properties:
                  quantidade:
                    description: Quantidade de volumes transportados
                    type: integer
                    minimum: -9007199254740991
                    maximum: 9007199254740991
                  especie:
                    description: 'Espécie dos volumes (ex.: "Caixa", "Pallet")'
                    type: string
                  pesoBruto:
                    description: Peso bruto total em kg
                    type: number
                  pesoLiquido:
                    description: Peso líquido total em kg
                    type: number
                additionalProperties: false
          required:
            - modFrete
          additionalProperties: false
        pagamentos:
          minItems: 1
          maxItems: 100
          type: array
          items:
            type: object
            properties:
              forma:
                type: string
                enum:
                  - '10'
                  - '11'
                  - '12'
                  - '13'
                  - '14'
                  - '15'
                  - '16'
                  - '17'
                  - '18'
                  - '19'
                  - '20'
                  - '21'
                  - '22'
                  - '90'
                  - '98'
                  - '99'
                  - '01'
                  - '02'
                  - '03'
                  - '04'
                  - '05'
                description: >-
                  Código da forma de pagamento SEFAZ (ex.: "01" dinheiro, "03"
                  cartão de crédito, "15" boleto)
              valor:
                type: number
                minimum: 0
                description: Valor pago nesta forma, em R$ (máximo 2 casas decimais)
            required:
              - forma
              - valor
            additionalProperties: false
          description: >-
            Formas de pagamento (mínimo 1, máximo 100). Atenção: o campo é
            "pagamentos" (array), não "pagamento"
        troco:
          description: >-
            Valor do troco em R$, para venda com pagamento em dinheiro (máximo 2
            casas decimais)
          type: number
          minimum: 0
        cobranca:
          description: >-
            Cobrança a prazo: fatura (numero, valorOriginal, valorDesconto,
            valorLiquido) e/ou duplicatas[] (numero, vencimento, valor).
            Informativo/financeiro: NÃO altera vNF nem `pagamentos` (quem fecha
            o total transmitido continua sendo `pagamentos`)
          type: object
          properties:
            fatura:
              description: >-
                Dados da fatura (grupo fat). Se enviado, os 4 campos são
                obrigatórios
              type: object
              properties:
                numero:
                  type: string
                  minLength: 1
                  maxLength: 60
                  description: Número da fatura (nFat do leiaute), 1 a 60 caracteres
                valorOriginal:
                  type: number
                  minimum: 0
                  description: Valor original da fatura em R$ (vOrig)
                valorDesconto:
                  type: number
                  minimum: 0
                  description: >-
                    Valor do desconto da fatura em R$ (vDesc). Não pode ser
                    maior que valorOriginal
                valorLiquido:
                  type: number
                  minimum: 0
                  description: >-
                    Valor líquido da fatura em R$ (vLiq). Precisa ser igual a
                    valorOriginal − valorDesconto, e igual à soma de
                    duplicatas[].valor quando houver duplicatas (regras do grupo
                    Y do leiaute, MOC Anexo I)
              required:
                - numero
                - valorOriginal
                - valorDesconto
                - valorLiquido
              additionalProperties: false
            duplicatas:
              description: >-
                Duplicatas do parcelamento (grupo dup, até 120). Pode vir sem
                `fatura`. numero é tudo-ou-nada: se UMA duplicata tem numero,
                todas precisam ter
              maxItems: 120
              type: array
              items:
                type: object
                properties:
                  numero:
                    description: >-
                      Número da duplicata (nDup do leiaute), 1 a 60 caracteres.
                      Ausente = a engineAPI preenche sequencial (001, 002...): o
                      documento sempre leva um nDup, nunca vazio
                    type: string
                    minLength: 1
                    maxLength: 60
                  vencimento:
                    type: string
                    pattern: ^\d{4}-\d{2}-\d{2}$
                    description: >-
                      Data de vencimento da duplicata, formato AAAA-MM-DD (dVenc
                      do leiaute). Precisa ser >= à data de emissão e
                      não-decrescente entre as parcelas (regras do grupo Y do
                      leiaute, MOC Anexo I)
                  valor:
                    type: number
                    minimum: 0.01
                    description: Valor da duplicata em R$ (vDup do leiaute)
                required:
                  - vencimento
                  - valor
                additionalProperties: false
          additionalProperties: false
        informacoesComplementares:
          description: >-
            Informações complementares de interesse do contribuinte, impressas
            no DANFE
          type: string
        informacoesFisco:
          description: Informações adicionais de interesse do fisco
          type: string
          maxLength: 2000
        resolverTributacao:
          description: >-
            Ativa a emissão assistida (Cérebro Fiscal): resolve CSOSN e o grupo
            IBS/CBS de itens sem tributação manual. Requer plano com fiscalBrain
            + Issuer.fiscalBrainEnabled
          type: boolean
      required:
        - destinatario
        - items
        - pagamentos

````