SDKs
Official libraries for Node.js, Python, Go, PHP, Ruby, Rust, Java, Elixir and .NET.
Corvo has official SDKs in nine languages. They call the same API this documentation describes, with the same operations, field names and tax rules, so every guide here applies to all of them.
Install
| Language | Package | Install | Source |
|---|---|---|---|
| Node.js / TypeScript | corvo-nfse-node (npm) | npm install corvo-nfse-node | corvo-technology/corvo-nfse-node |
| Python | corvo-nfse (PyPI) | pip install corvo-nfse | corvo-technology/corvo-nfse-python |
| Go | github.com/corvo-technology/corvo-nfse-go (Go modules) | go get github.com/corvo-technology/corvo-nfse-go | corvo-technology/corvo-nfse-go |
| PHP | corvo-technology/corvo-nfse (Packagist) | composer require corvo-technology/corvo-nfse | corvo-technology/corvo-nfse-php |
| Ruby | corvo-nfse (RubyGems) | gem install corvo-nfse | corvo-technology/corvo-nfse-ruby |
| Rust | corvo-nfse (crates.io) | cargo add corvo-nfse | corvo-technology/corvo-nfse-rust |
| Java | tech.corvo:corvo-nfse (Maven Central) | implementation("tech.corvo:corvo-nfse:0.1.1") | corvo-technology/corvo-nfse-java |
| Elixir | corvo_nfse (Hex) | {:corvo_nfse, "~> 0.1.1"} | corvo-technology/corvo-nfse-elixir |
| .NET | Corvo.Nfse (NuGet) | dotnet add package Corvo.Nfse | corvo-technology/corvo-nfse-dotnet |
What every SDK does
- Authenticates with
X-API-Key. It readsCORVO_API_KEY, andCORVO_BASE_URLif you use a different API URL. - The key decides the environment:
corvo_test_...for test andcorvo_live_...for live. - Errors come back as a typed result with
code,status,requestId,detailsandretryAfter, not as an exception. The iterate helpers raise when a page fails. - Lists are cursor-paginated, and every SDK has an iterate helper that walks all pages.
- Creating an invoice and sending an email accept an idempotency key, sent as
Idempotency-Key. - Webhook signature verification (
X-Corvo-Signature) in constant time.
Issue an invoice
The same call in each language. Each example reads the key from CORVO_API_KEY and passes an idempotency key, so repeating the call never issues the invoice twice.
Node.js / TypeScript
import { Corvo } from "corvo-nfse-node";
const corvo = new Corvo(); // reads CORVO_API_KEY
const { data: invoice, error } = await corvo.invoices.create(
{
companyTaxId: "11222333000181",
service: { description: "Consultoria" },
amount: 450,
competenceDate: "2026-10-16",
},
{ idempotencyKey: "order-42" },
);Python
from corvo_nfse import Corvo
async with Corvo() as corvo: # reads CORVO_API_KEY
invoice, error = await corvo.invoices.create(
{
"companyTaxId": "11222333000181",
"service": {"description": "Consultoria"},
"amount": 450,
"competenceDate": "2026-10-16",
},
idempotency_key="order-42",
)Go
client := corvonfse.NewClient(corvonfse.Options{}) // reads CORVO_API_KEY
invoice, err := client.Invoices.Create(ctx, corvonfse.InvoiceCreateParams{
CompanyTaxID: "11222333000181",
Service: corvonfse.InvoiceServiceInput{Description: "Consultoria"},
Amount: 450,
CompetenceDate: "2026-10-16",
}, "order-42")PHP
$corvo = new \CorvoNfse\Client(); // reads CORVO_API_KEY
$result = $corvo->invoices->create([
'companyTaxId' => '11222333000181',
'service' => ['description' => 'Consultoria'],
'amount' => 450,
'competenceDate' => '2026-10-16',
], idempotencyKey: 'order-42');Ruby
client = CorvoNfse::Client.new # reads CORVO_API_KEY
invoice, error = client.invoices.create(
{
companyTaxId: "11222333000181",
service: { description: "Consultoria" },
amount: 450,
competenceDate: "2026-10-16"
},
idempotency_key: "order-42"
)Rust
let corvo = Corvo::from_env()?; // reads CORVO_API_KEY
let invoice = corvo
.invoices()
.create(
&InvoiceCreateParams {
company_tax_id: Some("11222333000181".into()),
service: InvoiceServiceInput {
description: Some("Consultoria".into()),
..Default::default()
},
amount: 450.0,
competence_date: "2026-10-16".into(),
..Default::default()
},
Some("order-42"),
)
.await?;Java
Corvo corvo = Corvo.builder().build(); // reads CORVO_API_KEY
InvoiceCreateParams params = InvoiceCreateParams.of(
null,
InvoiceCreateParams.Service.ofDescription("Consultoria"),
450.0,
"2026-10-16")
.withCompanyTaxId("11222333000181");
Result<Invoice> invoice = corvo.invoices().create(params, "order-42").join();Elixir
client = CorvoNfse.new() # reads CORVO_API_KEY
{:ok, invoice} =
CorvoNfse.Resources.Invoices.create(
client,
%{
"companyTaxId" => "11222333000181",
"service" => %{"description" => "Consultoria"},
"amount" => 450,
"competenceDate" => "2026-10-16"
},
idempotency_key: "order-42"
).NET
using var client = new CorvoClient(); // reads CORVO_API_KEY
var invoice = await client.Invoices.CreateAsync(
new InvoiceCreateParams
{
CompanyTaxId = "11222333000181",
Service = new InvoiceServiceInput { Description = "Consultoria" },
Amount = 450m,
CompetenceDate = "2026-10-16",
},
idempotencyKey: "order-42");Changing plans and the billing portal exist only in the dashboard, so they are not in the SDKs. The source of every SDK is in github.com/corvo-technology.