Codout.Apis.ContaAzul 2.3.0

dotnet add package Codout.Apis.ContaAzul --version 2.3.0
                    
NuGet\Install-Package Codout.Apis.ContaAzul -Version 2.3.0
                    
This command is intended to be used within the Package Manager Console in Visual Studio, as it uses the NuGet module's version of Install-Package.
<PackageReference Include="Codout.Apis.ContaAzul" Version="2.3.0" />
                    
For projects that support PackageReference, copy this XML node into the project file to reference the package.
<PackageVersion Include="Codout.Apis.ContaAzul" Version="2.3.0" />
                    
Directory.Packages.props
<PackageReference Include="Codout.Apis.ContaAzul" />
                    
Project file
For projects that support Central Package Management (CPM), copy this XML node into the solution Directory.Packages.props file to version the package.
paket add Codout.Apis.ContaAzul --version 2.3.0
                    
#r "nuget: Codout.Apis.ContaAzul, 2.3.0"
                    
#r directive can be used in F# Interactive and Polyglot Notebooks. Copy this into the interactive tool or source code of the script to reference the package.
#:package Codout.Apis.ContaAzul@2.3.0
                    
#:package directive can be used in C# file-based apps starting in .NET 10 preview 4. Copy this into a .cs file before any lines of code to reference the package.
#addin nuget:?package=Codout.Apis.ContaAzul&version=2.3.0
                    
Install as a Cake Addin
#tool nuget:?package=Codout.Apis.ContaAzul&version=2.3.0
                    
Install as a Cake Tool

Codout.Apis.ContaAzul

Biblioteca .NET para integrar com a API v2 do Conta Azul, o ERP de gestao financeira e contabil para pequenas empresas.

Fornece classes fortemente tipadas em C# para autenticacao OAuth2, clientes, produtos, vendas, servicos, financeiro, notas fiscais, contratos e mais, com filtros de query string tipados para todos os endpoints de listagem.

Indice

Instalacao

Via NuGet Package Manager:

Install-Package Codout.Apis.ContaAzul

Via .NET CLI:

dotnet add package Codout.Apis.ContaAzul

Inicio Rapido

using Codout.Apis.ContaAzul.Api;
using Codout.Apis.ContaAzul.Models;
using Codout.Apis.ContaAzul.Models.Enums;
using Codout.Apis.ContaAzul.Models.Filters;
using Codout.Apis.ContaAzul.Models.Request;

// 1. Obter token de acesso
var authApi = new AuthorizationApi();
var token = await authApi.GetToken(
    username: "seu-client-id",
    password: "seu-client-secret",
    redirectUri: "https://sua-app.com/callback",
    code: "codigo-de-autorizacao"
);

// 2. Listar clientes com filtros tipados
var customerApi = new CustomerApi();
var customers = await customerApi.GetAsync(token.AccessToken, new PersonFilter
{
    Page = 1,
    PageSize = 50,
    ProfileType = ProfileType.Customer,
    SortField = PersonSortField.Name,
    SortDirection = SortDirection.Ascending
});

// 3. Criar um produto
var productApi = new ProductApi();
var product = await productApi.CreateAsync(new CreateProductRequest
{
    Name = "Camiseta Basica",
    SkuCode = "CAM-001",
    Stock = new CreateProductStock { SalePrice = 49.90m }
}, token.AccessToken);

// 4. Criar uma venda
var saleApi = new SaleApi();
var sale = await saleApi.CreateAsync(new CreateSaleRequest
{
    ClientId = "uuid-do-cliente",
    SaleDate = "2026-02-11",
    Items = new List<CreateSaleItemRequest>
    {
        new() { Description = "Camiseta Basica", Quantity = 2, Value = 49.90m }
    },
    PaymentCondition = new CreateSalePaymentConditionRequest
    {
        PaymentType = "A_VISTA",
        FinancialAccountId = "uuid-da-conta"
    }
}, token.AccessToken);

Autenticacao

A biblioteca utiliza OAuth2 com o servidor de autorizacao do Conta Azul.

Obter Token (Authorization Code)

var authApi = new AuthorizationApi();

// Trocar o authorization code por um access token
var token = await authApi.GetToken(
    username: "client-id",       // Client ID da sua aplicacao
    password: "client-secret",   // Client Secret da sua aplicacao
    redirectUri: "https://sua-app.com/callback",
    code: "authorization-code"   // Codigo recebido no callback
);

// token.AccessToken  -> Token para chamadas de API
// token.RefreshToken -> Token para renovar o acesso
// token.ExpiresIn    -> Tempo de expiracao em segundos

Renovar Token (Refresh Token)

var newToken = await authApi.RefreshToken(
    clientId: "client-id",
    clientSecret: "client-secret",
    refreshToken: token.RefreshToken
);

URLs de autenticacao:

  • Servidor de autorizacao: https://auth.contaazul.com/oauth2/token
  • API base: https://api-v2.contaazul.com

Filtros Tipados

Todos os endpoints de listagem e busca aceitam filtros fortemente tipados, proporcionando IntelliSense, seguranca em tempo de compilacao e documentacao inline.

Infraestrutura

Classe Descricao
FilterBase Classe base abstrata com ToQueryString() que converte propriedades [QueryParam] em query string
PaginatedFilter Extends FilterBase com Page (pagina) e PageSize (tamanho_pagina)
TextSearchFilter Extends PaginatedFilter com TextSearch (busca_textual)
QueryParamAttribute Atributo que mapeia propriedade C# para nome do parametro na API

Exemplo de uso

// Antes (string - propenso a erros, sem autocomplete)
var result = await customerApi.GetAsync(token, "pagina=1&tamanho_pagina=20&busca=acme");

// Depois (tipado - com IntelliSense e validacao em tempo de compilacao)
var result = await customerApi.GetAsync(token, new PersonFilter
{
    Page = 1,
    PageSize = 20,
    Search = "acme"
});

Filtros com parametros obrigatorios

Alguns filtros exigem parametros via construtor:

// Notas fiscais exigem data inicial e final
var filter = new InvoiceFilter("2026-01-01", "2026-12-31")
{
    Page = 1,
    PageSize = 50,
    RecipientDocument = "12345678000190"
};

// Contas a receber exigem datas de vencimento
var filter = new ReceivableFilter("2026-01-01", "2026-06-30")
{
    Statuses = new() { FinancialEventStatus.Open, FinancialEventStatus.Overdue },
    Page = 1,
    PageSize = 100
};

Filtros disponiveis

Filtro Endpoint Base Parametros obrigatorios
PersonFilter GET /v1/pessoas PaginatedFilter -
ProductFilter GET /v1/produtos PaginatedFilter -
SaleSearchFilter GET /v1/venda/busca PaginatedFilter -
SaleItemFilter GET /v1/venda/{id}/itens PaginatedFilter -
ServiceFilter GET /v1/servicos TextSearchFilter -
ProductCategoryFilter GET /v1/produtos/categorias TextSearchFilter -
NcmFilter GET /v1/produtos/ncm TextSearchFilter -
CestFilter GET /v1/produtos/cest TextSearchFilter -
UnitOfMeasureFilter GET /v1/produtos/unidades-medida TextSearchFilter -
EcommerceBrandFilter GET /v1/produtos/ecommerce-marcas PaginatedFilter -
EcommerceCategoryFilter GET /v1/produtos/ecommerce-categorias FilterBase -
InvoiceFilter GET /v1/notas-fiscais PaginatedFilter startDate, endDate
ServiceInvoiceFilter GET /v1/notas-fiscais-servico PaginatedFilter competencyDateFrom, competencyDateUntil
ContractFilter GET /v1/contratos PaginatedFilter startDate, endDate
CostCenterFilter GET /v1/centro-de-custo PaginatedFilter -
FinancialAccountFilter GET /v1/conta-financeira PaginatedFilter -
FinancialCategoryFilter GET /v1/categorias PaginatedFilter -
ReceivableFilter GET /v1/.../contas-a-receber/buscar PaginatedFilter dueDateFrom, dueDateUntil
PayableFilter GET /v1/.../contas-a-pagar/buscar PaginatedFilter dueDateFrom, dueDateUntil

APIs Disponiveis

Clientes (CustomerApi)

Gerenciamento completo de pessoas (clientes, fornecedores, transportadoras).

Endpoint base: /v1/pessoas

var api = new CustomerApi();

// Listar com filtros tipados
var result = await api.GetAsync(token, new PersonFilter
{
    Page = 1,
    PageSize = 25,
    Search = "joao",
    ProfileType = ProfileType.Customer,
    SortField = PersonSortField.Name,
    SortDirection = SortDirection.Ascending,
    WithAddress = true
});
// result.Items     -> Lista de PersonSummary
// result.Pagination -> Informacoes de paginacao

// Filtrar por datas de criacao
var recent = await api.GetAsync(token, new PersonFilter
{
    CreationDateStart = "2026-01-01T00:00:00",
    CreationDateEnd = "2026-02-11T23:59:59"
});

// Buscar por ID
var person = await api.GetByIdAsync("uuid", token);

// Buscar por ID legado (migracao v1 -> v2)
var person = await api.GetByLegacyIdAsync("12345", token);

// Criar pessoa
var created = await api.CreateAsync(new CreatePersonRequest
{
    Name = "Joao da Silva",
    PersonType = PersonType.Physical,
    Email = "joao@email.com",
    Code = "CLI-001",
    MobilePhone = "11999999999",
    Profiles = new List<Profile> { new() { ProfileType = ProfileType.Customer } }
}, token);

// Atualizar pessoa (PUT - substituicao total)
await api.UpdateAsync(new UpdatePersonRequest { /* ... */ }, "uuid", token);

// Atualizar parcialmente (PATCH)
await api.PatchAsync(new PatchPersonRequest { Name = "Novo Nome" }, "uuid", token);

// Operacoes em lote
await api.ActivateAsync(new BatchUuidsRequest { Uuids = new() { "uuid1", "uuid2" } }, token);
await api.DeactivateAsync(new BatchUuidsRequest { Uuids = new() { "uuid1" } }, token);
await api.DeleteBatchAsync(new BatchUuidsRequest { Uuids = new() { "uuid1" } }, token);

Produtos (ProductApi)

CRUD de produtos com suporte a categorias, estoque, informacoes fiscais, kits e variacoes.

Endpoint base: /v1/produtos

var api = new ProductApi();

// Listar produtos com filtros tipados
var products = await api.GetAsync(token, new ProductFilter
{
    Page = 1,
    PageSize = 50,
    Search = "notebook",
    Status = ProductStatus.Active,
    SortField = ProductSortField.Name,
    SortDirection = SortDirection.Ascending,
    SalePriceFrom = 100.00,
    SalePriceTo = 5000.00
});

// Buscar produto por ID
var product = await api.GetByIdAsync("uuid", token);

// Criar produto completo
var created = await api.CreateAsync(new CreateProductRequest
{
    Name = "Notebook Pro",
    SkuCode = "NB-PRO-001",
    EanCode = "7891234567890",
    Format = ProductFormat.Simple,
    Active = true,
    Stock = new CreateProductStock
    {
        SalePrice = 4999.90m,
        AverageCost = 3500.00m,
        AvailableStock = 50,
        MinimumStock = 5,
        MaximumStock = 100
    },
    Fiscal = new CreateProductFiscal
    {
        Origin = ProductOrigin.Domestic,
        ProductType = FiscalProductType.MerchandiseForResale
    }
}, token);

// Atualizar produto (PATCH)
await api.PatchAsync(new UpdateProductRequest { SalePrice = 4499.90m }, "uuid", token);

// Excluir produtos em lote
await api.DeleteBatchAsync(new { ids = new[] { "uuid1", "uuid2" } }, token);

// Consultar categorias de produtos
var categories = await api.GetCategoriesAsync(token, new ProductCategoryFilter
{
    TextSearch = "eletronicos"
});

// Consultar NCMs (classificacao fiscal)
var ncms = await api.GetNcmsAsync(token, new NcmFilter { TextSearch = "8471" });

// Consultar CESTs
var cests = await api.GetCestsAsync(token, new CestFilter { TextSearch = "28" });

// Consultar unidades de medida
var units = await api.GetUnitsAsync(token, new UnitOfMeasureFilter());

// Consultar marcas de e-commerce
var brands = await api.GetEcommerceBrandsAsync(token, new EcommerceBrandFilter
{
    TextSearch = "samsung",
    Direction = SortDirection.Ascending
});

// Consultar categorias de e-commerce
var ecCategories = await api.GetEcommerceCategoriesAsync(token, new EcommerceCategoryFilter
{
    TextSearch = "celulares"
});

Vendas (SaleApi)

Gestao completa de vendas com suporte a PDF, itens paginados e vendedores.

Endpoint base: /v1/venda

var api = new SaleApi();

// Buscar vendas com filtros tipados
var search = await api.SearchAsync(token, new SaleSearchFilter
{
    Page = 1,
    PageSize = 25,
    StartDate = "2026-01-01",
    EndDate = "2026-12-31",
    AscendingSortField = SaleSortField.Date,
    Totals = SaleTotalType.Approved
});
// search.Items     -> Lista de SaleSearchItem
// search.Totals    -> Totais agregados

// Buscar venda por ID
var sale = await api.GetByIdAsync("uuid", token);

// Criar venda
var created = await api.CreateAsync(new CreateSaleRequest
{
    ClientId = "uuid-cliente",
    Number = 1001,
    SaleDate = "2026-02-11",
    Items = new List<CreateSaleItemRequest>
    {
        new() { Description = "Produto A", Quantity = 2, Value = 150.00m },
        new() { Description = "Servico B", Quantity = 1, Value = 200.00m }
    },
    PaymentCondition = new CreateSalePaymentConditionRequest
    {
        PaymentType = "A_VISTA",
        FinancialAccountId = "uuid-conta"
    }
}, token);

// Atualizar venda
await api.UpdateAsync(new UpdateSaleRequest { /* ... */ }, "uuid", token);

// Excluir vendas em lote (max 10 por request)
await api.DeleteBatchAsync(new BatchDeleteSaleRequest
{
    Ids = new() { "uuid1", "uuid2" }
}, token);

// Gerar PDF da venda
using var pdfStream = await api.GetPDFAsync("uuid", token);

// Listar itens da venda (paginado)
var items = await api.GetItemsAsync("uuid", token, new SaleItemFilter
{
    Page = 1,
    PageSize = 50
});
// items.Items      -> Lista de SaleItem
// items.TotalItems -> Total de itens
// items.Totals     -> Contagem por tipo (produtos, servicos, nao conciliados)

// Listar vendedores
var sellers = await api.GetSellersAsync(token);

Servicos (ServiceApi)

CRUD de servicos com classificacao fiscal.

Endpoint base: /v1/servicos

var api = new ServiceApi();

// Listar servicos com filtro
var services = await api.GetAsync(token, new ServiceFilter
{
    Page = 1,
    TextSearch = "consultoria"
});

// Buscar servico por ID
var service = await api.GetByIdAsync("uuid", token);

// Criar servico
var created = await api.CreateAsync(new CreateServiceRequest
{
    Code = "SRV-001",
    Description = "Consultoria em TI",
    Price = 250.00m,
    Cost = 100.00m,
    ServiceType = ServiceType.Provided,
    Status = ServiceStatus.Active
}, token);

// Atualizar servico (PATCH)
await api.PatchAsync(new UpdateServiceRequest { Price = 300.00m }, "uuid", token);

// Excluir servicos em lote
await api.DeleteBatchAsync(new { ids = new[] { "uuid1" } }, token);

Categorias (CategoryApi)

Consulta de categorias de produtos (somente leitura).

Endpoint base: /v1/produtos/categorias

var api = new CategoryApi();

// Listar todas as categorias com filtro
var categories = await api.GetAsync(token, new ProductCategoryFilter
{
    TextSearch = "roupas"
});

// Buscar categoria por ID
var category = await api.GetByIdAsync("uuid", token);

Financeiro (FinancialApi)

Gestao de centros de custo, categorias financeiras, contas financeiras, lancamentos e busca de contas a receber/pagar.

Endpoint base: /v1

var api = new FinancialApi();

// --- Centros de Custo ---
var costCenters = await api.GetCostCentersAsync(token, new CostCenterFilter
{
    Search = "TI",
    QuickFilter = QuickFilterType.Active,
    AscendingSortField = CostCenterSortField.Name
});

var newCenter = await api.CreateCostCenterAsync(new CreateCostCenterRequest
{
    Code = "CC-001",
    Name = "Departamento de TI"
}, token);

// --- Categorias Financeiras ---
var categories = await api.GetCategoriesAsync(token, new FinancialCategoryFilter
{
    Search = "receita",
    Type = "RECEITA",
    ChildrenOnly = true
});

// --- Categorias DRE (Demonstrativo de Resultado) ---
var dreCategories = await api.GetDreCategoriesAsync(token);

// --- Contas Financeiras ---
var accounts = await api.GetFinancialAccountsAsync(token, new FinancialAccountFilter
{
    ActiveOnly = true,
    Types = new() { "CONTA_CORRENTE", "POUPANCA" }
});

var balance = await api.GetAccountBalanceAsync("uuid-conta", token);

// --- Contas a Pagar ---
var payable = await api.CreatePayableAsync(new CreateFinancialEventRequest
{
    PersonId = "uuid-fornecedor",
    CategoryId = "uuid-categoria",
    Description = "Compra de material",
    CompetenceDate = "2026-02-11",
    Installments = new List<InstallmentItemRequest>
    {
        new()
        {
            Number = 1,
            Value = 500.00m,
            DueDate = "2026-03-11",
            FinancialAccountId = "uuid-conta",
            PaymentMethod = PaymentMethod.BankSlip
        }
    }
}, token);

// --- Contas a Receber ---
var receivable = await api.CreateReceivableAsync(new CreateFinancialEventRequest
{
    PersonId = "uuid-cliente",
    CategoryId = "uuid-categoria",
    Description = "Venda de servico",
    CompetenceDate = "2026-02-11",
    Installments = new List<InstallmentItemRequest>
    {
        new() { Number = 1, Value = 1000.00m, DueDate = "2026-03-11" }
    }
}, token);

// --- Busca de Contas a Receber ---
var receivables = await api.SearchReceivablesAsync(token, new ReceivableFilter("2026-01-01", "2026-12-31")
{
    Page = 1,
    PageSize = 50,
    Statuses = new() { FinancialEventStatus.Open, FinancialEventStatus.Overdue },
    ValueFrom = "100.00",
    ValueUntil = "10000.00"
});
// receivables.Items      -> Lista de FinancialEventSearchItem
// receivables.TotalItems -> Total de registros
// receivables.Totals     -> Contagem (ativo, inativo, todos)

// --- Busca de Contas a Pagar ---
var payables = await api.SearchPayablesAsync(token, new PayableFilter("2026-01-01", "2026-06-30")
{
    Page = 1,
    PageSize = 50,
    Statuses = new() { FinancialEventStatus.Open }
});

// --- Parcelas ---
var installments = await api.GetInstallmentsByEventAsync("uuid-evento", token);
var installment = await api.GetInstallmentByIdAsync("uuid-parcela", token);

Baixas (AcquittanceApi)

Registro e acompanhamento de pagamentos/recebimentos vinculados a parcelas.

Endpoint base: /v1/financeiro/eventos-financeiros/parcelas

var api = new AcquittanceApi();

// Registrar baixa (pagamento) em uma parcela
var acquittance = await api.CreateAsync("uuid-parcela", new CreateAcquittanceRequest
{
    PaymentDate = "2026-02-11",
    ValueComposition = new AcquittanceValueCompositionRequest
    {
        GrossValue = 1000.00m,
        Discount = 50.00m,
        Interest = 0m,
        Penalty = 0m,
        Fee = 0m
    },
    FinancialAccount = new { id = "uuid-conta" },
    PaymentMethod = PaymentMethod.PixInstantPayment
}, token);

// Listar baixas de uma parcela
var acquittances = await api.GetByInstallmentAsync("uuid-parcela", token);

// Buscar baixa por ID
var detail = await api.GetByIdAsync("uuid-baixa", token);

// Atualizar baixa (PATCH)
await api.PatchAsync("uuid-baixa", new UpdateAcquittanceRequest { /* ... */ }, token);

// Excluir baixa
await api.DeleteAsync("uuid-baixa", token);

Notas Fiscais (InvoiceApi)

Consulta de Notas Fiscais Eletronicas (NF-e) e vinculo com MDF-e.

Endpoint base: /v1/notas-fiscais

var api = new InvoiceApi();

// Listar notas fiscais com filtro tipado (datas obrigatorias)
var invoices = await api.GetAsync(token, new InvoiceFilter("2026-01-01", "2026-12-31")
{
    Page = 1,
    PageSize = 25,
    RecipientDocument = "12345678000190"
});

// Buscar nota fiscal por chave de acesso
var invoice = await api.GetByKeyAsync("chave-de-acesso-44-digitos", token);

// Vincular MDF-e a notas fiscais
await api.LinkMdfeAsync(new MdfeBindingRequest
{
    AccessKeys = new() { "chave1", "chave2" },
    Identifier = "identificador-mdfe",
    Status = "VINCULADO"
}, token);

NFS-e (ServiceInvoiceApi)

Consulta de Notas Fiscais de Servico Eletronicas (NFS-e).

Endpoint base: /v1/notas-fiscais-servico

var api = new ServiceInvoiceApi();

// Listar NFS-e com filtro tipado (datas de competencia obrigatorias, intervalo max 15 dias)
var serviceInvoices = await api.GetAsync(token, new ServiceInvoiceFilter("2026-02-01", "2026-02-15")
{
    Page = 1,
    PageSize = 25,
    NegotiationType = NegotiationType.Sale
});

Contratos (ContractApi)

Gestao de contratos recorrentes.

Endpoint base: /v1/contratos

var api = new ContractApi();

// Criar contrato
var contract = await api.CreateAsync(new CreateContractRequest
{
    ClientId = "uuid-cliente",
    IssuanceDate = "2026-02-11",
    Terms = new ContractTermsRequest
    {
        FrequencyType = BillingPeriod.Monthly,
        ExpirationType = "DATA",
        StartDate = "2026-03-01",
        EndDate = "2027-02-28",
        FrequencyInterval = 1,
        SaleIssuanceDay = 1
    },
    Items = new List<ContractItemRequest>
    {
        new() { Description = "Mensalidade", Quantity = 1, Value = 299.90m }
    },
    PaymentCondition = new ContractPaymentConditionRequest
    {
        PaymentType = "BOLETO_BANCARIO",
        FinancialAccountId = "uuid-conta",
        DueDay = 10
    }
}, token);

// Listar contratos com filtro tipado (datas obrigatorias)
var contracts = await api.GetAsync(token, new ContractFilter("2026-01-01", "2026-12-31")
{
    AscendingSortField = ContractSortField.StartDate,
    TextSearch = "mensalidade"
});

// Obter proximo numero de contrato
var next = await api.GetNextNumberAsync(token);

Models

Models Principais

Model Descricao
Person Dados completos de cliente/fornecedor/transportadora
PersonSummary Resumo de pessoa para listagens
Product Dados completos de produto com estoque, fiscal, variacoes
ProductSummary Resumo de produto para listagens
Sale Venda completa com cliente, itens, pagamento
SaleSearch Resultado de busca de vendas com totais
SaleItemsPaginated Itens de venda paginados com contagem por tipo
Service Servico com classificacao fiscal
Category Categoria de produto
Address Endereco completo
TokenResponse Resposta de autenticacao OAuth2

Models Financeiros

Model Descricao
FinancialEvent Lancamento financeiro (conta a pagar/receber)
FinancialInstallment Parcela de evento financeiro
FinancialEventSearchResult Resultado de busca de contas a receber/pagar
FinancialEventSearchItem Item retornado na busca de eventos financeiros
Acquittance Baixa (pagamento/recebimento)
CostCenter Centro de custo
FinancialAccount Conta financeira (corrente, poupanca, etc.)
AccountBalance Saldo de conta financeira
FinancialCategory Categoria financeira (receita/despesa)
DreCategory Categoria DRE

Models Fiscais

Model Descricao
Invoice Nota Fiscal Eletronica (NF-e)
ServiceInvoice Nota Fiscal de Servico (NFS-e)
FiscalInfo Inscricoes estadual/municipal/Suframa
Ncm Nomenclatura Comum do Mercosul
Cest Codigo Especificador da Substituicao Tributaria
TaxScenario Cenario tributario para servicos

Models de Contrato

Model Descricao
Contract Contrato completo com termos e itens
ContractSummary Resumo de contrato para listagens
NextNumber Proximo numero de contrato disponivel

Outros Models

Model Descricao
Municipality Municipio (codigo IBGE, nome, UF)
OperationalNature Natureza da operacao
OtherContact Contato adicional de pessoa
Profile Perfil de pessoa (cliente, fornecedor, transportadora)
Seller Vendedor
UnitOfMeasure Unidade de medida
PaginatedResponse<T> Wrapper generico de paginacao

Enums

Enums de dominio

Enum Valores
PaymentMethod BankSlip, CreditCard, DebitCard, DigitalWallet, Cash, PixInstantPayment, BankTransfer, Check, ... (22 valores)
PersonType Physical, Legal, Foreign
ProfileType Customer, Supplier, Carrier
SaleStatus ReviewPending, InQuotation, QuotationAccepted, Approved, Invoiced, Canceled, ... (11 valores)
ProductType Product, ProductKit, ProductVariation
ProductStatus Active, Inactive
ProductFormat Simple, Variation
ProductOrigin Domestic, ForeignDirectImport, ForeignAcquiredInternally, ... (9 valores)
ProductCondition New, Used
FiscalProductType MerchandiseForResale, RawMaterial, FinishedProduct, FixedAsset, Services, ... (12 valores)
ServiceType Provided, Received, Both
ServiceStatus Active, Inactive
MeasureUnit Percentage, Value
StateRegistrationType NonContributor, Contributor, Exempt
FinancialAccountType CheckingAccount, Savings, PettyCash, CreditCard, Investment, PaymentMethods, ContaAzulCharges, EasyReceiveCard, Others (9 valores)
FinancialCategoryType Revenue, Expense
BillingPeriod Monthly, Weekly, Biweekly, Quarterly, Semiannual, Annual, ... (7 valores)
InstallmentStatus Pending, Settled, Canceled, Renegotiated, PartiallyReceived, Overdue, Lost (7 valores)
ItemType Product, Service, FixedAssets, Financial, ProductKit (5 valores)
OperationType Sale, Shipment, Purchase, Return (4 valores)
StockLevel Minimum, Maximum, Standard
StockMovement StockEntry, StockExit, NoStockChange (3 valores)
TransactionDirection Sale, Purchase

Enums de filtro

Enum Valores
SortDirection Ascending (ASC), Descending (DESC)
PersonSortField Name, Email, Document, Active
ProductSortField Name
SaleSortField Number, Client, Date
SaleTotalType WaitingApproved, Approved, Canceled, All
ContractSortField StartDate, EndDate
CostCenterSortField Id, Code, Name, Active
NegotiationType Sale, Contract
FinancialEventStatus Lost, Received, Open, Renegotiated, PartiallyReceived, Overdue
QuickFilterType Active, Inactive, All

Todos os enums utilizam [EnumMember(Value = "VALOR_API")] para serializar corretamente com os valores esperados pela API.

Paginacao

Endpoints que retornam listas utilizam o wrapper generico PaginatedResponse<T>:

var result = await customerApi.GetAsync(token, new PersonFilter
{
    Page = 1,
    PageSize = 50,
    SortField = PersonSortField.Name,
    SortDirection = SortDirection.Ascending
});

// Dados
foreach (var customer in result.Items)
{
    Console.WriteLine($"{customer.Name} - {customer.Document}");
}

// Informacoes de paginacao
Console.WriteLine($"Pagina {result.Pagination.Page} de {result.Pagination.TotalPages}");
Console.WriteLine($"Total de registros: {result.Pagination.TotalItems}");

Parametros de paginacao (disponiveis em todos os filtros que herdam PaginatedFilter):

  • Page (pagina) - Numero da pagina (comeca em 1, default 1)
  • PageSize (tamanho_pagina) - Itens por pagina (default 10)

Configuracao Avancada

HttpClient Customizado

A biblioteca permite injetar um IHttpClientWrapper customizado para cenarios de teste ou configuracao especial:

// Usar HttpClient customizado
var customClient = new StandardHttpClient(myHttpClient);
var api = new CustomerApi("/v1/pessoas", customClient, null);

Serializacao JSON Customizada

var jsonOptions = new JsonSerializerOptions
{
    DefaultIgnoreCondition = JsonIgnoreCondition.WhenWritingNull,
    PropertyNamingPolicy = JsonNamingPolicy.SnakeCaseLower
};

var api = new ProductApi("/v1/produtos", new StandardHttpClient(), jsonOptions);

Convencoes de Serializacao

A biblioteca utiliza System.Text.Json com as seguintes configuracoes padrao:

  • Propriedades null sao omitidas na serializacao (WhenWritingNull)
  • Mapeamento de propriedades via [JsonPropertyName] (nomes da API em portugues)
  • Enums serializados como string via [JsonStringEnumConverter] com [EnumMember]
  • Todas as chamadas async usam ConfigureAwait(false)

Requisitos

  • .NET 9.0 ou superior
  • System.Text.Json 9.0.10+
  • Credenciais de API do Conta Azul (Client ID e Client Secret)

Build

# Compilar o projeto
dotnet build Codout.Apis.ContaAzul.csproj

# Gerar pacote NuGet
dotnet pack Codout.Apis.ContaAzul.csproj -c Release

Arquitetura

Codout.Apis.ContaAzul/
├── Api/                          # Classes de API (endpoints)
│   ├── AuthorizationApi.cs       # OAuth2 (token, refresh)
│   ├── CustomerApi.cs            # Pessoas/Clientes
│   ├── ProductApi.cs             # Produtos
│   ├── SaleApi.cs                # Vendas
│   ├── ServiceApi.cs             # Servicos
│   ├── CategoryApi.cs            # Categorias
│   ├── FinancialApi.cs           # Financeiro
│   ├── AcquittanceApi.cs         # Baixas
│   ├── InvoiceApi.cs             # NF-e
│   ├── ServiceInvoiceApi.cs      # NFS-e
│   └── ContractApi.cs            # Contratos
├── Interfaces/
│   ├── IApiResources.cs          # Interface base CRUD
│   └── IHttpClientWrapper.cs     # Abstracao de HttpClient
├── Models/                       # Models de dominio
│   ├── Enums/                    # 33 enums (dominio + filtro)
│   ├── Filters/                  # 20 filtros tipados + infraestrutura
│   └── Request/                  # DTOs de request (Create/Update)
├── ApiResource.cs                # Classe base com metodos HTTP genericos
└── StandardHttpClient.cs         # Implementacao padrao de HttpClient

Fluxo de chamada: SuaApp -> XxxApi -> ApiResource -> IHttpClientWrapper -> HttpClient -> API Conta Azul

Licenca

Copyright (c) Codout. Todos os direitos reservados.

Product Compatible and additional computed target framework versions.
.NET net9.0 is compatible.  net9.0-android was computed.  net9.0-browser was computed.  net9.0-ios was computed.  net9.0-maccatalyst was computed.  net9.0-macos was computed.  net9.0-tvos was computed.  net9.0-windows was computed.  net10.0 was computed.  net10.0-android was computed.  net10.0-browser was computed.  net10.0-ios was computed.  net10.0-maccatalyst was computed.  net10.0-macos was computed.  net10.0-tvos was computed.  net10.0-windows was computed. 
Compatible target framework(s)
Included target framework(s) (in package)
Learn more about Target Frameworks and .NET Standard.

NuGet packages

This package is not used by any NuGet packages.

GitHub repositories

This package is not used by any popular GitHub repositories.

Version Downloads Last Updated
2.3.0 81 3/2/2026
2.2.3 84 2/26/2026
2.2.1 86 2/25/2026

Alinhamento com changelog da API Conta Azul (ago/2025 a fev/2026): adicionado campo url_imagem em Product, id_centro_custo em SaleItem, objeto de renegociação e rateio (centros de custo e categoria financeira) em FinancialInstallment, campos data_competencia/centros_de_custo/categorias em FinancialEventSearchItem, filtro ids_clientes em ReceivableFilter. Renegotiation tipado de object para InstallmentRenegotiation.