Skip to content

API cheat sheet

Assinaturas compactas de toda a superfície pública. Para parâmetros completos, tipos aninhados e JSDoc, clique em cada link para a API completa (TypeDoc).

Cliente

NfseClient

ts
new NfseClient(config: NfseClientConfig): NfseClient

Todos os métodos abaixo retornam Promise<T>. Referência: NfseClient.

Leitura

MétodoAssinaturaLança
fetchByChave(chaveAcesso: string) → NfseQueryResultInvalidChaveAcessoError, NotFoundError, HttpError*
fetchByNsu(params: FetchByNsuParams) → NsuQueryResultHttpError* (404/400 não lançam — viram status)

Emissão

MétodoAssinaturaComportamento
emitir(params: EmitirParams) → EmitirResult | DpsDryRunResultCounter após validação; transiente → retry_pending; permanente → throw
emitirDpsPronta(dps: DPS, options?: EmitOptions) → NfseEmitResult | DpsDryRunResultEscape hatch: sem counter, sem retry store, throw em tudo
emitirEmLote(dpsList: readonly DPS[], options?: EmitManyOptions) → EmitLoteResultWorker pool client-side; stopOnError opcional

Eventos

MétodoAssinaturaComportamento
cancelar(params: CancelarParams) → CancelarResultEvento 101101; discriminated ok / retry_pending
substituir(params: SubstituirParams) → SubstituirResultEmit+cancel 105102; 4 estados + rollback automático
replayPendingEvents(override?: RetryStore) → ReplayItem[]Cron-friendly; SEFIN dedupa → idempotente

Parâmetros municipais

Todas aceitam options?: ConsultaOptions e retornam Consulta*Result.

MétodoArgsTTL default
consultarAliquota(codMunicipio, codServico, competencia: Date | string)6h
consultarHistoricoAliquotas(codMunicipio, codServico)24h
consultarBeneficio(codMunicipio, numeroBeneficio, competencia)6h
consultarConvenio(codMunicipio)24h
consultarRegimesEspeciais(codMunicipio, codServico, competencia)6h
consultarRetencoes(codMunicipio, competencia)6h

DANFSe

MétodoAssinatura
gerarDanfse(nfse: NFSe, options?: GerarDanfseOptions & { strategy?: 'auto' | 'online' | 'local' }) → Buffer
fetchDanfse(chaveAcesso: string) → Buffer

'auto' (default) tenta online e cai para local só em transientes (NetworkError/TimeoutError/ServerError); permission/404 propagam. fetchDanfse valida /^\d{50}$/ upfront.

Lifecycle

MétodoAssinatura
close() → void — libera dispatcher mTLS; idempotente

Após close(), qualquer método lança ClientClosedError.

NfseClientConfig

CampoTipoDefaultObrigatório para
ambienteAmbientesempre
certificadoCertificateInputsempre
emitenteEmitenteConfig?(reservado)
timeoutMsnumber?60_000
loggerLogger?noopLogger
dispatcherDispatcher?auto (undici Agent mTLS)testes com MockAgent
cepValidatorCepValidator?createViaCepValidator()override ViaCEP
retryStoreRetryStore?emitir/cancelar/substituir transientes
dpsCounterDpsCounter?emitir(params) sem nDPS explícito
parametrosCacheParametrosCache?createInMemoryParametrosCache()

Helpers standalone

Reexportados do pacote raiz; não precisam de NfseClient.

