Skip to main content
O SDK do Midaz para Go é o cliente v4 idiomático para as APIs do ledger financeiro do Midaz. Ele oferece acesso tipado a cada serviço (Organizations, Ledgers, Accounts, Transactions e mais) com uma única superfície para autenticação, paginação, erros, logging e observabilidade.
Vindo da v2? A v4 é uma versão major limpa, com mudanças que quebram compatibilidade em autenticação, paginação, erros e acesso a serviços. Não há período de depreciação. Você troca o import de /v2 para /v4 e migra ao mesmo tempo.Veja Migrando da v2 antes de atualizar.

Primeiros passos


Passo 1 – Instalar o Go

Antes de usar o SDK, você deve instalar o Go na sua máquina. A v4 declara Go 1.26 no go.mod. A API pública também usa iter.Seq2 e log/slog.
2
Baixe o instalador para o seu sistema operacional (Windows, macOS ou Linux).

Passo 2 – Criar ou usar um projeto Go existente

Criar um projeto Go: Para criar um projeto Go, use o comando a seguir:
Usar um projeto Go existente: Se você já está trabalhando em um projeto existente, confirme que há um arquivo go.mod na raiz. Caso não haja, execute o comando a seguir para criar um:

Passo 3 – Adicionar o SDK do Midaz

Dentro do diretório do seu projeto, execute o comando a seguir para baixar o SDK v4 e adicioná-lo aos arquivos go.mod e go.sum:
O caminho do módulo exige o sufixo /v4. Se você omitir esse sufixo, o Go resolve uma versão desatualizada anterior à v4, que não traz nenhuma das mudanças lançadas nesta versão. Sempre importe github.com/LerianStudio/midaz-sdk-golang/v4.
No VS Code ou no GoLand, sua IDE pode executar go get automaticamente quando você importa um pacote novo.

Passo 4 – Importar o SDK

Crie ou abra um arquivo main.go e adicione o conteúdo a seguir. O exemplo abaixo cria um cliente para a sua stack local do Midaz com autenticação anônima, lista organizações e, em seguida, cria uma nova.
O exemplo abaixo é para uma stack local do Midaz com autenticação desabilitada. Se você ainda não tem uma rodando, veja Primeiros passos com o Midaz para subir uma antes de executar o snippet.
Isso oferece acesso a:
  • O cliente do Midaz para chamar todos os serviços da API.
  • Modelos de dados prontos (como CreateOrganizationInput).
  • Autenticação via Access Manager (produção) ou Anônimo (desenvolvimento local).
  • Um sistema de configuração tipado que falha rápido no momento da construção.
Para a configuração completa, veja a seção Autenticação.

Passo 5 – Executar o projeto

Execute o comando a seguir:

Arquitetura do SDK


Cada serviço é acessível diretamente no cliente. Cada método de listagem segue o mesmo formato de trio. Cada erro é estruturado. Cada opção falha rápido no momento da construção.

Design em camadas

Os serviços são acessados diretamente no cliente: c.Accounts, c.Transactions, c.Organizations. Você ainda pode ver um campo Entity embutido no autocomplete, mas o código novo deve usar os campos de serviço diretos mostrados neste guia.
Para o design por trás da reescrita, veja o guia de arquitetura.

Services

A camada Services é o seu ponto de acesso a cada domínio do Midaz. Cada serviço trata uma família de recursos e expõe todos os seus métodos como parte de uma única interface. Não existe um toggle UseAllAPIs() nem uma etapa de registro de serviço. Cada serviço fica pronto para uso assim que midaz.New() retorna.

Serviços disponíveis

Models

Cada tipo de modelo está diretamente ligado 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 com múltiplas pernas. Na v4, os tipos de modelo mais comuns são reexportados no próprio pacote midaz. Isso significa que midaz.Account e models.Account são o mesmo tipo, e a maior parte do código precisa de apenas um import.

Tipos de modelo comuns

Para um builder, um formato de requisição interno ou um tipo descontinuado, importe github.com/LerianStudio/midaz-sdk-golang/v4/models diretamente. Todo tipo vive lá, e os aliases de midaz preservam a identidade do tipo, então os dois caminhos de import interoperam sem conflitos.

Utility packages

Dentro da pasta pkg do SDK, você encontra pacotes utilitários para tratamento de configuração, políticas de novas tentativas e primitivas de segurança. Eles se dividem em dois grupos. Os pacotes Core atendem preocupações transversais do SDK. Os pacotes Helper oferecem utilitários específicos de domínio ou de baixo nível.

Core packages

Helper packages

O pacote pkg/access-manager da v2 foi movido para pkg/auth (para que o diretório corresponda ao 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 v4, o SDK exige exatamente uma fonte de autenticação no momento da construção. Chamar midaz.New(...) sem nenhuma das duas retorna um erro de configuração tipado. Não existem mais cascatas silenciosas de 401 na primeira chamada de API. Você tem duas opções:
  • midaz.WithAccessManager(...): OAuth no formato de produção via o Lerian Access Manager. Recomendado para qualquer stack que não seja local.
  • midaz.WithAnonymous(): desativa a autenticação por completo. Adequado apenas para uma stack local do Midaz com autenticação desabilitada.
As duas opções são mutuamente exclusivas.

Produção: Access Manager

Conecte suas credenciais do Access Manager a midaz.WithAccessManager. O SDK busca um token inicial de forma antecipada, já no momento da construção, então configurações incorretas aparecem como erros de configuração, em vez de gerar cascatas de 401.
Substitua os valores no bloco // Configure Access Manager pelas suas próprias credenciais antes de executar.
O SDK solicita um token ao seu Access Manager, anexa esse token a cada chamada de API e o renova automaticamente quando ele expira.

Desenvolvimento local: Anônimo

Para uma stack local do Midaz com autenticação desabilitada, desative a autenticação explicitamente:

Configurar via variáveis de ambiente

Você também pode apontar o SDK para o seu Access Manager usando variáveis de ambiente. Exporte-as no seu shell ou no seu gerenciador de processos:
config.FromEnvironment() lê o ambiente de 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()).
Depois, habilite o carregamento por ambiente no momento da configuração:
O carregamento por ambiente é explícito na v4. config.FromEnvironment() deve estar na cadeia de opções. O SDK não lê mais variáveis de ambiente de forma implícita durante a construção.
Para o passo a passo completo de autenticação, veja o guia de autenticação no repositório do SDK.

Multi-tenancy


O escopo do tenant vem do Access Manager / das claims do JWT usadas para obter o token. O SDK aplica a identidade do tenant automaticamente a partir dessas claims. O lado do cliente não precisa de nenhuma configuração extra. Para executar chamadas em um escopo de tenant diferente, use um conjunto separado de credenciais do Access Manager, ou construa um segundo cliente com seu próprio contexto de token.

Listagem e iteração


Cada endpoint de listagem na v4 vem em três formatos. Escolha o que corresponde ao seu caso de uso. Eles são consistentes em todos os serviços.

Opções de listagem tipadas

Cada método de listagem recebe uma struct de opções tipada que incorpora uma de duas structs base, dependendo de como o endpoint pagina: Cada endpoint também expõe uma sub-struct Filters tipada, apenas com os campos que esse endpoint realmente aceita. Definir um campo na struct errada (por exemplo, Page em um endpoint baseado em cursor) falha em tempo de compilação, não silenciosamente em tempo de execução.

Iterar por cada item com ListAll

O formato mais idiomático é um loop range sobre cada item em todas as páginas. O SDK avança os cursores e busca as páginas internamente.

Iterar envelopes de página com ListPages

Quando você precisa de metadados no nível de página (para checkpointing, processamento em lote ou para parar no meio de uma página), itere sobre ListXxxPages. Cada entrada é um *ListResponse[T] com o bloco Pagination completo anexado.
Veja o guia de paginação no repositório do SDK para a semântica de HasMore(), o tratamento de NextCursor e a tabela de decisão entre página e cursor.

Tratamento de erros


A maioria dos erros retornados pela camada de serviço do SDK é do tipo *pkg/errors.Error, com campos estruturados: Você pode ramificar a lógica com predicados tipados, percorrer campos com errors.As, ou usar o método canônico Retryable() para orientar a política de novas tentativas.

Ramificar com predicados tipados

O SDK vem com um conjunto completo de predicados Is*, para você reconhecer erros sem mexer nos detalhes internos:

Guiar decisões de novas tentativas com Retryable()

O método Error.Retryable() é a fonte canônica da política de novas tentativas. Use-o em vez de criar sua própria classificação.

Envolver erros brutos de transporte

Se você está chamando código HTTP de nível mais baixo fora do SDK e quer o mesmo formato de erro estruturado, use ClassifyTransportError:

Validação local: FieldErrors

A validação local de entrada expõe *pkg/validation.FieldErrors, uma coleção estruturada de reclamações por campo geradas pelo SDK antes de qualquer chamada HTTP. Use errors.As para inspecioná-las ao validar entradas de usuário ou builders.
Para o mapa completo de categorias, todos os códigos e a semântica dos limites de nova tentativa, veja o guia de tratamento de erros no repositório do SDK.

Logging


Na v4, *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ê habilitar o logging. Você decide o handler, o nível e o destino.
zap, zerolog e charmbracelet/log se integram como adapters de slog.Handler. O SDK funciona com qualquer backend que fale slog.
O guia de logging tem receitas de adapters para todas as bibliotecas de logging mais comuns.

