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

# Emitir NFS-e

> Emite uma NFS-e de forma síncrona: a chamada só retorna depois da resposta da SEFIN (Padrão Nacional/ADN) ou da prefeitura (ABRASF), conforme o provider configurado no emissor, com o desfecho real no `status` do envelope. Rejeição 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 à SEFIN/prefeitura). Use `Idempotency-Key` para reenviar com segurança em caso de timeout/retry.



## OpenAPI

````yaml /openapi.json post /v1/nfse
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/nfse:
    post:
      tags:
        - NFSe
      summary: Emitir NFS-e
      description: >-
        Emite uma NFS-e de forma síncrona: a chamada só retorna depois da
        resposta da SEFIN (Padrão Nacional/ADN) ou da prefeitura (ABRASF),
        conforme o provider configurado no emissor, com o desfecho real no
        `status` do envelope. Rejeição 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 à SEFIN/prefeitura). Use `Idempotency-Key`
        para reenviar com segurança em caso de timeout/retry.
      operationId: emit
      parameters: []
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/CreateNfseDto'
      responses:
        '201':
          description: NFS-e emitida com sucesso
        '400':
          description: Dados inválidos ou erro na emissão
      security:
        - bearer: []
components:
  schemas:
    CreateNfseDto:
      type: object
      properties:
        issuerId:
          type: string
          minLength: 1
        rps:
          type: object
          properties:
            numero:
              type: integer
              minimum: -9007199254740991
              maximum: 9007199254740991
            serie:
              type: string
            tipo:
              type: integer
              minimum: -9007199254740991
              maximum: 9007199254740991
          required:
            - numero
          additionalProperties: false
        serie:
          anyOf:
            - type: string
            - type: number
        dpsNacional:
          type: object
          properties:
            opSimpNac:
              anyOf:
                - type: string
                - type: number
            regApTribSN:
              anyOf:
                - type: string
                - type: number
            regEspTrib:
              anyOf:
                - type: string
                - type: number
            cTribNac:
              type: string
              minLength: 1
            cTribMun:
              type: string
            tribISSQN:
              anyOf:
                - type: string
                - type: number
            tpRetISSQN:
              anyOf:
                - type: string
                - type: number
              description: >-
                Tipo de retenção do ISSQN: 1 (não retido), 2 (retido pelo
                tomador) ou 3 (retido pelo intermediário). Equivalente de baixo
                nível de retencoes.issRetidoPor: informar os dois com valores
                diferentes recusa com 422 RETENCAO_ISS_CONFLITO
            cstPisCofins:
              type: string
            tpRetPisCofins:
              anyOf:
                - type: string
                - type: number
              description: >-
                Tipo de retenção do PIS/COFINS (enum TSTipoRetPISCofins, códigos
                0 a 9; ex.: 1 = PIS/COFINS retidos, 3 = PIS/COFINS/CSLL
                retidos). É como se declara a retenção de PIS/COFINS, que não
                tem campo de valor na DPS. Exige dpsNacional.cstPisCofins
            pTotTribSN:
              type: number
          required:
            - opSimpNac
            - cTribNac
            - tribISSQN
          additionalProperties: false
        ibsCbs:
          type: object
          properties:
            finNFSe:
              description: >-
                Finalidade da emissão. O leiaute v1.01 prevê um único valor: "0"
                (NFS-e regular). Ausente = "0"
              type: string
              enum:
                - '0'
            indFinal:
              description: >-
                Operação de uso ou consumo pessoal (LC 214/2025, art. 57): "0"
                não · "1" sim
              type: string
              enum:
                - '0'
                - '1'
            cIndOp:
              type: string
              pattern: ^\d{6}$
              description: >-
                Código indicador da operação de fornecimento (6 dígitos),
                conforme a tabela oficial "Código Indicador de Operação"
                (ANEXO_C/AnexoVII do portal nacional da NFS-e). Obrigatório
                quando o bloco ibsCbs é enviado
            tpOper:
              description: >-
                Tipo de operação com entes governamentais ou serviços sobre bens
                imóveis: 1 fornecimento com pagamento posterior · 2 recebimento
                com fornecimento já realizado · 3 fornecimento com pagamento já
                realizado · 4 recebimento com fornecimento posterior · 5
                fornecimento e recebimento concomitantes
              type: string
              enum:
                - '1'
                - '2'
                - '3'
                - '4'
                - '5'
            tpEnteGov:
              description: >-
                Tipo de ente governamental: 1 União · 2 Estado · 3 DF · 4
                Município
              type: string
              enum:
                - '1'
                - '2'
                - '3'
                - '4'
            indDest:
              description: >-
                Destinatário do serviço: "0" o destinatário é o próprio tomador
                (padrão) · "1" o destinatário é outra pessoa, o que exige o
                grupo `dest` do leiaute, ainda NÃO suportado por este motor, que
                recusa com 422 IBSCBS_DPS_DESTINATARIO_NAO_SUPORTADO em vez de
                emitir sem o grupo
              type: string
              enum:
                - '0'
                - '1'
            cst:
              type: string
              pattern: ^\d{3}$
              description: >-
                Código de Situação Tributária do IBS/CBS (3 dígitos).
                Obrigatório quando o bloco ibsCbs é enviado (o motor não infere
                CST na NFS-e)
            cClassTrib:
              type: string
              pattern: ^\d{6}$
              description: >-
                Código de Classificação Tributária do IBS/CBS (6 dígitos).
                Obrigatório quando o bloco ibsCbs é enviado
            cCredPres:
              description: >-
                Código e classificação do crédito presumido de IBS/CBS (2
                dígitos)
              type: string
              pattern: ^\d{2}$
            gTribRegular:
              description: >-
                Tributação regular: a situação que valeria se o benefício não
                existisse
              type: object
              properties:
                cstReg:
                  type: string
                  pattern: ^\d{3}$
                  description: >-
                    CST do IBS/CBS que valeria na tributação regular (sem o
                    benefício aplicado)
                cClassTribReg:
                  type: string
                  pattern: ^\d{6}$
                  description: >-
                    Código de classificação tributária do IBS/CBS na tributação
                    regular
              required:
                - cstReg
                - cClassTribReg
              additionalProperties: false
            gDif:
              description: >-
                Diferimento do IBS/CBS. Os três percentuais (pDifUF, pDifMun,
                pDifCBS) são exigidos juntos pelo leiaute
              type: object
              properties:
                pDifUF:
                  type: number
                  minimum: 0
                  maximum: 100
                  multipleOf: 0.01
                  description: >-
                    Percentual de diferimento do IBS estadual, em % (ex.: 30
                    para 30%)
                pDifMun:
                  type: number
                  minimum: 0
                  maximum: 100
                  multipleOf: 0.01
                  description: Percentual de diferimento do IBS municipal, em %
                pDifCBS:
                  type: number
                  minimum: 0
                  maximum: 100
                  multipleOf: 0.01
                  description: Percentual de diferimento da CBS, em %
              required:
                - pDifUF
                - pDifMun
                - pDifCBS
              additionalProperties: false
          required:
            - cIndOp
            - cst
            - cClassTrib
          additionalProperties: false
        naturezaOperacao:
          type: integer
          minimum: -9007199254740991
          maximum: 9007199254740991
        regimeTributacao:
          type: integer
          minimum: -9007199254740991
          maximum: 9007199254740991
        optanteSimples:
          type: boolean
        exigibilidadeISS:
          type: integer
          minimum: -9007199254740991
          maximum: 9007199254740991
        competencia:
          type: string
          pattern: ^\d{4}-\d{2}-\d{2}$
        tomador:
          type: object
          properties:
            cnpjCpf:
              type: string
              minLength: 1
            razaoSocial:
              type: string
              minLength: 1
            email:
              type: string
            telefone:
              type: string
            inscricaoMunicipal:
              type: string
            endereco:
              type: object
              properties:
                logradouro:
                  type: string
                  minLength: 1
                numero:
                  type: string
                  minLength: 1
                complemento:
                  type: string
                bairro:
                  type: string
                  minLength: 1
                codigoMunicipio:
                  type: string
                  minLength: 1
                uf:
                  type: string
                  minLength: 1
                cep:
                  type: string
                  minLength: 1
              required:
                - logradouro
                - numero
                - bairro
                - codigoMunicipio
                - uf
                - cep
              additionalProperties: false
          required:
            - cnpjCpf
            - razaoSocial
            - endereco
          additionalProperties: false
        servico:
          type: object
          properties:
            codigoMunicipio:
              type: string
              minLength: 1
            itemListaServico:
              type: string
              minLength: 1
            codigoCnae:
              type: string
            codigoTributacaoMunicipio:
              type: string
            codigoNBS:
              type: string
            discriminacao:
              type: string
              minLength: 1
            valorServicos:
              type: number
            aliquotaIss:
              type: number
            valorDeducoes:
              type: number
            descontoIncondicionado:
              type: number
            descontoCondicionado:
              type: number
          required:
            - codigoMunicipio
            - discriminacao
            - valorServicos
          additionalProperties: false
        retencoes:
          type: object
          properties:
            issRetidoPor:
              description: >-
                Quem retém o ISS: "tomador" (tpRetISSQN=2) ou "intermediario"
                (tpRetISSQN=3). Ausente = não retido
              type: string
              enum:
                - tomador
                - intermediario
            irrf:
              type: number
              minimum: 0
              multipleOf: 0.01
              description: Valor retido em R$. Vai para tribFed/vRetIRRF na DPS
            csll:
              type: number
              minimum: 0
              multipleOf: 0.01
              description: Valor retido em R$. Vai para tribFed/vRetCSLL na DPS
            inss:
              type: number
              minimum: 0
              multipleOf: 0.01
              description: >-
                Valor retido em R$. Vai para tribFed/vRetCP (Contribuição
                Previdenciária) na DPS
            cofins:
              description: >-
                Sem campo de VALOR na DPS do Padrão Nacional (vCofins do leiaute
                é o débito de apuração própria, não a retenção): valor diferente
                de zero recusa com 422 RETENCAO_SEM_CAMPO_NO_LEIAUTE. A retenção
                de PIS/COFINS se declara pelo indicador
                dpsNacional.tpRetPisCofins
              type: number
              minimum: 0
              multipleOf: 0.01
            pis:
              description: >-
                Sem campo de VALOR na DPS do Padrão Nacional (vPis do leiaute é
                o débito de apuração própria, não a retenção): valor diferente
                de zero recusa com 422 RETENCAO_SEM_CAMPO_NO_LEIAUTE. A retenção
                de PIS/COFINS se declara pelo indicador
                dpsNacional.tpRetPisCofins
              type: number
              minimum: 0
              multipleOf: 0.01
            outrasRetencoes:
              description: >-
                Sem campo de VALOR na DPS do Padrão Nacional (a DPS não tem
                campo de "outras retenções"): valor diferente de zero recusa com
                422 RETENCAO_SEM_CAMPO_NO_LEIAUTE. Informe o tributo no campo
                próprio: retencoes.inss, retencoes.irrf ou retencoes.csll
              type: number
              minimum: 0
              multipleOf: 0.01
          additionalProperties: false
        informacoesComplementares:
          type: string
        resolverTributacao:
          type: boolean
      required:
        - issuerId
        - tomador
        - servico

````