FunçãoAssinaturaPara quê
buildDps(params: BuildDpsParams) → DPSMonta DPS completa a partir de ~10 campos
buildDpsId(params: BuildDpsIdParams) → stringGera os 45 chars do infDPS.Id
buildDpsXml(dps: DPS, options?: BuildDpsXmlOptions) → stringSerializa DPS em XML (sem assinar)
signDpsXml(xml: string, cert: A1Certificate) → stringXMLDSig (RSA-SHA256 + exc-c14n + enveloped)
parseNfseXml(xml: string) → NFSeXML → DTO tipado
parseEventoXml(xml: string) → EventoProcessadoXML de evento → DTO tipado
validateDpsXml(xml: string, options?: ValidateDpsXmlOptions) → ValidateDpsXmlResult | voidXSD RTC v1.01 via libxml2 WASM
validateCnpj(cnpj: string) → voidFormato + DV; lança InvalidCnpjError
validateCpf(cpf: string) → voidFormato + DV; lança InvalidCpfError
createViaCepValidator(options?: ViaCepOptions) → CepValidatorViaCEP com cache em memória
createInMemoryDpsCounter(initial?: number) → DpsCounterCounter em memória (testes/demos)
createInMemoryRetryStore() → RetryStoreStore em memória (testes/demos)
createInMemoryParametrosCache() → ParametrosCacheCache em memória (default do client)
gerarDanfse(nfse: NFSe, options?: GerarDanfseOptions) → BufferPDF local (pdfkit + QR code)
fetchDanfse(httpClient: HttpClient, chaveAcesso: string) → BufferGET /danfse/{chave} raw (uso interno do cliente)
buildCancelamentoXml(params: BuildCancelamentoXmlParams, options?) → stringXML do pedRegEvento 101101
buildSubstituicaoXml(params: BuildSubstituicaoXmlParams, options?) → stringXML do pedRegEvento 105102
buildEventoPedidoId(params: BuildEventoPedidoIdParams) → stringinfPedReg.Id canônico
signPedRegEventoXml(xml: string, cert: A1Certificate) → stringXMLDSig para eventos
postEvento(httpClient, cert, chave, xml, options) → EventoResultPOST /nfse/{chave}/eventos raw
cancelar(httpClient, cert, params: CancelarParams) → CancelarResultImpl pura; use cliente.cancelar em app code
substituir(httpClient, cert, params: SubstituirParams) → SubstituirResultImpl pura; use cliente.substituir em app code
providerFromFile(path: string, password: string) → CertificateProviderProvider que lê .pfx do disco
collectCepsFromDps(dps: DPS) → readonly CollectedCep[]Extrai todos CEPs (debug, dashboards)
collectIdentifiersFromDps(dps: DPS) → readonly CollectedIdentifier[]Extrai CNPJs/CPFs (debug, dashboards)
defaultIsTransient(err: unknown) → booleanClassificação default de erro transiente

Fake (testing)

ts
import { NfseClientFake, type NfseClientLike } from 'open-nfse/testing';

Structurally compat com NfseClient via NfseClientLike. API de seeding documentada em Testando com o fake.

Interfaces pluggable

ts
interface DpsCounter {
  next(scope: { emitenteCnpj: string; serie: string }): Promise<string>;
}

interface RetryStore {
  save(entry: PendingEvent): Promise<void>;
  list(): Promise<readonly PendingEvent[]>;
  delete(id: string): Promise<void>;
}

interface ParametrosCache {
  get<T>(key: string): Promise<T | undefined>;
  set<T>(key: string, value: T, ttlMs: number): Promise<void>;
}

interface CepValidator {
  validate(cep: string): Promise<CepInfo>;
}

interface CertificateProvider {
  load(): Promise<A1Certificate>;
}

interface Logger {
  debug(msg: string, ctx?: LogContext): void;
  info(msg: string, ctx?: LogContext): void;
  warn(msg: string, ctx?: LogContext): void;
  error(msg: string, ctx?: LogContext): void;
}

Enums

Exportados da raiz. Usados como tipos nos DTOs e como valor quando se monta params manualmente.

