El SDK de Midaz para Go es el cliente idiomático v3 para las APIs del Ledger financiero de Midaz. Le 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é levantando su primer Ledger o ejecutando flujos de pago en producción a gran escala, el SDK le permite enfocarse en su lógica de negocio y olvidarse del 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.
Comenzando
Paso 1 – Instalar Go
Antes de usar el SDK, debe instalar Go en su máquina. v3 declara Go 1.26 engo.mod. La API pública también usa iter.Seq2 y log/slog.
Vaya al sitio web oficial de Go.
Paso 2 – Crear o usar un proyecto Go existente
Crear un proyecto Go: Para crear un proyecto Go, use el siguiente comando:go.mod en la raíz. Si no, ejecute el siguiente comando para crear uno:
Paso 3 – Agregar el SDK de Midaz
Dentro del directorio de su proyecto, ejecute el siguiente comando para descargar el SDK v3 y agregarlo a sus archivosgo.mod y go.sum:
Paso 4 – Importar el SDK
Cree o abra un archivomain.go y agregue el siguiente contenido. El ejemplo a continuación construye un cliente contra su 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 tiene uno corriendo, vea Comenzando con Midaz para levantarlo antes de ejecutar el snippet.
- 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.
Paso 5 – Ejecutar el proyecto
Ejecute 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
| Capa | De qué se encarga |
|---|---|
| Client | El punto de entrada principal — midaz.New(...) cablea autenticación, reintentos y observabilidad. |
| Services | Acceso de alto nivel a cada dominio de Midaz, expuesto como campos promovidos en el cliente. |
| Models | Las estructuras de datos core que reflejan la lógica de dominio de Midaz, reexportadas en el paquete midaz. |
| Paquetes de utilidad | Helpers modulares para configuración, errores, observabilidad, reintentos, idempotencia y más. |
Los servicios se acceden directamente desde el cliente —
c.Accounts, c.Transactions, c.Organizations. Es posible que vea 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.Servicios
La capaServices es su 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
| Servicio | Qué hace |
|---|---|
c.Organizations | Gestionar organizaciones. |
c.Ledgers | Crear y obtener Ledgers. |
c.Assets | Definir y gestionar assets. |
c.AssetRates | Configurar y consultar tasas de cambio de assets. |
c.Accounts | Gestionar cuentas y consultar saldos. |
c.AccountTypes | Gestionar definiciones de tipos de cuenta. |
c.Portfolios | Agrupar cuentas dentro de portafolios. |
c.Segments | Categorizar cuentas usando segments. |
c.Transactions | Crear y buscar transacciones financieras. |
c.TransactionRoutes | Definir y gestionar reglas de enrutamiento de transacciones. |
c.Operations | Profundizar en las operaciones atómicas dentro de una transacción. |
c.OperationRoutes | Definir y gestionar reglas de enrutamiento de operaciones. |
c.Balances | Obtener saldos de cuentas en tiempo real. |
c.Holders | Gestionar titulares de cuenta del CRM. |
c.Aliases | Gestionar aliases del CRM para cuentas y entidades. |
c.MetadataIndexes | Gestionar índices de metadatos consultables. |
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á en cada llamada de servicio — desde el onboarding de cuentas hasta el registro de transacciones multi-leg. En v3, los tipos de model más comunes son reexportados desde el propio paquetemidaz. 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
| Model | Qué representa |
|---|---|
midaz.Organization | Una entidad de negocio que es dueña de Ledgers y cuentas. |
midaz.Ledger | Una colección de cuentas y transacciones. |
midaz.Asset | Una unidad de valor (moneda, token, etc.) que puede ser almacenada o movida. |
midaz.Account | Una cuenta para rastrear assets y saldos. |
midaz.Portfolio | Una colección de cuentas para agrupación y gestión. |
midaz.Segment | Una unidad de categorización para organización granular. |
midaz.Transaction | Un evento financiero compuesto por múltiples operaciones. |
midaz.Operation | Una entrada individual de débito o crédito dentro de una transacción. |
midaz.Balance | El estado actual de las tenencias de una cuenta. |
Paquetes de utilidad
Dentro de la carpetapkg del SDK, encontrará 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
| Paquete | Qué resuelve |
|---|---|
auth | OAuth con Access Manager y ciclo de vida de tokens. Reemplaza al paquete access-manager de v2. |
config | Manejo centralizado de configuración, overrides por env y URLs de servicio personalizadas. |
concurrent | Herramientas para procesamiento por lotes, rate-limiting y worker pools. |
errors | Tipos de error estructurados, clasificadores y el predicado canónico Retryable(). |
observability | Tracing, métricas y logs a través de un único proveedor de OpenTelemetry. |
retry | Opciones de política de reintentos con backoff exponencial y jitter. |
sdkctx | Flags de context por request — claves de idempotencia, soft vs hard delete, include-deleted. |
validation | Validación de input con mensajes de error claros y estructurados. |
Paquetes ayudantes
| Paquete | Qué resuelve |
|---|---|
accounts | Helpers específicos de cuenta y funciones de conveniencia. |
conversion | Helpers de conversión de tipos entre models y formatos externos. |
data | Utilidades de datos y helpers de faker para tests y demos. |
format | Utilidades para formatear datos al estilo Midaz (fechas, horas, etc.). |
generator | Generación de datos de demo y masivos para escenarios end-to-end. |
integrity | Utilidades de checksum y verificación de integridad. |
performance | Helpers para afinar operaciones en bloque y tareas de alto throughput. |
security | Utilidades de seguridad, incluyendo protección contra SSRF y validación TLS. |
stats | Estadísticas de procesamiento y agregación de métricas. |
transaction | Helpers de construcción de transacciones y builders fluidos. |
utils | Helpers de propósito general usados a lo largo del SDK. |
version | Metadatos e identificación de la versión del SDK. |
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 v3, 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.
Tiene 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.
Producción: Access Manager
Conecte sus credenciales del Access Manager enmidaz.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.
Desarrollo local: Anonymous
Para un stack local de Midaz con auth deshabilitada, desactívela explícitamente:Configurar mediante variables de entorno
También puede apuntar el SDK hacia su Access Manager mediante variables de entorno. Expórtelas en su shell o en su gestor de procesos:config.FromEnvironment() lee el entorno del proceso, no un archivo .env. Si guarda variables en un archivo .env durante el desarrollo, cárguelas con una librería como godotenv antes de llamar a config.NewConfig(config.FromEnvironment()).La carga desde el entorno es explícita en v3 —
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.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, utilice un conjunto separado de credenciales del Access Manager — o construya un segundo cliente con su propio context de token.
Listado e iteración
Cada endpoint de listado en v3 viene en tres variantes. Elija la que se ajuste a su caso de uso — son consistentes en cada servicio.
| Método | Retorna | Use cuando |
|---|---|---|
ListXxx | *models.ListResponse[T] (una page) | Quiere exactamente una page y decide cuándo avanzar. |
ListXxxAll | iter.Seq2[T, error] | Quiere cada item; el SDK maneja la paginación internamente. |
ListXxxPages | iter.Seq2[*ListResponse[T], error] | Necesita metadatos a nivel de page para checkpointing o batching. |
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:| Forma de paginación | Endpoints | Struct base |
|---|---|---|
| Basada en page | Organizations, Ledgers, Assets, Portfolios, Segments, Accounts, AccountTypes, Balances, Holders, Aliases | models.PageListOpts{Limit, Page, SortDirection, StartDate, EndDate} |
| Basada en cursor | Transactions, Operations, OperationRoutes, TransactionRoutes, AssetRates | models.CursorListOpts{Limit, Cursor, SortDirection, StartDate, EndDate} |
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 necesita metadatos a nivel de page — para checkpointing, batching o detenerse a media page — itere sobre ListXxxPages en su lugar. Cada entrada es un *ListResponse[T] con el bloque Pagination completo adjunto.
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:
| Campo | Qué transporta |
|---|---|
Category | La clase del error (validation, authentication, network, configuration, etc.). |
Code | Un string code estable, apto para branching o telemetría. |
Operation | La operación del SDK que produjo el error (p. ej. Accounts.GetAccount). |
Resource | La familia de recursos a la que se refiere el error, cuando es relevante. |
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 predicadosIs* para que pueda 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. Úselo en lugar de construir su propia clasificación.
Envolver errores de transporte crudos
Si está llamando a código HTTP de bajo nivel fuera del SDK y desea la misma forma de error estructurado, useClassifyTransportError:
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. Use errors.As para inspeccionarlas cuando valide entradas de usuario o builders.
Logging
En v3,
*slog.Logger es la superficie canónica de logger. Conéctelo vía midaz.WithLogger(...). El SDK es silencioso por defecto — usa slog.DiscardHandler hasta que usted active el opt-in.
Eso significa cero líneas de log sorpresivas en su stdout, y nada de pelear con el SDK por el formato del log. Usted decide el handler, el nivel y el destino.
slog.Handler — al SDK no le importa qué backend produce los registros, solo que hable slog.
Observabilidad
OpenTelemetry es ciudadano de primera clase en v3. Un único proveedor de observabilidad le da spans, métricas y logs correlacionados con OTel a través de un único punto de cableado. Configure la observabilidad pasando un proveedor totalmente construido, o pasando opciones que el SDK ensambla por usted.
Cablear un proveedor
O pasar opciones inline
traceparent W3C. Los registros de log de negocio transportan únicamente IDs seguros — nunca payloads, nombres, direcciones ni headers de auth.
También puede envolver un bloque de lógica de negocio en un span vía Client.Trace:
Idempotencia
La auto-idempotencia está activa por defecto en v3. 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.
Puede sobreescribir la clave autogenerada por llamada cuando necesite 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, suprima el header por petición:Deshabilitar globalmente
Si no quiere auto-idempotencia en ningún lado, desactívela a nivel del cliente:MIDAZ_IDEMPOTENCY=false cuando use config.FromEnvironment().
Variables de entorno
Puede configurar el SDK usando variables de entorno, sin necesidad de hardcodear nada. La carga desde el entorno es explícita en v3 — pase
config.FromEnvironment() en su cadena de opciones de configuración para activarla.
| Variable | Descripción |
|---|---|
MIDAZ_ENVIRONMENT | Entorno objetivo (local, development, production). |
MIDAZ_BASE_URL | URL base única usada cuando no se establecen URLs específicas por servicio. |
MIDAZ_ONBOARDING_URL | Sobrescribe la URL base del servicio de onboarding. |
MIDAZ_TRANSACTION_URL | Sobrescribe la URL base del servicio de transactions. |
MIDAZ_CRM_URL | Sobrescribe la URL base del servicio de CRM (usada por Holders y Aliases). |
PLUGIN_AUTH_ENABLED | Activa la autenticación con Access Manager (true o false). |
PLUGIN_AUTH_ADDRESS | Dirección del servicio Access Manager. |
MIDAZ_CLIENT_ID | Client ID para autenticación con Access Manager. |
MIDAZ_CLIENT_SECRET | Client secret para autenticación con Access Manager. |
MIDAZ_TIMEOUT | Timeout de petición HTTP en segundos. |
MIDAZ_USER_AGENT | Header User-Agent personalizado enviado en cada petición. |
MIDAZ_DEBUG | Activa logs de debug (true o false). |
MIDAZ_MAX_RETRIES | Cantidad máxima de reintentos para peticiones fallidas. |
MIDAZ_IDEMPOTENCY | Activa la generación automática de claves de idempotencia para peticiones no seguras. |
MIDAZ_SKIP_AUTH_CHECK | Omite la validación de la configuración del Access Manager al iniciar (solo para pruebas). |
midaz, pkg/config y pkg/sdkctx, vea la Guía de configuración en el repositorio del SDK.
Proyectos de ejemplo
| Ejemplo | Qué demuestra |
|---|---|
01-hello-world | Inicialización mínima más la primera llamada de API (~17 líneas de cuerpo). |
02-auth | Autenticación con Access Manager (configuración de producción). |
03-end-to-end | Org → ledger → asset → cuenta → transacción. |
04-listing-cursor | Paginación basada en cursor con iter.Seq2. |
05-listing-pages | Paginación basada en page — List / ListAll / ListPages. |
06-idempotency | Modos de idempotencia auto / explícito / suprimido. |
07-retries | Política por defecto, política personalizada, reintentos deshabilitados. |
08-logging-slog | Integración con *slog.Logger (logging en v3). |
09-testing-with-mocks | go.uber.org/mock para hacer unit testing de su código contra el SDK. |
10-observability-otel | Superficie completa de OpenTelemetry (tracing + métricas + logs). |
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 haya superado el conjunto enfocado.
Migrando de v2
v3 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. Cambie su import de /v2 a /v3 y recorra 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/v3(era/v2), paquetemidaz(eraclient). - Autenticación:
WithAuthTokendesapareció. UseWithAccessManagerpara producción oWithAnonymouspara stacks locales. Una fuente de auth es obligatoria al construir. - Acceso a servicios:
c.Accounts.X(erac.Entity.Accounts.X). El campoc.Entityaún existe por compatibilidad, pero cada ejemplo usa la forma corta. - Paginación:
models.ListOptionsy sus 30 setters fluidos desaparecieron. Use los opts tipados por endpoint (models.AccountsListOpts,models.TransactionsListOpts, …) y los nuevos iteradoresListAll/ListPages. - Errores:
*MidazErrordesapareció. Los errores de la capa de servicios ahora usan*pkg/errors.ErrorconRetryable()como fuente oficial de reintento. La validación local puede exponer*pkg/validation.FieldErrors. - Identidad de tenant:
WithTenantID, la variable de entornoMIDAZ_TENANT_IDy el headerX-Tenant-IDdesaparecieron. El alcance de tenant fluye a través de los claims del Access Manager / JWT. - Logging:
*slog.Loggerreemplaza a la interface a medidaobservability.Loggercomo superficie canónica. El SDK es silencioso por defecto.
Explorar las APIs
Para más información sobre las APIs, consulte los siguientes enlaces:

