O Midaz SDK para Go é o cliente v3 idiomático para as APIs de Ledger financeiro do Midaz. Ele oferece acesso tipado a todos os serviços — Organizations, Ledgers, Accounts, Transactions e mais — com uma única superfície para autenticação, paginação, erros, logging e observabilidade. Seja para colocar de pé seu primeiro Ledger ou para rodar fluxos de pagamento em produção em escala, o SDK mantém você focado na lógica de negócio e longe do código repetitivo.Documentation Index
Fetch the complete documentation index at: https://docs.lerian.studio/llms.txt
Use this file to discover all available pages before exploring further.
Primeiros passos
Passo 1 – Instale o Go
Antes de usar o SDK, você deve instalar o Go na sua máquina. A v3 declara Go 1.26 nogo.mod. A API pública também usa iter.Seq2 e log/slog.
Acesse o site oficial do Go.
Passo 2 – Crie ou use um projeto Go existente
Crie um projeto Go: Para criar um projeto Go, use o seguinte comando:go.mod na raiz. Se não, execute o seguinte comando para criar um:
Passo 3 – Adicione o Midaz SDK
Dentro do diretório do seu projeto, execute o seguinte comando para baixar o SDK v3 e adicioná-lo aos seus arquivosgo.mod e go.sum:
Passo 4 – Importe o SDK
Crie ou abra um arquivomain.go e adicione o seguinte conteúdo. O exemplo abaixo cria um cliente contra seu stack Midaz local com autenticação anônima, lista organizações e cria uma nova.
O exemplo abaixo aponta para um stack Midaz local com auth desabilitada. Se você ainda não tem um rodando, veja Primeiros passos com o Midaz para subir um antes de executar o snippet.
- O cliente Midaz para chamar todos os serviços da API.
- Os data models embutidos (como
CreateOrganizationInput). - Autenticação via Access Manager (produção) ou Anonymous (desenvolvimento local).
- Um sistema de configuração tipado que falha rápido na construção do cliente.
Passo 5 – Execute o projeto
Execute o seguinte comando:Arquitetura do SDK
O Midaz SDK para Go é construído com clareza e previsibilidade. Todo serviço é acessado direto no cliente, todo método de listagem segue o mesmo trio de assinaturas, todo erro é estruturado, e toda opção falha rápido na construção.
Design em camadas
| Camada | O que ela resolve |
|---|---|
| Client | O ponto de entrada principal — midaz.New(...) conecta autenticação, retries e observabilidade. |
| Services | Acesso de alto nível a cada domínio do Midaz, expostos como campos promovidos no Client. |
| Models | Estruturas de dados core que espelham a lógica de domínio do Midaz, re-exportadas no pacote midaz. |
| Pacotes utilitários | Helpers modulares para config, erros, observabilidade, retries, idempotency e mais. |
Os serviços são acessados direto no cliente —
c.Accounts, c.Transactions, c.Organizations. Você pode ver um campo Entity embutido no autocomplete, mas código novo deve usar os campos de serviço diretos mostrados neste guia.Serviços
A camadaServices é seu ponto de acesso a cada domínio do Midaz. Cada serviço cuida de uma família de recursos e entrega todos os métodos como parte de sua única interface — sem toggle UseAllAPIs(), sem etapa de registro de serviço. Todo serviço já está inicializado e pronto para uso no momento em que midaz.New() retorna.
Serviços disponíveis
| Serviço | O que ele faz |
|---|---|
c.Organizations | Gerencia organizações. |
c.Ledgers | Cria e recupera Ledgers. |
c.Assets | Define e gerencia ativos. |
c.AssetRates | Configura e busca taxas de câmbio entre ativos. |
c.Accounts | Gerencia contas e consulta saldos. |
c.AccountTypes | Gerencia definições de tipos de conta. |
c.Portfolios | Agrupa contas em portfólios. |
c.Segments | Categoriza contas por segmentos. |
c.Transactions | Cria e busca transações financeiras. |
c.TransactionRoutes | Define e gerencia regras de roteamento de transações. |
c.Operations | Detalha as operações atômicas dentro de uma transação. |
c.OperationRoutes | Define e gerencia regras de roteamento de operações. |
c.Balances | Consulta saldos de conta em tempo real. |
c.Holders | Gerencia holders de conta no CRM. |
c.Aliases | Gerencia aliases de CRM para contas e entidades. |
c.MetadataIndexes | Gerencia índices de metadados pesquisáveis. |
Models
Os models refletem como o Midaz pensa em finanças, com cada tipo amarrado a um conceito de negócio do mundo real. Você vai usá-los em toda chamada de serviço — desde o onboarding de contas até o registro de transações multi-leg. Na v3, os tipos de model mais comuns são re-exportados no próprio pacotemidaz. Isso significa que midaz.Account e models.Account são o mesmo tipo, e a maioria do código só precisa de um import.
Tipos de modelos comuns
| Model | O que ele representa |
|---|---|
midaz.Organization | Uma entidade de negócio que detém Ledgers e contas. |
midaz.Ledger | Uma coleção de contas e transações. |
midaz.Asset | Uma unidade de valor (moeda, token etc.) que pode ser armazenada ou movimentada. |
midaz.Account | Uma conta para rastreamento de ativos e saldos. |
midaz.Portfolio | Uma coleção de contas para agrupamento e gestão. |
midaz.Segment | Uma unidade de categorização para organização granular. |
midaz.Transaction | Um evento financeiro composto por múltiplas operações. |
midaz.Operation | Uma entrada individual de débito ou crédito dentro de uma transação. |
midaz.Balance | O estado atual das posições de uma conta. |
Pacotes utilitários
Dentro da pastapkg do SDK, você encontra pacotes utilitários que atacam desafios comuns de dev — de tratamento de config a políticas de retry e primitivas de segurança. Eles se dividem em dois grupos: pacotes core que sustentam preocupações transversais do SDK, e pacotes helpers que oferecem utilitários específicos de domínio ou de baixo nível.
Pacotes core
| Pacote | O que ele resolve |
|---|---|
auth | OAuth do Access Manager e ciclo de vida do token. Substitui o pacote access-manager da v2. |
config | Tratamento centralizado de config, overrides via env e URLs de serviço customizadas. |
concurrent | Ferramentas para batching, rate-limiting e worker pools. |
errors | Tipos de erro estruturados, classificadores e o predicado canônico Retryable(). |
observability | Tracing, métricas e logs por meio de um único provider OpenTelemetry. |
retry | Opções de política de retry com backoff exponencial e jitter. |
sdkctx | Flags de context por request — chaves de idempotency, soft vs hard delete, include-deleted. |
validation | Validação de input com mensagens de erro claras e estruturadas. |
Pacotes helpers
| Pacote | O que ele resolve |
|---|---|
accounts | Helpers e funções de conveniência específicas para contas. |
conversion | Helpers de conversão de tipos entre models e formatos externos. |
data | Utilitários de dados e helpers de faker para testes e demos. |
format | Utilitários para formatar dados no padrão Midaz (datas, horas etc.). |
generator | Geração de demo e dados em massa para cenários ponta a ponta. |
integrity | Utilitários de checksum e verificação de integridade. |
performance | Helpers para tunar operações em lote e tarefas de alto throughput. |
security | Utilitários de segurança, incluindo proteção contra SSRF e validação TLS. |
stats | Estatísticas de processamento e agregação de métricas. |
transaction | Helpers de construção de transações e fluent builders. |
utils | Helpers de uso geral utilizados pelo SDK. |
version | Metadados e identificação da versão do SDK. |
O pacote
pkg/access-manager da v2 virou pkg/auth (assim o nome do diretório bate com o nome do pacote). O pacote pkg/pagination da v2 foi removido — sua superfície hoje vive em models e em cada serviço.Autenticação
Na v3, o SDK exige exatamente uma fonte de autenticação no momento da construção. Chamar
midaz.New(...) sem nenhuma retorna um erro de configuração tipado — chega de cascatas silenciosas de 401 na primeira chamada de API.
Você tem duas escolhas:
midaz.WithAccessManager(...)— OAuth no formato de produção via Lerian Access Manager. Recomendado para qualquer stack não-local.midaz.WithAnonymous()— opt-out total de autenticação. Apropriado apenas para um stack Midaz local com auth desabilitada.
Produção: Access Manager
Encaixe suas credenciais do Access Manager emmidaz.WithAccessManager. O SDK busca um token inicial logo na construção, então erros de configuração aparecem como erros de configuração e não como uma cascata de 401.
Desenvolvimento local: Anonymous
Para um stack Midaz local com auth desabilitada, faça o opt-out de forma explícita:Configure via variáveis de ambiente
Você também pode apontar o SDK para o seu Access Manager via variáveis de ambiente. Exporte-as no seu shell ou no seu gerenciador de processos:config.FromEnvironment() lê o ambiente do processo, não um arquivo .env. Se você mantém variáveis em um arquivo .env durante o desenvolvimento, carregue-as com uma biblioteca como godotenv antes de chamar config.NewConfig(config.FromEnvironment()).O carregamento via env é explícito na v3 —
config.FromEnvironment() precisa estar na cadeia de opções. O SDK não lê mais env vars de forma implícita durante a construção.Multi-tenancy
O escopo de tenant é derivado dos claims do Access Manager / JWT usados para obter o token. O SDK aplica a identidade de tenant automaticamente com base nesses claims — nenhuma configuração extra no client. Para rodar chamadas em outro escopo de tenant, use um conjunto separado de credenciais de Access Manager — ou construa um segundo cliente com seu próprio context de token.
Listagem e iteração
Todo endpoint de listagem na v3 vem em três formatos. Escolha o que casa com seu caso de uso — eles são consistentes em todos os serviços.
| Método | Retorna | Use quando |
|---|---|---|
ListXxx | *models.ListResponse[T] (uma page) | Você quer exatamente uma page e decide quando avançar. |
ListXxxAll | iter.Seq2[T, error] | Você quer todos os itens; o SDK cuida da paginação internamente. |
ListXxxPages | iter.Seq2[*ListResponse[T], error] | Você precisa de metadados de page para checkpointing ou batching. |
Opções de listagem tipadas
Cada método de listagem recebe uma struct de opts tipada que embute uma de duas structs base, dependendo de como o endpoint pagina:| Formato de paginação | Endpoints | Struct base |
|---|---|---|
| Page-based | Organizations, Ledgers, Assets, Portfolios, Segments, Accounts, AccountTypes, Balances, Holders, Aliases | models.PageListOpts{Limit, Page, SortDirection, StartDate, EndDate} |
| Cursor-based | Transactions, Operations, OperationRoutes, TransactionRoutes, AssetRates | models.CursorListOpts{Limit, Cursor, SortDirection, StartDate, EndDate} |
Filters tipada com apenas os campos que aquele endpoint realmente honra. Setar um campo no formato errado — por exemplo, Page em um endpoint cursor-based — falha em tempo de compilação, não silenciosamente em runtime.
Itere todos os itens com ListAll
O formato mais idiomático: um range sobre todo item de toda page. O SDK avança cursors e busca pages internamente.
Itere envelopes de page com ListPages
Quando você precisa de metadados de page — para checkpointing, batching ou para parar no meio de uma page —, itere por ListXxxPages. Cada entrada é um *ListResponse[T] com o bloco Pagination completo anexado.
HasMore(), o tratamento de NextCursor e a tabela de decisão page-vs-cursor.
Tratamento de erros
A maioria dos erros retornados pela camada de serviço do SDK é
*pkg/errors.Error com campos estruturados:
| Campo | O que carrega |
|---|---|
Category | A classe do erro (validation, authentication, network, configuration etc.). |
Code | Um código string estável para branching ou telemetry. |
Operation | A operação do SDK que produziu o erro (ex.: Accounts.GetAccount). |
Resource | A família de recurso que o erro referencia, quando relevante. |
errors.As, ou usar o método canônico Retryable() para guiar sua política de retry.
Ramifique com predicados tipados
O SDK traz um conjunto completo de predicadosIs* para você casar erros sem cutucar internals:
Guie decisões de retry com Retryable()
O método Error.Retryable() é a fonte canônica para política de retry. Use-o no lugar de construir sua própria classificação.
Embrulhe erros de transporte raw
Se você está chamando código HTTP de baixo nível fora do SDK e quer o mesmo formato de erro estruturado, useClassifyTransportError:
Validação local: FieldErrors
A validação local de input expõe*pkg/validation.FieldErrors — uma coleção estruturada de reclamações por campo emitidas pelo SDK antes de qualquer chamada HTTP. Use errors.As para inspecioná-las quando estiver validando input do usuário ou builders.
Logging
Na v3,
*slog.Logger é a superfície canônica de logger. Conecte-o via midaz.WithLogger(...). O SDK é silencioso por padrão — ele usa slog.DiscardHandler até você fazer o opt-in.
Isso significa que você não vai ver linhas de log surpresa no seu stdout, e nem precisa brigar com o SDK por formato de log. Você decide o handler, o nível e o destino.
slog.Handler — o SDK não se importa qual backend produz os records, só que ele fale slog.
Observabilidade
OpenTelemetry é first-class na v3. Um único provider de observabilidade te dá spans, métricas e logs correlacionados via OTel por meio de um único ponto de wiring. Configure observabilidade passando um provider já construído, ou passando opções que o SDK monta para você.
Conecte um provider
Ou passe opções inline
traceparent W3C. Os records de log de negócio carregam apenas IDs seguros — nunca payloads, nomes, endereços ou auth headers.
Você também pode embrulhar um bloco de lógica de negócio em um span via Client.Trace:
Idempotência
A auto-idempotency está ligada por padrão na v3. O SDK emite um header
X-Idempotency: <uuid> em todo request HTTP unsafe (POST, PUT, PATCH, DELETE), então retries em falhas transientes não criam recursos em duplicidade.
Você pode sobrescrever a chave auto-gerada por chamada quando precisar de uma chave estável fornecida pelo caller — típico em passos de saga, linhas de outbox ou submissões dirigidas pela UI.
Defina uma chave estável por request
Suprima a idempotency em uma chamada
Para os raros endpoints administrativos do tipo fire-and-forget, suprima o header por request:Desative globalmente
Se você não quer auto-idempotency em lugar nenhum, desligue no nível do cliente:MIDAZ_IDEMPOTENCY=false quando estiver usando config.FromEnvironment().
Variáveis de ambiente
Você pode configurar o SDK via variáveis de ambiente, sem precisar hardcodar nada. O carregamento via env é explícito na v3 — passe
config.FromEnvironment() na sua cadeia de opções de config para fazer o opt-in.
| Variável | Descrição |
|---|---|
MIDAZ_ENVIRONMENT | Ambiente alvo (local, development, production). |
MIDAZ_BASE_URL | Base URL única usada quando URLs específicas de serviço não estão setadas. |
MIDAZ_ONBOARDING_URL | Sobrescreve a base URL do serviço de onboarding. |
MIDAZ_TRANSACTION_URL | Sobrescreve a base URL do serviço de transação. |
MIDAZ_CRM_URL | Sobrescreve a base URL do serviço de CRM (usado por Holders e Aliases). |
PLUGIN_AUTH_ENABLED | Habilita a autenticação via Access Manager (true ou false). |
PLUGIN_AUTH_ADDRESS | Endereço do serviço de Access Manager. |
MIDAZ_CLIENT_ID | Client ID para a autenticação via Access Manager. |
MIDAZ_CLIENT_SECRET | Client secret para a autenticação via Access Manager. |
MIDAZ_TIMEOUT | Timeout de request HTTP em segundos. |
MIDAZ_USER_AGENT | Header User-Agent customizado enviado em toda request. |
MIDAZ_DEBUG | Habilita logs de debug (true ou false). |
MIDAZ_MAX_RETRIES | Tentativas máximas de retry para requests com falha. |
MIDAZ_IDEMPOTENCY | Habilita a geração automática de chave de idempotency em requests unsafe. |
MIDAZ_SKIP_AUTH_CHECK | Pula a validação da config do Access Manager na inicialização (apenas testes). |
midaz, pkg/config e pkg/sdkctx, consulte o guia de Configuração no repositório do SDK.
Projetos de exemplo
| Exemplo | O que ele demonstra |
|---|---|
01-hello-world | Init mínimo mais a primeira chamada de API (~17 linhas de corpo). |
02-auth | Autenticação via Access Manager (configuração de produção). |
03-end-to-end | Org → ledger → asset → account → transaction. |
04-listing-cursor | Paginação cursor-based com iter.Seq2. |
05-listing-pages | Paginação page-based — List / ListAll / ListPages. |
06-idempotency | Modos de idempotency auto / explícito / suprimido. |
07-retries | Política padrão, política customizada, retries desabilitados. |
08-logging-slog | Integração com *slog.Logger (logging da v3). |
09-testing-with-mocks | go.uber.org/mock para teste unitário do seu código contra o SDK. |
10-observability-otel | Superfície completa de OpenTelemetry (tracing + métricas + logs). |
concurrency, configuration, context, tracing, tracing-server, pkg-validation-demo, mass-demo-generator e workflow-with-entities. Eles cobrem padrões avançados (paralelismo limitado, propagação de context OTel entre processos, geração massiva de dados) para quando você passou do conjunto focado.
Migrando da v2
A v3 é uma major version de corte limpo, sem janela de depreciação. Não há release transicional, não há shim
// Deprecated:, não há alias retrocompatível da superfície antiga. Troque seu import de /v2 para /v3 e percorra as breaking changes com os exemplos lado a lado no guia de migração.
As maiores mudanças para planejar:
- Caminho do módulo e nome do pacote:
github.com/LerianStudio/midaz-sdk-golang/v3(era/v2), pacotemidaz(eraclient). - Autenticação:
WithAuthTokenfoi embora. UseWithAccessManagerpara produção ouWithAnonymouspara stacks locais. Uma fonte de auth é obrigatória na construção. - Acesso a serviços:
c.Accounts.X(erac.Entity.Accounts.X). O campoc.Entityainda existe por compatibilidade, mas todo exemplo usa a forma curta. - Paginação:
models.ListOptionse seus 30 fluent setters foram embora. Use as opts tipadas por endpoint (models.AccountsListOpts,models.TransactionsListOpts, …) e os novos iteradoresListAll/ListPages. - Erros:
*MidazErrorfoi embora. Erros da camada de serviço agora usam*pkg/errors.ErrorcomRetryable()como fonte oficial de retry. Validação local pode expor*pkg/validation.FieldErrors. - Identidade de tenant:
WithTenantID, a variável de ambienteMIDAZ_TENANT_IDe o headerX-Tenant-IDforam embora. O escopo de tenant flui pelos claims do Access Manager / JWT. - Logging:
*slog.Loggersubstitui a interface dedicadaobservability.Loggercomo superfície canônica. O SDK é silencioso por padrão.
Explore as APIs
Para mais informações sobre as APIs, consulte os links a seguir:

