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 nogo.mod. A API pública também usa iter.Seq2 e log/slog.
1
Acesse o site oficial do Go.
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: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 arquivosgo.mod e go.sum:
Passo 4 – Importar o SDK
Crie ou abra um arquivomain.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.
- 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.
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.Services
A camadaServices é 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 pacotemidaz. 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
Utility packages
Dentro da pastapkg 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.
Produção: Access Manager
Conecte suas credenciais do Access Manager amidaz.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.
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()).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.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.
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 predicadosIs*, 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, useClassifyTransportError:
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.
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.
slog.Handler. O SDK funciona com qualquer backend que fale slog.
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
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:
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: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
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), pacotemidaz(eraclient). - Autenticação:
WithAuthTokennão existe mais. UseWithAccessManagerpara produção ouWithAnonymouspara stacks locais. Uma fonte de autenticação é obrigatória no momento da construção. - Acesso a serviços:
c.Accounts.X(erac.Entity.Accounts.X). O campoc.Entityainda existe por compatibilidade, mas todos os exemplos usam a forma curta. - Paginação:
models.ListOptionse seus 30 setters fluentes não existem mais. Use as opções tipadas por endpoint (models.AccountsListOpts,models.TransactionsListOpts, …) e os novos iteradoresListAll/ListPages. - Erros:
*MidazErrornão existe mais. Os erros da camada de serviço agora usam*pkg/errors.Error, comRetryable()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 ambienteMIDAZ_TENANT_IDe o headerX-Tenant-IDnão existem mais. O escopo do tenant flui através do Access Manager / das claims do JWT. - Logging:
*slog.Loggersubstitui a interfaceobservability.Loggersob medida como a 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:

