Saltar al contenido principal
El SDK de Midaz para Go es el cliente idiomático v4 para las APIs del Ledger financiero de Midaz. Te ofrece acceso tipado a cada servicio — Organizations, Ledgers, Accounts, Transactions y más — con una superficie única para autenticación, paginación, errores, logging y observabilidad. Ya sea que estés levantando tu primer Ledger o ejecutando flujos de pago en producción a gran escala, el SDK te permite enfocarte en tu lógica de negocio y olvidarte del código repetitivo.
¿Vienes de v2? v4 es una versión major limpia con cambios incompatibles en autenticación, paginación, errores y acceso a servicios. No hay ventana de deprecación — cambias tu import de /v2 a /v4 y migras al mismo tiempo.Lee la Guía de migración de v2 a v3 antes de actualizar.

Comenzando


Paso 1 – Instalar Go

Antes de usar el SDK, debes instalar Go en tu máquina. v4 declara Go 1.26 en go.mod. La API pública también usa iter.Seq2 y log/slog.
2
Descarga el instalador para tu SO (Windows, macOS o Linux).

Paso 2 – Crear o usar un proyecto Go existente

Crear un proyecto Go: Para crear un proyecto Go, usa el siguiente comando:
Usar un proyecto Go existente: Si estás trabajando en un proyecto existente, asegúrate de que haya un archivo go.mod en la raíz. Si no, ejecuta el siguiente comando para crear uno:

Paso 3 – Agregar el SDK de Midaz

Dentro del directorio de tu proyecto, ejecuta el siguiente comando para descargar el SDK v4 y agregarlo a tus archivos go.mod y go.sum:
La ruta del módulo requiere el sufijo /v4. Si lo omites, Go resolverá una versión obsoleta anterior a v4 que carece de todos los cambios incluidos en esta versión. Importa siempre github.com/LerianStudio/midaz-sdk-golang/v4.
¿Usas VS Code o GoLand? Tu IDE puede ejecutar automáticamente go get cuando importes un nuevo paquete.

Paso 4 – Importar el SDK

Crea o abre un archivo main.go y agrega el siguiente contenido. El ejemplo a continuación construye un cliente contra tu stack local de Midaz con autenticación anónima, lista organizaciones y luego crea una nueva.
El ejemplo a continuación apunta a un stack local de Midaz con la autenticación deshabilitada. Si aún no tienes uno corriendo, consulta Comenzando con Midaz para levantarlo antes de ejecutar el snippet.
Esto te da acceso a:
  • El cliente de Midaz para llamar a cada servicio de la API.
  • Modelos de datos integrados (como CreateOrganizationInput).
  • Autenticación vía Access Manager (producción) o Anonymous (desarrollo local).
  • Un sistema de configuración tipado que falla rápidamente al construirse.
¿Quieres aprender más sobre autenticación? Ve a la sección Autenticación para la configuración completa.

Paso 5 – Ejecutar el proyecto

Ejecuta el siguiente comando:

Arquitectura del SDK


El SDK de Midaz para Go está construido alrededor de la claridad y la previsibilidad. Cada servicio es accesible directamente desde el cliente, cada método de listado sigue la misma forma de tres variantes, cada error es estructurado y cada opción falla rápidamente al construirse.

Diseño en capas

Los servicios se acceden directamente desde el cliente — c.Accounts, c.Transactions, c.Organizations. Es posible que veas un campo embebido Entity en el autocompletado, pero el código nuevo debe usar los campos de servicio directos que se muestran en esta guía.
¿Quieres profundizar más? Consulta el racional de diseño v3 para conocer toda la historia arquitectónica detrás de la reescritura.

Servicios

La capa Services es tu punto de acceso a cada dominio de Midaz. Cada servicio maneja una familia de recursos y expone cada método como parte de su única interface — sin toggle UseAllAPIs(), sin paso de registro de servicio. Cada servicio se inicializa y está listo para usar en el momento en que midaz.New() retorna.

Servicios disponibles

Models

Los models reflejan cómo Midaz piensa sobre las finanzas, con cada tipo ligado estrechamente a un concepto de negocio del mundo real. Los usarás en cada llamada de servicio — desde el onboarding de cuentas hasta el registro de transacciones multi-leg. En v4, los tipos de model más comunes son reexportados desde el propio paquete midaz. Esto significa que midaz.Account y models.Account son el mismo tipo, y la mayor parte del código solo necesita un import.

Tipos de modelos comunes

¿Necesitas un builder, una forma de request interna o un tipo deprecado? Importa github.com/LerianStudio/midaz-sdk-golang/v4/models directamente — cada tipo vive ahí, y los aliases del paquete midaz preservan la identidad de tipo, por lo que las dos rutas de import interoperan limpiamente.

Paquetes de utilidad

Dentro de la carpeta pkg del SDK, encontrarás paquetes de utilidad que abordan desafíos comunes de desarrollo — desde manejo de configuración hasta políticas de reintento y primitivas de seguridad. Se dividen en dos grupos: paquetes core que sostienen las preocupaciones transversales del SDK, y paquetes ayudantes que proporcionan utilidades específicas de dominio o de bajo nivel.

Paquetes core

Paquetes ayudantes

El paquete pkg/access-manager de v2 se ha movido a pkg/auth (para que el directorio coincida con el nombre del paquete). El paquete pkg/pagination de v2 fue eliminado — su superficie hoy vive en models y en cada servicio.

Autenticación


En v4, el SDK requiere exactamente una fuente de autenticación al momento de la construcción. Llamar a midaz.New(...) sin ninguna devuelve un error de configuración tipado — se acabaron las cascadas silenciosas de 401 en la primera llamada de API. Tienes dos opciones:
  • midaz.WithAccessManager(...) — OAuth con forma de producción vía el Lerian Access Manager. Recomendado para cualquier stack no local.
  • midaz.WithAnonymous() — desactiva por completo la autenticación. Adecuado únicamente para un stack local de Midaz con auth deshabilitada.
Las dos opciones son mutuamente excluyentes.

Producción: Access Manager

Conecta tus credenciales del Access Manager en midaz.WithAccessManager. El SDK obtiene proactivamente un token inicial al momento de la construcción, por lo que las configuraciones incorrectas surgen como errores de configuración en lugar de cascadas de 401.
Reemplaza los valores en el bloque // Configure Access Manager con tus propias credenciales antes de ejecutar.
El SDK solicita un token a tu Access Manager, lo adjunta a cada llamada de API y lo refresca automáticamente cuando expira.

Desarrollo local: Anonymous

Para un stack local de Midaz con auth deshabilitada, desactívala explícitamente:

Configurar mediante variables de entorno

También puedes apuntar el SDK hacia tu Access Manager mediante variables de entorno. Expórtalas en tu shell o en tu gestor de procesos:
config.FromEnvironment() lee el entorno del proceso, no un archivo .env. Si guardas variables en un archivo .env durante el desarrollo, cárgalas con una librería como godotenv antes de llamar a config.NewConfig(config.FromEnvironment()).
Luego activa la carga desde el entorno al momento de configurar:
La carga desde el entorno es explícita en v4 — config.FromEnvironment() debe estar en la cadena de opciones. El SDK ya no lee variables de entorno de forma implícita durante la construcción.
¿Quieres el recorrido completo de auth? Consulta la Guía de autenticación en el repositorio del SDK.

Multi-tenancy


El alcance de tenant se deriva de los claims del Access Manager / JWT usados para obtener el token. El SDK aplica la identidad de tenant automáticamente con base en esos claims — sin configuración extra del lado del cliente. Para ejecutar llamadas bajo un alcance de tenant distinto, utiliza un conjunto separado de credenciales del Access Manager — o construye un segundo cliente con su propio context de token.

Listado e iteración


Cada endpoint de listado en v4 viene en tres variantes. Elige la que se ajuste a tu caso de uso — son consistentes en cada servicio.

Opciones de listado tipadas

Cada método de listado recibe un struct de opts tipado que embebe uno de dos structs base, dependiendo de cómo pagine el endpoint: Cada endpoint también expone un sub-struct Filters tipado con solo los campos que ese endpoint realmente honra. Configurar un campo en la forma incorrecta — por ejemplo, Page en un endpoint con cursor — falla en tiempo de compilación, no de manera silenciosa en runtime.

Iterar cada item con ListAll

La forma más idiomática: un loop range sobre cada item a través de cada page. El SDK avanza los cursors y obtiene las pages internamente.

Iterar envoltorios de page con ListPages

Cuando necesitas metadatos a nivel de page — para checkpointing, batching o detenerse a media page — itera sobre ListXxxPages en su lugar. Cada entrada es un *ListResponse[T] con el bloque Pagination completo adjunto.
Consulta la Guía de paginación en el repositorio del SDK para la semántica de HasMore(), el manejo de NextCursor y la tabla de decisión page vs cursor.

Manejo de errores


La mayoría de los errores que retorna la capa de servicios del SDK son *pkg/errors.Error con campos estructurados: Puedes ramificar con predicados tipados, recorrer campos con errors.As o usar el método canónico Retryable() para guiar la política de reintentos.

Ramificar con predicados tipados

El SDK incluye un conjunto completo de predicados Is* para que puedas hacer match con errores sin hurgar en los internos:

Guiar decisiones de reintento con Retryable()

El método Error.Retryable() es la fuente canónica de política de reintentos. Úsalo en lugar de construir tu propia clasificación.

Envolver errores de transporte crudos

Si estás llamando a código HTTP de bajo nivel fuera del SDK y deseas la misma forma de error estructurado, usa ClassifyTransportError:

Validación local: FieldErrors

La validación local de input expone *pkg/validation.FieldErrors — una colección estructurada de quejas por campo emitidas por el SDK antes de cualquier llamada HTTP. Usa errors.As para inspeccionarlas cuando valides entradas de usuario o builders.
¿Quieres profundizar más? Consulta la Guía de manejo de errores en el repositorio del SDK para ver el mapa completo de categorías, cada code y la semántica de los límites de reintento.

Logging


En v4, *slog.Logger es la superficie canónica de logger. Conéctalo vía midaz.WithLogger(...). El SDK es silencioso por defecto — usa slog.DiscardHandler hasta que actives el opt-in. Eso significa cero líneas de log sorpresivas en tu stdout, y nada de pelear con el SDK por el formato del log. Tú decides el handler, el nivel y el destino.
¿Necesitas zap, zerolog o charmbracelet/log? Todos se integran como adapters de slog.Handler — al SDK no le importa qué backend produce los registros, solo que hable slog.
¿Estás cableando zap, zerolog u otro backend? La Guía de logging trae recetas de adapter para cada librería de logging común.

Observabilidad


OpenTelemetry es ciudadano de primera clase en v4. Un único proveedor de observabilidad te da spans, métricas y logs correlacionados con OTel a través de un único punto de cableado. Configura la observabilidad pasando un proveedor totalmente construido, o pasando opciones que el SDK ensambla por ti.

Cablear un proveedor

O pasar opciones inline

El SDK emite un span HTTP por cada petición saliente con propagación adecuada de traceparent W3C. Los registros de log de negocio transportan únicamente IDs seguros — nunca payloads, nombres, direcciones ni headers de auth. También puedes envolver un bloque de lógica de negocio en un span vía Client.Trace:
WithObservabilityOptions y WithObservabilityProvider usan semántica de reemplazo, no merge. Cada llamada reemplaza al proveedor previamente instalado. Para partir de una baseline, incluye observability.WithDevelopmentDefaults u observability.WithProductionDefaults como la primera opción en la cadena.
¿Quieres profundizar más? Consulta la Guía de tracing en el repositorio del SDK para ver los contratos de atributos de span, los nombres de métricas y la configuración de exporters.

