nfe/client-nodejs/nfeio-node-sdk

Claude Code and agent skill by nfe/client-nodejs

Trust tier 2
  • community
LLM review pending
Source check pending

Checking that the SKILL.md file is still in the repository.

NFE.io Node.js SDK integration expert (package: nfe-io). MUST trigger when: code imports 'nfe-io' or references NfeClient; user mentions NFE.io, NFS-e, NF-e, CT-e, CF-e, CFe-SAT, nota fiscal, nota fiscal eletronica, Brazilian invoice, fiscal document, electronic invoice Brazil, CNPJ lookup, CPF lookup, service invoice, product invoice, transportation invoice, consumer invoice, tax calculation Brazilian taxes, SEFAZ, NFE API, emissao de nota, consulta CNPJ, consulta CPF, consulta CEP; user works…

Install

npx vskill@latest install nfe/client-nodejs/nfeio-node-sdk

SKILL.md

NFE.io Node.js SDK Integration Guide

This skill enables you to write correct, production-ready code using the NFE.io SDK for Brazilian electronic fiscal documents. The SDK covers NFS-e (service invoices), NF-e (product invoices), CT-e (transportation), CFe-SAT (consumer), CNPJ/CPF lookups, tax calculation, and more.

Package & Import

The npm package name is `nfe-io`. (Until 2026-09-02 the JSDoc examples imported from @nfe-io/sdk, a package that does not exist; corrected at the source.)

typescript
// ESM (recommended)
import { NfeClient } from 'nfe-io';
// CommonJS
const { NfeClient } = require('nfe-io');
// Default export (factory function)
import nfeFactory from 'nfe-io';
const nfe = nfeFactory({ apiKey: 'your-key' });

Requirements: Node.js 22+ (uses native fetch). Zero runtime dependencies.

Quick Start

typescript
import { NfeClient } from 'nfe-io';
const nfe = new NfeClient({
apiKey: 'your-api-key', // Required for most resources
environment: 'production', // 'production' | 'development'
timeout: 30000, // Request timeout in ms (default: 30000)
retryConfig: { // Optional retry configuration
maxRetries: 3, // Default: 3
baseDelay: 1000, // Default: 1000ms
maxDelay: 30000, // Default: 30000ms
backoffMultiplier: 2, // Default: 2
},
});

Two complementary API keys — not alternatives. Measured route by route (2026-10-14): the data key is rejected (403) on fiscal-document routes (NF-e, NFC-e, NFS-e, inbound documents, tax codes and calculation), and the main key is rejected (403) on the lookup hosts. Some account-registry routes also accept the data key; that is not a documented contract and the SDK does not rely on it.

  • `apiKey` (main) → FISCAL hosts: api.nfe.io, api.nfse.io. Covers every emission

resource plus certificates, municipalTaxes, stateTaxes, taxCodes and taxCalculation.

  • `dataApiKey` → LOOKUP hosts: nfe.api.nfe.io, legalentity, naturalperson,

address. Covers addresses, legalEntityLookup, naturalPersonLookup, productInvoiceQuery and consumerInvoiceQuery.

The SDK falls back from dataApiKey to apiKey when the former is absent — a convenience for accounts holding one key with both scopes, not a sign that one replaces the other.

typescript
const nfe = new NfeClient({
apiKey: process.env.NFE_API_KEY,
dataApiKey: process.env.NFE_DATA_API_KEY, // Optional, falls back to apiKey
});

From environment variable:

typescript
import { createClientFromEnv } from 'nfe-io';
// Reads NFE_API_KEY env var
const nfe = createClientFromEnv('production');

Resource Map

All resources are lazy-initialized via property getters on NfeClient. No resource is instantiated until first access.

