Issue NF-e
Product invoice issuance — items, tax classification, and real SEFAZ transmission.
NF-e (Nota Fiscal Eletrônica) is the electronic invoice used for the sale of physical goods in Brazil. Each item needs a description, amount, and Brazil-specific tax classification — NCM and CFOP codes at minimum — since NF-e's authorizer (SEFAZ) validates tax classification, not just totals.
NF-e requires a full recipient_address for the buyer — street, number, neighborhood, city, state, zip_code, and the city_code (IBGE municipality code). The state inside it is what decides whether the document goes out as an interstate or an internal operation (idDest), without the integration having to flag that separately.
Every issued NF-e returns an access key you can use to consult its authorization status or cancel it later, and the dashboard keeps the full submission history, including the authorizer's raw rejection reason if it's ever rejected.
Tax fields don't have to be computed by hand: ICMS, IPI, PIS, and COFINS are broken out automatically per item once the classification codes are set, and optional groups — CEST, NVE codes, presumed credits, import content control numbers — cover the less common cases without becoming required fields for everyone else.
A used-movable-asset flag, purchase order references, freight/insurance/discount/other-expenses amounts, and a manufacturer CNPJ are all supported per item when the sale needs them — none are required for a straightforward retail sale, so the common case stays a handful of fields.
The SDKs mirror this 1:1: a Product in Python or Go carries the same fields as the raw API's product.br group, so moving from prototyping against the REST API to a typed SDK later doesn't change what data you're already sending.
Rejections come back with the authorizer's own error text, not a generic "invalid request" — a wrong NCM or a CFOP that doesn't match the operation type is exactly the kind of thing SEFAZ's own validation catches, and stackin surfaces that message directly instead of masking it.
See NF-e issuance for how that API surface fits into the rest of stackin.