Demonstração
O JSON que emite uma NFS-e.
Só os dados que mudam a cada nota. Emitente, certificado e configurações recorrentes ficam no portal e não viajam na requisição.
{ "identificacaoEmitente": "60670420000107", "enviarParaProducao": false, "notas": [{ "rps": { "numeroRPS": "99", "serie": "1", "dataEmissao": "2026-11-01" }, "destinatario": { "cpfCnpj": "11222333000181", "razaoSocial": "TESTES ALMZTECH", "endereco": { "codigoIBGEMunicipio": 2611606 } }, "servicos": [{ "codigo": "01.01", "descricao": "SERVICO TESTE", "quantidade": 1, "valorUnitario": 100 }], "condicoesPagamentos": [{ "condicao": "Parcelado em 2x", "pagamentos": [ { "parcela": 1, "valor": 50 }, { "parcela": 2, "valor": 50 } ] }] }] }
O que cada bloco carrega
| Bloco | Conteúdo |
|---|---|
| identificacaoEmitente | CNPJ de quem emite. O resto do cadastro já está no portal. |
| enviarParaProducao | Homologação ou produção, a cada envio. Homologação não consome a franquia do plano. |
| rps | Número, série e data de emissão da nota. Com a numeração automática ligada no emitente, o número é opcional. |
| destinatario | Dados do tomador do serviço, com o código IBGE do município. |
| servicos | Código do serviço, descrição, quantidade e valor unitário. |
| condicoesPagamentos | Opcional: condição e parcelas acordadas com o tomador. |
SDKs
O mesmo JSON, na linguagem do seu sistema.
SDKs oficiais em seis linguagens, com o mesmo contrato: emissão com acompanhamento do protocolo, consultas, cancelamento, XML e PDF, emitentes, webhooks e erros tipados. Nenhum tem dependência de runtime — só o HTTP e o JSON da própria plataforma.
| Linguagem | Requisito | Pacote | Versão | Registro | Código-fonte |
|---|---|---|---|---|---|
| .NET | .NET 8+ | Almztech.Sdk | 0.2.0-beta.2 | NuGet | GitHub |
| Node.js | Node 18+ · TypeScript | @almztech/sdk | 0.2.0-beta.1 | npm | GitHub |
| Python | Python 3.9+ | almztech-sdk | 0.2.0b1 | PyPI | GitHub |
| PHP | PHP 8.1+ | almztech/sdk | 0.2.0-beta.1 | Packagist | GitHub |
| Java | Java 11+ | br.com.almztech:almztech-sdk | 0.2.0-beta.1 | Maven Central | GitHub |
| Ruby | Ruby 3.0+ | almztech-sdk | 0.2.0.beta.1 | RubyGems | GitHub |
Todos estão em beta: a interface pública dos SDKs ainda pode mudar até a versão 1.0. O código é aberto, com licença MIT.
dotnet add package Almztech.Sdk --prerelease
using Almztech.Sdk;
using Almztech.Sdk.Models;
using var client = new AlmztechClient(apiKey);
var protocolo = await client.NotasFiscais.EmitirAsync(new RecepcaoLote
{
IdentificacaoEmitente = "60670420000107",
EnviarParaProducao = false, // homologação
Notas =
[
new NotaFiscalResumida
{
Rps = new IdentificacaoDaNota { NumeroRPS = "99", Serie = "1" },
Destinatario = new Destinatario
{
CpfCnpj = "11222333000181",
RazaoSocial = "TESTES ALMZTECH",
Endereco = new Endereco { CodigoIBGEMunicipio = 2611606 },
},
Servicos = [new Servico { Codigo = "01.01", Descricao = "SERVICO TESTE", ValorUnitario = 100m }],
},
],
});
// Espera a prefeitura (ou receba o resultado pelo webhook).
var resultado = await client.NotasFiscais.AguardarConclusaoAsync(protocolo.Protocolo);
var pdf = await client.NotasFiscais.BaixarPdfAsync(resultado.Notas![0].CodigoNota);
npm install @almztech/sdk@beta
import { AlmztechClient } from "@almztech/sdk";
const client = new AlmztechClient(process.env.ALMZTECH_API_KEY);
const protocolo = await client.notasFiscais.emitir({
identificacaoEmitente: "60670420000107",
enviarParaProducao: false, // homologação
notas: [{
rps: { numeroRPS: "99", serie: "1" },
destinatario: {
cpfCnpj: "11222333000181",
razaoSocial: "TESTES ALMZTECH",
endereco: { codigoIBGEMunicipio: 2611606 },
},
servicos: [{ codigo: "01.01", descricao: "SERVICO TESTE", quantidade: 1, valorUnitario: 100 }],
}],
});
// Espera a prefeitura (ou receba o resultado pelo webhook).
const resultado = await client.notasFiscais.aguardarConclusao(protocolo.protocolo);
const pdf = await client.notasFiscais.baixarPdf(resultado.notas[0].codigoNota);
pip install --pre almztech-sdk
import os from almztech import AlmztechClient client = AlmztechClient(os.environ["ALMZTECH_API_KEY"]) protocolo = client.notas_fiscais.emitir({ "identificacaoEmitente": "60670420000107", "enviarParaProducao": False, # homologação "notas": [{ "rps": {"numeroRPS": "99", "serie": "1"}, "destinatario": { "cpfCnpj": "11222333000181", "razaoSocial": "TESTES ALMZTECH", "endereco": {"codigoIBGEMunicipio": 2611606}, }, "servicos": [{"codigo": "01.01", "descricao": "SERVICO TESTE", "quantidade": 1, "valorUnitario": 100}], }], }) # Espera a prefeitura (ou receba o resultado pelo webhook). resultado = client.notas_fiscais.aguardar_conclusao(protocolo["protocolo"]) pdf = client.notas_fiscais.baixar_pdf(resultado["notas"][0]["codigoNota"])
composer require almztech/sdk:^0.2@beta
use Almztech\Sdk\AlmztechClient; $client = new AlmztechClient(getenv('ALMZTECH_API_KEY')); $protocolo = $client->notasFiscais->emitir([ 'identificacaoEmitente' => '60670420000107', 'enviarParaProducao' => false, // homologação 'notas' => [[ 'rps' => ['numeroRPS' => '99', 'serie' => '1'], 'destinatario' => [ 'cpfCnpj' => '11222333000181', 'razaoSocial' => 'TESTES ALMZTECH', 'endereco' => ['codigoIBGEMunicipio' => 2611606], ], 'servicos' => [['codigo' => '01.01', 'descricao' => 'SERVICO TESTE', 'quantidade' => 1, 'valorUnitario' => 100.0]], ]], ]); // Espera a prefeitura (ou receba o resultado pelo webhook). $resultado = $client->notasFiscais->aguardarConclusao($protocolo['protocolo']); $pdf = $client->notasFiscais->baixarPdf($resultado['notas'][0]['codigoNota']);
<dependency> <groupId>br.com.almztech</groupId> <artifactId>almztech-sdk</artifactId> <version>0.2.0-beta.1</version> </dependency>
AlmztechClient client = new AlmztechClient(System.getenv("ALMZTECH_API_KEY")); Servico servico = new Servico(); servico.codigo = "01.01"; servico.descricao = "SERVICO TESTE"; servico.valorUnitario = new BigDecimal("100.00"); NotaFiscalResumida nota = new NotaFiscalResumida(); nota.rps = new IdentificacaoDaNota(); nota.rps.numeroRPS = "99"; nota.rps.serie = "1"; nota.destinatario = new Destinatario(); nota.destinatario.cpfCnpj = "11222333000181"; nota.destinatario.razaoSocial = "TESTES ALMZTECH"; nota.destinatario.endereco = new Endereco(); nota.destinatario.endereco.codigoIBGEMunicipio = 2611606; nota.servicos = List.of(servico); RecepcaoLote lote = new RecepcaoLote(); lote.identificacaoEmitente = "60670420000107"; lote.enviarParaProducao = false; // homologação lote.notas = List.of(nota); ProtocoloResponse protocolo = client.notasFiscais().emitir(lote); // Espera a prefeitura (ou receba o resultado pelo webhook). ProtocoloResponse resultado = client.notasFiscais().aguardarConclusao(protocolo.protocolo); byte[] pdf = client.notasFiscais().baixarPdf(resultado.notas.get(0).codigoNota);
gem install almztech-sdk --pre
require "almztech" client = Almztech::Client.new(ENV.fetch("ALMZTECH_API_KEY")) protocolo = client.notas_fiscais.emitir( identificacaoEmitente: "60670420000107", enviarParaProducao: false, # homologação notas: [{ rps: { numeroRPS: "99", serie: "1" }, destinatario: { cpfCnpj: "11222333000181", razaoSocial: "TESTES ALMZTECH", endereco: { codigoIBGEMunicipio: 2_611_606 } }, servicos: [{ codigo: "01.01", descricao: "SERVICO TESTE", quantidade: 1, valorUnitario: 100.0 }] }] ) # Espera a prefeitura (ou receba o resultado pelo webhook). resultado = client.notas_fiscais.aguardar_conclusao(protocolo["protocolo"]) pdf = client.notas_fiscais.baixar_pdf(resultado["notas"][0]["codigoNota"])