AccessorResourceAPI HostScopeKey Operations
nfe.serviceInvoicesNFS-e Service Invoicesapi.nfe.ioCompanycreate, createAndWait, list, retrieve, retrieveByExternalId, cancel, cancelAndWait, sendEmail, downloadPdf/Xml
nfe.serviceInvoicesRtcNFS-e RTC (Reforma Tributária)api.nfe.ioCompanycreate, createAndWait, retrieve, downloadCancellationXml (leiaute IBS/CBS; RTC selecionado pelo payload)
nfe.companiesCompaniesapi.nfe.ioGlobalCRUD, exists, uploadCertificate, findByTaxNumber, listAll, listIterator
nfe.legalPeopleLegal People (PJ)api.nfe.ioCompanyCRUD, createBatch, findByTaxNumber
nfe.naturalPeopleNatural People (PF)api.nfe.ioCompanyCRUD, createBatch, findByTaxNumber
nfe.webhooksWebhooksapi.nfe.io (v2 p/ conta)Company + Accountcompany CRUD, validateSignature; conta: listAccountWebhooks/create/retrieve/update/delete, deleteAllAccountWebhooks, pingAccountWebhook, fetchEventTypes
nfe.notificationsNotificationsapi.nfe.ioCompanylist, retrieve, delete, sendEmail
nfe.addressesAddress Lookupaddress.api.nfe.ioGloballookupByPostalCode (só CEP; busca/termo não existem na API real)
nfe.productInvoicesNF-e Product Invoicesapi.nfse.ioCompanycreate, list (requer environment), retrieve, cancel, downloadPdf/Xml, sendCorrectionLetter
nfe.productInvoicesRtcNF-e/NFC-e RTCapi.nfse.ioCompanycreate (webhook-driven; IBS/CBS/IS)
nfe.consumerInvoicesNFC-e Consumer Invoicesapi.nfse.ioCompanycreate (webhook-driven), list (requer environment), retrieve, cancel, getItems, getEvents, downloadPdf/Xml/Rejection, disable
nfe.stateTaxesState Tax (IE)api.nfse.ioCompanyCRUD, switchAuthorizer (pré-requisito p/ NF-e)
nfe.municipalTaxesMunicipal Tax (IM)api.nfse.ioCompanyCRUD (pré-requisito p/ NFS-e). ⚠️ updatePrefecture e getSeries estão depreciados: a plataforma não serve essas rotas
nfe.certificatesCertificates (por thumbprint)api.nfse.ioCompanylist, getByThumbprint, deleteByThumbprint (+ variantes v1)
nfe.taxCalculationTax Engineapi.nfse.ioTenantcalculate (ICMS, PIS, COFINS, IPI, II)
nfe.taxCodesTax Code Referenceapi.nfse.ioGloballistOperationCodes, listAcquisitionPurposes, listIssuer/RecipientTaxProfiles
nfe.transportationInvoicesCT-e Transportapi.nfse.ioCompanyenable/disable, retrieve, downloadXml
nfe.inboundProductInvoicesInbound NF-eapi.nfse.ioCompanyenableAutoFetch, getDetails, downloadXml/Pdf, manifest
nfe.productInvoiceQueryNF-e Query (SEFAZ)nfe.api.nfe.ioGlobalretrieve, downloadPdf/Xml, listEvents
nfe.consumerInvoiceQueryCFe-SAT Querynfe.api.nfe.ioGlobal⚠️ depreciado — a plataforma não serve /v1/consumerinvoices/coupon; ambos os métodos respondem 404
nfe.legalEntityLookupCNPJ Lookuplegalentity.api.nfe.ioGlobalgetBasicInfo, getStateTaxInfo, getStateTaxForInvoice
nfe.naturalPersonLookupCPF Lookupnaturalperson.api.nfe.ioGlobalgetStatus

Company-scoped resources require companyId as the first parameter in every method. Global resources operate without company context.

Core Pattern: Company-Scoped Operations

Most resources are scoped to a company. The pattern is always resource.method(companyId, ...):

typescript
// List service invoices for a company
const invoices = await nfe.serviceInvoices.list('company-uuid', {
pageIndex: 1, // pagination is 1-based (the API rejects 0)
pageCount: 50,
});
// Create a legal person under a company
const person = await nfe.legalPeople.create('company-uuid', {
federalTaxNumber: '11444555000149', // String for people resources
name: 'Example Company Ltda',
email: 'contact@example.com',
});

Core Pattern: Async Invoice Processing (Critical)

Service invoice creation can return either an immediate result (201) or an async pending result (202), depending on the municipality. The SDK uses a discriminated union return type:

typescript
// WRONG: assuming create() returns an invoice directly
const invoice = await nfe.serviceInvoices.create(companyId, data); // This is a union type!
// CORRECT: handling both cases explicitly
const result = await nfe.serviceInvoices.create(companyId, data);
if (result.status === 'immediate') {
console.log('Invoice issued:', result.invoice.id);
} else if (result.status === 'async') {
console.log('Processing...', result.response.invoiceId);
// Need to poll for completion
}

Recommended: Use `createAndWait()` — handles polling automatically:

typescript
const invoice = await nfe.serviceInvoices.createAndWait(companyId, {
cityServiceCode: '2690',
description: 'IT Consulting Services',
servicesAmount: 1500.00,
borrower: {
federalTaxNumber: 11444555000149,
name: 'Client Company',
email: 'client@example.com',
},
}, {
timeout: 300000, // 5 min (some municipalities are slow)
initialDelay: 1000, // 1s before first poll
maxDelay: 10000, // Max 10s between polls
backoffFactor: 1.5, // Exponential backoff
onPoll: (attempt, flowStatus) => {
console.log(`Poll #${attempt}: ${flowStatus}`);
},
});
console.log('Invoice status:', invoice.flowStatus); // 'Issued' | 'IssueFailed'