EnumValores (amostra)
AmbienteProducao, ProducaoRestrita
TipoAmbienteProducao='1', Homologacao='2'
OpcaoSimplesNacionalNao, MeEpp, Mei, ...
RegimeEspecialTributacaoNenhum, Microempresa, ...
TipoEmitenteDpsPrestador='1', Tomador='2', Intermediario='3'
TipoAmbienteDpsProducao='1', Homologacao='2'
CST (PIS/COFINS)'00'...'09'
TipoRetISSQN, TipoTribISSQN, IndicadorTotalTributosflags numéricos string
JustificativaCancelamentoErroEmissao='1', ServicoNaoPrestado='2', Outros='9'
JustificativaSubstituicaoDesenquadramentoSN='01', EnquadramentoSN='02', ...
TipoEventoNfseCancelamento='101101', Substituicao='105102', ...
StatusDistribuicaoDocumentosLocalizados, NenhumDocumento, Rejeicao
TipoDocumento, TipoEventoenums de distribuição NSU

Lista completa no código-fonte: src/nfse/enums.ts + src/dfe/types.ts.

Erros

Todos herdam de OpenNfseError. Árvore e comportamento por método em Erros tipados.

ClasseQuando é lançado
NetworkErrorRede abaixo, DNS, socket fechado
TimeoutErrortimeoutMs excedido
UnauthorizedError (401)Certificado inválido ou não apresentado
ForbiddenError (403)CNPJ sem permissão
NotFoundError (404)Recurso inexistente (chave, etc.)
ServerError (5xx)Erro do lado da Receita
HttpStatusErrorBase genérica para status não mapeados
ExpiredCertificateErrorA1 vencido (detectado no load)
InvalidCertificateErrorA1 malformado / PKCS#12 corrompido
InvalidCertificatePasswordErrorSenha errada do .pfx
InvalidChaveAcessoErrorChave fora de /^\d{50}$/
InvalidXmlErrorXML estruturalmente inválido
XsdValidationErrorXSD RTC v1.01 violado; carrega violations[]
InvalidCepErrorFormato inválido / ViaCEP 404
InvalidCnpjError / InvalidCpfErrorDV incorreto ou formato
InvalidDpsIdParamErrorParams de buildDpsId fora do formato
InvalidEventoPedidoIdParamErrorParams de buildEventoPedidoId fora do formato
DpsAlreadySignedErrorTentativa de assinar um XML que já tem <Signature>
MissingRetryStoreErrorTransiente sem retryStore configurado
MissingDpsCounterErroremitir(params) sem params.nDPS e sem dpsCounter
ReceitaRejectionErrorHTTP 400 com body de rejeição; codigo, descricao, mensagens[]
ClientClosedErrorChamada após cliente.close()

Types principais

Todos os DTOs de domínio (RTC v1.01) em src/nfse/domain.ts são reexportados. Fluxos de resultado:

TipoVariantes / forma
NfseQueryResult{ chaveAcesso, xmlNfse, nfse: NFSe, tipoAmbiente, versaoAplicativo, dataHoraProcessamento }
NsuQueryResult{ status, documentos[], alertas[], erros[], ultimoNsu, ... }
NfseEmitResult{ chaveAcesso, idDps, xmlNfse, nfse, alertas[], ... }
EmitirResult (discriminated){ status: 'ok', nfse: NfseEmitResult } | { status: 'retry_pending', pending, error }
DpsDryRunResult{ dryRun: true, xmlDpsAssinado, xmlDpsGZipB64 }
EmitLoteResult{ items: EmitLoteItem[], successCount, failureCount, skippedCount }
CancelarResult (discriminated)'ok' | 'retry_pending'
SubstituirResult (discriminated)'ok' | 'retry_pending' | 'rolled_back' | 'rollback_pending'
ReplayItem'success' | 'success_emission' | 'still_pending' | 'failed_permanent'
PendingEvent (discriminated)kind: 'emission' | 'cancelamento_simples' | 'cancelamento_por_substituicao' | 'rollback_cancelamento'
ConsultaAliquotasResult, ConsultaBeneficioResult, ConsultaConvenioResult, ConsultaRegimesEspeciaisResult, ConsultaRetencoesResultparâmetros municipais normalizados

Types detalhados, incluindo RTC / IBS / CBS (RtcInfoTributosSitClas, RtcTotalIbs, etc.): API completa.

Licença MIT — biblioteca não oficial, sem vínculo com a Receita Federal.