Idempotencia


La auto-idempotencia está activa por defecto en v4. El SDK emite un header X-Idempotency: <uuid> en cada petición HTTP no segura (POST, PUT, PATCH, DELETE), de modo que los reintentos ante fallos transitorios no creen accidentalmente recursos duplicados. Puedes sobreescribir la clave autogenerada por llamada cuando necesites una clave estable provista por el caller — típico para pasos de saga, filas de outbox o submissions desde la UI.

Definir una clave estable por petición

Suprimir idempotencia para una sola llamada

Para los raros endpoints administrativos de tipo fire-and-forget, suprime el header por petición:

Deshabilitar globalmente

Si no quieres auto-idempotencia en ningún lado, desactívala a nivel del cliente:
También puedes deshabilitarla mediante la variable de entorno MIDAZ_IDEMPOTENCY=false cuando uses config.FromEnvironment().

Variables de entorno


Puedes configurar el SDK usando variables de entorno, sin necesidad de hardcodear nada. La carga desde el entorno es explícita en v4 — pasa config.FromEnvironment() en tu cadena de opciones de configuración para activarla. Para la matriz completa de opciones a lo largo de midaz, pkg/config y pkg/sdkctx, consulta la Guía de configuración en el repositorio del SDK.

Proyectos de ejemplo


El SDK incluye un recorrido numerado de sus capacidades core (ejemplos 01–10) más un conjunto de ejemplos avanzados y de referencia. El conjunto numerado son tutoriales enfocados: cada uno enseña exactamente un concepto con el cuerpo más pequeño posible. Explóralos en el directorio de ejemplos en GitHub.
El repositorio también incluye ejemplos especializados y de referencia — concurrency, configuration, context, tracing, tracing-server, pkg-validation-demo, mass-demo-generator y workflow-with-entities. Cubren patrones avanzados (paralelismo acotado, propagación de context de OTel entre procesos, generación masiva de datos) para cuando ya hayas superado el conjunto enfocado.

Migrando de v2


v4 es una versión major de corte limpio sin ventana de deprecación. No hay release de transición, no hay shim // Deprecated:, no hay alias retrocompatible de la superficie antigua. Cambia tu import de /v2 a /v4 y recorre los cambios incompatibles con los ejemplos lado a lado de la guía de migración. Los movimientos más grandes a planificar:
  • Ruta del módulo y nombre del paquete: github.com/LerianStudio/midaz-sdk-golang/v4 (era /v2), paquete midaz (era client).
  • Autenticación: WithAuthToken desapareció. Usa WithAccessManager para producción o WithAnonymous para stacks locales. Una fuente de auth es obligatoria al construir.
  • Acceso a servicios: c.Accounts.X (era c.Entity.Accounts.X). El campo c.Entity aún existe por compatibilidad, pero cada ejemplo usa la forma corta.
  • Paginación: models.ListOptions y sus 30 setters fluidos desaparecieron. Usa los opts tipados por endpoint (models.AccountsListOpts, models.TransactionsListOpts, …) y los nuevos iteradores ListAll / ListPages.
  • Errores: *MidazError desapareció. Los errores de la capa de servicios ahora usan *pkg/errors.Error con Retryable() como fuente oficial de reintento. La validación local puede exponer *pkg/validation.FieldErrors.
  • Identidad de tenant: WithTenantID, la variable de entorno MIDAZ_TENANT_ID y el header X-Tenant-ID desaparecieron. El alcance de tenant fluye a través de los claims del Access Manager / JWT.
  • Logging: *slog.Logger reemplaza a la interface a medida observability.Logger como superficie canónica. El SDK es silencioso por defecto.
Para el recorrido completo con código v2 / v3 lado a lado de cada cambio incompatible, lee la Guía de migración de v2 a v3.

Explorar las APIs


Para más información sobre las APIs, consulta los siguientes enlaces:

Mapeo de APIs externas

Mapeo de APIs internas

Documentación Godoc