Quickstart
Da API Key à primeira NFS-e em menos de 5 minutos.
Crie sua conta e obtenha a API Key
Acesse o cadastro, envie seu certificado A1 e copie a API Key gerada — ela é exibida apenas uma vez.
Prefira testar primeiro? Use o sandbox público com a chave sk_test_sandbox_demo — sem cadastro.
Emita sua primeira nota
Faça um POST /v1/nfse. A API responde com 202 Accepted— o processamento na Receita Federal é assíncrono.
curl -X POST https://api.emitirnotafacil.com.br/v1/nfse \
-H "Authorization: Bearer sk_live_SUA_CHAVE" \
-H "Content-Type: application/json" \
-d '{
"servico": {
"codigo_nbs": "01.01.01.10",
"discriminacao": "Desenvolvimento de software",
"valor": 1500.00,
"aliquota_iss": 2.0
},
"tomador": {
"tipo": "PJ",
"documento": "12345678000190",
"razao_social": "Empresa Cliente LTDA",
"email": "financeiro@empresa.com"
},
"competencia": "2026-04",
"webhook_url": "https://seu-erp.com/webhooks/nfse"
}'Resposta esperada:
{
"nota_id": "550e8400-e29b-41d4-a716-446655440000",
"status": "PROCESSANDO",
"mensagem": "Nota enviada para processamento"
}Verifique o status
Consulte o status com o nota_id recebido. Em poucos segundos (ou minutos, dependendo da Receita) o status muda para AUTORIZADA.
curl https://api.emitirnotafacil.com.br/v1/nfse/NOTA_ID \ -H "Authorization: Bearer sk_live_SUA_CHAVE"
Quando autorizada:
{
"id": "550e8400-...",
"status": "AUTORIZADA",
"numero_nfse": "000123",
"codigo_verificacao": "ABC12345",
"emitida_em": "2026-04-26T14:30:00Z"
}Configure um webhook
Em vez de fazer polling, passe um webhook_url na emissão. A API entrega o resultado assim que a Receita responde. Valide a assinatura HMAC para garantir autenticidade:
import crypto from 'crypto'
function verifyWebhook(rawBody: string, signature: string, secret: string): boolean {
const expected = 'sha256=' + crypto
.createHmac('sha256', secret)
.update(rawBody)
.digest('hex')
return crypto.timingSafeEqual(Buffer.from(expected), Buffer.from(signature))
}
// No handler do webhook:
app.post('/webhooks/nfse', (req, res) => {
const sig = req.headers['x-nota-signature'] as string
const raw = req.rawBody // body cru (não parseado)
if (!verifyWebhook(raw, sig, process.env.WEBHOOK_SECRET!)) {
return res.status(401).send('Assinatura inválida')
}
const { event, nota_id, status } = req.body
console.log(`Nota ${nota_id}: ${event} → ${status}`)
res.sendStatus(200)
})Veja o guia completo em Webhooks →
Vá para produção
Troque a chave sk_test_ pela sk_live_ gerada no cadastro. A URL base é a mesma. Veja as diferenças em Ambientes →
docs/deploy-checklist.md no repositório.