Terminal FlowStatus values: Issued, IssueFailed, Cancelled, CancelFailed Non-terminal (still processing): WaitingSend, WaitingReturn, WaitingDownload, WaitingCalculateTaxes, WaitingDefineRpsNumber, WaitingSendCancel, PullFromCityHall

Core Pattern: Error Handling

The SDK provides a rich error hierarchy. Every error extends NfeError:

Error ClassHTTP StatusWhen Thrown
AuthenticationError401Invalid or missing API key
ValidationError400/422Invalid request data
NotFoundError404Resource doesn't exist
ConflictError409Duplicate or conflict
RateLimitError429Too many requests
ServerError5xxServer-side failures
ConnectionError—Network/DNS failures
TimeoutError—Request timeout
ConfigurationError—Invalid SDK configuration
PollingTimeoutError—Polling exceeded timeout
InvoiceProcessingError—Invoice processing failed
typescript
import {
NfeError, AuthenticationError, ValidationError,
NotFoundError, RateLimitError, TimeoutError,
PollingTimeoutError, isNfeError, isValidationError,
} from 'nfe-io';
try {
const invoice = await nfe.serviceInvoices.createAndWait(companyId, data);
} catch (error) {
if (error instanceof AuthenticationError) {
console.error('Check your API key');
} else if (error instanceof ValidationError) {
console.error('Invalid data:', error.details);
} else if (error instanceof PollingTimeoutError) {
console.error('Invoice still processing after timeout');
} else if (isNfeError(error)) {
console.error(`${error.type} [${error.statusCode}]: ${error.message}`);
console.error('Details:', error.details);
}
}

All error objects have: message, type, code/status/statusCode, details, raw, toJSON().

Core Pattern: Pagination

The SDK uses two different pagination styles, and the response shape varies by resource:

Offset-based (service invoices, companies, people, webhooks) — 1-based: the first page is pageIndex: 1; the API rejects pageIndex: 0 with a validation error (confirmed live for companies and service invoices):

typescript
// Service invoices return { serviceInvoices, totalResults, totalPages, page }
const page = await nfe.serviceInvoices.list(companyId, {
pageIndex: 1, // 1-based page number (first page = 1)
pageCount: 50, // Items per page
});
page.serviceInvoices; // ServiceInvoiceData[]
page.totalResults; // number
page.totalPages; // number
// Companies, people and webhooks return the generic ListResponse<T>
const companies = await nfe.companies.list({ pageIndex: 1, pageCount: 50 });
companies.data; // Company[]
companies.totalCount; // number | undefined
companies.page; // { pageIndex, pageCount } — pageIndex is 1-based as of v5.2.0
⚠️ Version note: in nfe-io ≤ 5.1.x, companies.list() subtracted 1 from the response
(page.pageIndex came back 0-based) and listAll()/listIterator() started at page 0 —
which the API rejects, so auto-pagination (and findByTaxNumber/findByName/
getCompaniesWithCertificates/getCompaniesWithExpiringCertificates) failed on the first
call. Fixed in v5.2.0: 1-based on both request and response. The request was ALWAYS 1-based
on the wire — never send pageIndex: 0 regardless of SDK version.

This is the start of the file. Read the full SKILL.md on GitHub.

Security

  • Security scanPassed, 100 of 100Pattern checks on the skill's files.
  • Model reviewNot runA model review is scheduled for the next rescan.

Quality evaluation

  • Task evaluationNot runNo evaluation yet. Run one in Skill Studio.

Source

Popularity

Repository stars
139
Repository forks
29
7-day trend score
0

Stars and forks are for the whole GitHub repository, not this skill alone. Not refreshed yet.

Works with

Any agent vskill installs to: 56 targets in all. These 39 have a page on this site.

  • Claude Code
  • Cursor
  • GitHub Copilot
  • Windsurf
  • Codex
  • Gemini CLI
  • Cline
  • Amp
  • Roo Code
  • Goose
  • Continue
  • Kilo Code
  • Junie
  • Trae
  • OpenHands
  • Qwen Code
  • AI Agent
  • Tabnine Chat
  • Sourcegraph Cody
  • Amazon Q
  • Firebase Genkit
  • Sweep
  • Devin
  • Phind
  • Mentat
  • Claude Desktop
  • Aider
  • GPT Pilot
  • Plandex
  • bolt.new
  • v0
  • Replit Agent
  • Anse
  • TypingMind
  • BetterChatGPT
  • LibreChat
  • Warp AI
  • Pieces
  • Fig AI
Embed badge
vskill VERIFIED badge
[![vskill VERIFIED](https://verified-skill.com/api/v1/skills/nfe/client-nodejs/nfeio-node-sdk/badge)](https://verified-skill.com/skills/nfe/client-nodejs/nfeio-node-sdk)

Something wrong with this skill or its page? Tell us.