Observabilidade


O OpenTelemetry é um recurso de primeira classe na v4. Um único provedor de observabilidade oferece spans, métricas e logs correlacionados via OTel, através de um único ponto de conexão. Configure a observabilidade passando um provedor já pronto, ou passando opções que o SDK monta para você.

Conectar um provedor

Ou passar opções inline

O SDK emite um span HTTP por requisição de saída, com propagação adequada do traceparent do W3C. Os registros de log de negócio carregam apenas IDs seguros, nunca payloads, nomes, endereços ou headers de autenticação. Você também pode envolver um bloco de lógica de negócio em um span usando Client.Trace:
WithObservabilityOptions e WithObservabilityProvider usam semântica de substituição, não de merge. Cada chamada substitui qualquer provedor instalado anteriormente. Para partir de uma base, inclua observability.WithDevelopmentDefaults ou observability.WithProductionDefaults como a primeira opção na cadeia.
Veja o exemplo 10-observability-otel no repositório do SDK para atributos de span, nomes de métrica e configuração de exporter.

Idempotência


A idempotência automática vem habilitada por padrão na v4. O SDK emite um header X-Idempotency: <uuid> em toda requisição HTTP insegura (POST, PUT, PATCH, DELETE). Assim, novas tentativas em falhas transitórias não criam recursos duplicados. Você pode sobrescrever a chave gerada automaticamente por chamada quando precisar de uma chave estável, fornecida por quem chama. Isso é comum em etapas de saga, linhas de outbox ou envios orientados por UI.

Definir uma chave estável por requisição

Suprimir a idempotência para uma chamada

Para endpoints administrativos raros do tipo fire-and-forget, suprima o header por requisição:

Desabilitar globalmente

Se você não quer idempotência automática em nenhum lugar, desative-a no nível do cliente:
Você também pode desativá-la usando a variável de ambiente MIDAZ_IDEMPOTENCY=false ao usar config.FromEnvironment().

Variáveis de ambiente


Você pode configurar o SDK com variáveis de ambiente em vez de valores fixos no código. O carregamento por ambiente é explícito na v4. Passe config.FromEnvironment() na sua cadeia de opções de configuração para habilitá-lo. Para a matriz completa de opções em midaz, pkg/config e pkg/sdkctx, veja o guia de configuração no repositório do SDK.

Exemplos de projetos


O SDK vem com um tour numerado pelas suas capacidades principais (exemplos 01–10), além de um conjunto de exemplos avançados e de referência. O conjunto numerado é formado por tutoriais focados: cada um ensina exatamente um conceito, com o corpo de código menor possível. Navegue por eles no diretório de exemplos no GitHub.
O repositório também inclui exemplos especializados e de referência: 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 contexto OTel entre processos, geração de dados em massa) para quando o conjunto focado já não for suficiente.

Migrando da v2


A v4 é uma versão major com corte limpo e sem período de depreciação. Não há release de transição, nem shim // Deprecated:, nem alias compatível com versões anteriores para a superfície antiga. Troque o import de /v2 para /v4 e percorra as mudanças que quebram compatibilidade a seguir. As maiores mudanças para planejar:
  • Caminho do módulo e nome do pacote: github.com/LerianStudio/midaz-sdk-golang/v4 (era /v2), pacote midaz (era client).
  • Autenticação: WithAuthToken não existe mais. Use WithAccessManager para produção ou WithAnonymous para stacks locais. Uma fonte de autenticação é obrigatória no momento da construção.
  • Acesso a serviços: c.Accounts.X (era c.Entity.Accounts.X). O campo c.Entity ainda existe por compatibilidade, mas todos os exemplos usam a forma curta.
  • Paginação: models.ListOptions e seus 30 setters fluentes não existem mais. Use as opções tipadas por endpoint (models.AccountsListOpts, models.TransactionsListOpts, …) e os novos iteradores ListAll / ListPages.
  • Erros: *MidazError não existe mais. Os erros da camada de serviço agora usam *pkg/errors.Error, com Retryable() como a fonte oficial de decisão de nova tentativa. A validação local pode expor *pkg/validation.FieldErrors.
  • Identidade do tenant: WithTenantID, a variável de ambiente MIDAZ_TENANT_ID e o header X-Tenant-ID não existem mais. O escopo do tenant flui através do Access Manager / das claims do JWT.
  • Logging: *slog.Logger substitui a interface observability.Logger sob medida como a superfície canônica. O SDK é silencioso por padrão.
Para os detalhes das mudanças de autenticação, veja o guia de autenticação no repositório do SDK. O diretório de exemplos mostra a API v4 na prática.

Explore as APIs


Para mais informações sobre as APIs, consulte os links a seguir:

Mapeamento de API externa

Mapeamento de API interna

Documentação do Godoc