Saltar al contenido principal

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.

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.
¿Viene de v2? v3 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 — usted cambia su import de /v2 a /v3 y migra al mismo tiempo.Lea la Guía de migración de v2 a v3 antes de actualizar.

Comenzando


Paso 1 – Instalar Go

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

Paso 2 – Crear o usar un proyecto Go existente

Crear un proyecto Go: Para crear un proyecto Go, use el siguiente comando:
mkdir my-midaz-app
cd my-midaz-app
go mod init my-midaz-app
Usar un proyecto Go existente: Si está trabajando en un proyecto existente, asegúrese de que haya un archivo go.mod en la raíz. Si no, ejecute el siguiente comando para crear uno:
go mod init your-module-name

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 archivos go.mod y go.sum:
La ruta del módulo requiere el sufijo /v3. Si lo omite, Go resolverá una versión obsoleta anterior a v3 que carece de todos los cambios incluidos en esta versión. Importe siempre github.com/LerianStudio/midaz-sdk-golang/v3.
go get github.com/LerianStudio/midaz-sdk-golang/v3
¿Usa VS Code o GoLand? Su IDE puede ejecutar automáticamente go get cuando importe un nuevo paquete.

Paso 4 – Importar el SDK

Cree o abra un archivo main.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.
package main

import (
	"context"
	"fmt"
	"log"

	"github.com/LerianStudio/midaz-sdk-golang/v3"
	"github.com/LerianStudio/midaz-sdk-golang/v3/models"
)

func main() {
	// Build a client. v3 requires exactly one auth source — use
	// midaz.WithAnonymous() for a local stack, or midaz.WithAccessManager(...)
	// for a development or production environment.
	c, err := midaz.New(
		midaz.WithEnvironment(midaz.EnvironmentLocal),
		midaz.WithAnonymous(),
	)
	if err != nil {
		log.Fatalf("midaz.New: %v", err)
	}
	defer c.Shutdown(context.Background())

	ctx := context.Background()

	// List the first 5 organizations using a typed list-opts struct.
	page, err := c.Organizations.ListOrganizations(ctx, models.OrganizationsListOpts{
		PageListOpts: models.PageListOpts{Limit: 5},
	})
	if err != nil {
		log.Fatalf("ListOrganizations: %v", err)
	}

	for _, org := range page.Items {
		fmt.Printf("- %s (%s)\n", org.LegalName, org.ID)
	}

	// Create a new organization. Notice that midaz.CreateOrganizationInput is
	// the same type as models.CreateOrganizationInput — re-exported on the
	// midaz package so most user code only needs one import.
	dba := "Example Inc."
	org, err := c.Organizations.CreateOrganization(ctx, &midaz.CreateOrganizationInput{
		LegalName:       "Example Corporation",
		LegalDocument:   "123456789",
		DoingBusinessAs: &dba, // optional fields are *string — use &local for short literals
		Address: midaz.Address{
			Line1:   "123 Main St",
			City:    "New York",
			State:   "NY",
			ZipCode: "10001",
			Country: "US",
		},
	})
	if err != nil {
		log.Fatalf("CreateOrganization: %v", err)
	}

	fmt.Printf("Organization created: %s\n", org.ID)
}
Esto le 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.
¿Quiere aprender más sobre autenticación? Vaya a la sección Autenticación para la configuración completa.

Paso 5 – Ejecutar el proyecto

Ejecute el siguiente comando:
go run main.go

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

CapaDe qué se encarga
ClientEl punto de entrada principal — midaz.New(...) cablea autenticación, reintentos y observabilidad.
ServicesAcceso de alto nivel a cada dominio de Midaz, expuesto como campos promovidos en el cliente.
ModelsLas estructuras de datos core que reflejan la lógica de dominio de Midaz, reexportadas en el paquete midaz.
Paquetes de utilidadHelpers 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.
¿Quiere profundizar más? Consulte el racional de diseño v3 para conocer toda la historia arquitectónica detrás de la reescritura.

Servicios

La capa Services 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

ServicioQué hace
c.OrganizationsGestionar organizaciones.
c.LedgersCrear y obtener Ledgers.
c.AssetsDefinir y gestionar assets.
c.AssetRatesConfigurar y consultar tasas de cambio de assets.
c.AccountsGestionar cuentas y consultar saldos.
c.AccountTypesGestionar definiciones de tipos de cuenta.
c.PortfoliosAgrupar cuentas dentro de portafolios.
c.SegmentsCategorizar cuentas usando segments.
c.TransactionsCrear y buscar transacciones financieras.
c.TransactionRoutesDefinir y gestionar reglas de enrutamiento de transacciones.
c.OperationsProfundizar en las operaciones atómicas dentro de una transacción.
c.OperationRoutesDefinir y gestionar reglas de enrutamiento de operaciones.
c.BalancesObtener saldos de cuentas en tiempo real.
c.HoldersGestionar titulares de cuenta del CRM.
c.AliasesGestionar aliases del CRM para cuentas y entidades.
c.MetadataIndexesGestionar í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 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

ModelQué representa
midaz.OrganizationUna entidad de negocio que es dueña de Ledgers y cuentas.
midaz.LedgerUna colección de cuentas y transacciones.
midaz.AssetUna unidad de valor (moneda, token, etc.) que puede ser almacenada o movida.
midaz.AccountUna cuenta para rastrear assets y saldos.
midaz.PortfolioUna colección de cuentas para agrupación y gestión.
midaz.SegmentUna unidad de categorización para organización granular.
midaz.TransactionUn evento financiero compuesto por múltiples operaciones.
midaz.OperationUna entrada individual de débito o crédito dentro de una transacción.
midaz.BalanceEl estado actual de las tenencias de una cuenta.
¿Necesita un builder, una forma de request interna o un tipo deprecado? Importe github.com/LerianStudio/midaz-sdk-golang/v3/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á 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

PaqueteQué resuelve
authOAuth con Access Manager y ciclo de vida de tokens. Reemplaza al paquete access-manager de v2.
configManejo centralizado de configuración, overrides por env y URLs de servicio personalizadas.
concurrentHerramientas para procesamiento por lotes, rate-limiting y worker pools.
errorsTipos de error estructurados, clasificadores y el predicado canónico Retryable().
observabilityTracing, métricas y logs a través de un único proveedor de OpenTelemetry.
retryOpciones de política de reintentos con backoff exponencial y jitter.
sdkctxFlags de context por request — claves de idempotencia, soft vs hard delete, include-deleted.
validationValidación de input con mensajes de error claros y estructurados.

Paquetes ayudantes

PaqueteQué resuelve
accountsHelpers específicos de cuenta y funciones de conveniencia.
conversionHelpers de conversión de tipos entre models y formatos externos.
dataUtilidades de datos y helpers de faker para tests y demos.
formatUtilidades para formatear datos al estilo Midaz (fechas, horas, etc.).
generatorGeneración de datos de demo y masivos para escenarios end-to-end.
integrityUtilidades de checksum y verificación de integridad.
performanceHelpers para afinar operaciones en bloque y tareas de alto throughput.
securityUtilidades de seguridad, incluyendo protección contra SSRF y validación TLS.
statsEstadísticas de procesamiento y agregación de métricas.
transactionHelpers de construcción de transacciones y builders fluidos.
utilsHelpers de propósito general usados a lo largo del SDK.
versionMetadatos 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.
Las dos opciones son mutuamente excluyentes.

Producción: Access Manager

Conecte sus 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.
Reemplace los valores en el bloque // Configure Access Manager con sus propias credenciales antes de ejecutar.
package main

import (
	"context"
	"log"
	"os"

	"github.com/LerianStudio/midaz-sdk-golang/v3"
)

func main() {
	// Configure Access Manager. ClientID and ClientSecret are typically
	// loaded from environment variables — never hardcoded.
	c, err := midaz.New(
		midaz.WithEnvironment(midaz.EnvironmentProduction),
		midaz.WithAccessManager(midaz.AccessManager{
			Address:      "https://auth.midaz.io",
			ClientID:     os.Getenv("MIDAZ_CLIENT_ID"),
			ClientSecret: os.Getenv("MIDAZ_CLIENT_SECRET"),
		}),
	)
	if err != nil {
		log.Fatalf("midaz.New: %v", err)
	}
	defer c.Shutdown(context.Background())

	// Use c.Organizations, c.Ledgers, c.Accounts, ... as usual.
}
El SDK solicita un token a su 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ívela explícitamente:
c, err := midaz.New(
    midaz.WithEnvironment(midaz.EnvironmentLocal),
    midaz.WithAnonymous(),
)

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:
export PLUGIN_AUTH_ENABLED=true
export PLUGIN_AUTH_ADDRESS=https://your-auth-service.com
export MIDAZ_CLIENT_ID=your-client-id
export MIDAZ_CLIENT_SECRET=your-client-secret
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()).
Luego active la carga desde el entorno al momento de configurar:
import "github.com/LerianStudio/midaz-sdk-golang/v3/pkg/config"

cfg, err := config.NewConfig(config.FromEnvironment())
if err != nil {
    log.Fatalf("config: %v", err)
}

c, err := midaz.New(midaz.WithConfig(cfg))
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.
¿Quiere el recorrido completo de auth? Consulte 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, 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étodoRetornaUse cuando
ListXxx*models.ListResponse[T] (una page)Quiere exactamente una page y decide cuándo avanzar.
ListXxxAlliter.Seq2[T, error]Quiere cada item; el SDK maneja la paginación internamente.
ListXxxPagesiter.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ónEndpointsStruct base
Basada en pageOrganizations, Ledgers, Assets, Portfolios, Segments, Accounts, AccountTypes, Balances, Holders, Aliasesmodels.PageListOpts{Limit, Page, SortDirection, StartDate, EndDate}
Basada en cursorTransactions, Operations, OperationRoutes, TransactionRoutes, AssetRatesmodels.CursorListOpts{Limit, Cursor, SortDirection, StartDate, EndDate}
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.
import (
    "github.com/LerianStudio/midaz-sdk-golang/v3"
    "github.com/LerianStudio/midaz-sdk-golang/v3/models"
)

opts := models.AccountsListOpts{
    PageListOpts: models.PageListOpts{Limit: 100},
    Filters: models.AccountsFilters{
        Status:    "ACTIVE",
        AssetCode: "USD",
    },
}

for account, err := range c.Accounts.ListAccountsAll(ctx, orgID, ledgerID, opts) {
    if err != nil {
        return fmt.Errorf("list accounts: %w", err)
    }
    process(account)
}

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.
opts := models.TransactionsListOpts{
    CursorListOpts: models.CursorListOpts{Limit: 50},
    Filters:        models.TransactionsFilters{Status: "APPROVED"},
}

for page, err := range c.Transactions.ListTransactionsPages(ctx, orgID, ledgerID, opts) {
    if err != nil {
        return fmt.Errorf("page iter: %w", err)
    }
    log.Printf("page=%d items=%d next_cursor=%q",
        page.Pagination.Page, len(page.Items), page.Pagination.NextCursor)

    for _, tx := range page.Items {
        process(tx)
    }

    if shouldStop(page) {
        break // The SDK aborts in-flight paging cleanly.
    }
}
Vea 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:
CampoQué transporta
CategoryLa clase del error (validation, authentication, network, configuration, etc.).
CodeUn string code estable, apto para branching o telemetría.
OperationLa operación del SDK que produjo el error (p. ej. Accounts.GetAccount).
ResourceLa familia de recursos a la que se refiere el error, cuando es relevante.
Puede 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 pueda hacer match con errores sin hurgar en los internos:
import (
    "errors"
    "fmt"

    sdkerrors "github.com/LerianStudio/midaz-sdk-golang/v3/pkg/errors"
)

acc, err := c.Accounts.GetAccount(ctx, orgID, ledgerID, accountID)
if err != nil {
    switch {
    case sdkerrors.IsNotFoundError(err):
        return fmt.Errorf("account not found: %w", err)
    case sdkerrors.IsAuthError(err):
        // Matches both 401 and 403 — re-authenticate or fix permissions.
        return fmt.Errorf("auth failure: %w", err)
    case sdkerrors.IsValidationError(err):
        return fmt.Errorf("invalid input: %w", err)
    case sdkerrors.IsConflictError(err):
        return fmt.Errorf("already exists: %w", err)
    case sdkerrors.IsRateLimitError(err):
        return fmt.Errorf("rate limited: %w", err)
    case sdkerrors.IsNetworkError(err):
        return fmt.Errorf("transient transport: %w", err)
    case sdkerrors.IsConfigurationError(err):
        return fmt.Errorf("setup mistake: %w", err)
    }

    // Walk the structured fields when you need them.
    var sdkErr *sdkerrors.Error
    if errors.As(err, &sdkErr) {
        log.Printf("op=%s resource=%s code=%s retryable=%v",
            sdkErr.Operation, sdkErr.Resource, sdkErr.Code, sdkErr.Retryable())
    }
}

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.
var sdkErr *sdkerrors.Error
if errors.As(err, &sdkErr) && sdkErr.Retryable() {
    // Apply your retry logic — backoff, jitter, max attempts, etc.
}

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, use ClassifyTransportError:
import sdkerrors "github.com/LerianStudio/midaz-sdk-golang/v3/pkg/errors"

resp, err := httpClient.Do(req)
if err != nil {
    return sdkerrors.ClassifyTransportError("PaymentService.Charge", err)
}

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.
import (
    "errors"
    "fmt"

    "github.com/LerianStudio/midaz-sdk-golang/v3/pkg/validation"
)

var fieldErrs *validation.FieldErrors
if errors.As(err, &fieldErrs) {
    for _, fe := range fieldErrs.Errs() {
        fmt.Printf("- %s: %s\n", fe.Field, fe.Message)
    }
}
¿Quiere profundizar más? Consulte 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 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.
package main

import (
    "context"
    "log"
    "log/slog"
    "os"

    "github.com/LerianStudio/midaz-sdk-golang/v3"
)

func main() {
    logger := slog.New(slog.NewJSONHandler(os.Stdout, &slog.HandlerOptions{
        Level: slog.LevelInfo,
    }))

    c, err := midaz.New(
        midaz.WithEnvironment(midaz.EnvironmentLocal),
        midaz.WithAnonymous(),
        midaz.WithLogger(logger),
    )
    if err != nil {
        log.Fatalf("midaz.New: %v", err)
    }
    defer c.Shutdown(context.Background())

    // SDK retry diagnostics, slow-call warnings, and other internal
    // log lines now flow through your handler.
}
¿Necesita 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á 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 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

package main

import (
    "context"
    "log"

    "github.com/LerianStudio/midaz-sdk-golang/v3"
    "github.com/LerianStudio/midaz-sdk-golang/v3/pkg/observability"
)

func main() {
    ctx := context.Background()

    provider, err := observability.New(ctx,
        observability.WithServiceName("payments-api"),
        observability.WithEnvironment("production"),
        observability.WithComponentEnabled(true, true, true), // tracing, metrics, logs
    )
    if err != nil {
        log.Fatalf("observability.New: %v", err)
    }
    defer provider.Shutdown(ctx)

    c, err := midaz.New(
        midaz.WithEnvironment(midaz.EnvironmentProduction),
        midaz.WithAccessManager(midaz.AccessManager{ /* ... */ }),
        midaz.WithObservabilityProvider(provider),
    )
    if err != nil {
        log.Fatalf("midaz.New: %v", err)
    }
    defer c.Shutdown(ctx)
}

O pasar opciones inline

import "github.com/LerianStudio/midaz-sdk-golang/v3/pkg/observability"

c, err := midaz.New(
    midaz.WithEnvironment(midaz.EnvironmentProduction),
    midaz.WithAccessManager(am),
    midaz.WithObservabilityOptions(
        observability.WithServiceName("payments-api"),
        observability.WithComponentEnabled(true, true, true),
    ),
)
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 puede envolver un bloque de lógica de negocio en un span vía Client.Trace:
err = c.Trace("create-organization", func(ctx context.Context) error {
    _, err := c.Organizations.CreateOrganization(ctx, input)
    return err
})
WithObservabilityOptions y WithObservabilityProvider usan semántica de reemplazo, no merge. Cada llamada reemplaza al proveedor previamente instalado. Para partir de una baseline, incluya observability.WithDevelopmentDefaults u observability.WithProductionDefaults como la primera opción en la cadena.
¿Quiere profundizar más? Consulte 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 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

import "github.com/LerianStudio/midaz-sdk-golang/v3/pkg/sdkctx"

ctx := sdkctx.WithIdempotencyKey(context.Background(), "tx-2026-05-06-001")

tx, err := c.Transactions.CreateTransaction(ctx, orgID, ledgerID, input)

Suprimir idempotencia para una sola llamada

Para los raros endpoints administrativos de tipo fire-and-forget, suprima el header por petición:
ctx := sdkctx.WithoutAutoIdempotency(context.Background())

err := c.SomeAdminService.DoOneShotThing(ctx, input)

Deshabilitar globalmente

Si no quiere auto-idempotencia en ningún lado, desactívela a nivel del cliente:
c, err := midaz.New(
    midaz.WithEnvironment(midaz.EnvironmentLocal),
    midaz.WithAnonymous(),
    midaz.WithIdempotency(false),
)
También puede deshabilitarla mediante la variable de entorno 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.
VariableDescripción
MIDAZ_ENVIRONMENTEntorno objetivo (local, development, production).
MIDAZ_BASE_URLURL base única usada cuando no se establecen URLs específicas por servicio.
MIDAZ_ONBOARDING_URLSobrescribe la URL base del servicio de onboarding.
MIDAZ_TRANSACTION_URLSobrescribe la URL base del servicio de transactions.
MIDAZ_CRM_URLSobrescribe la URL base del servicio de CRM (usada por Holders y Aliases).
PLUGIN_AUTH_ENABLEDActiva la autenticación con Access Manager (true o false).
PLUGIN_AUTH_ADDRESSDirección del servicio Access Manager.
MIDAZ_CLIENT_IDClient ID para autenticación con Access Manager.
MIDAZ_CLIENT_SECRETClient secret para autenticación con Access Manager.
MIDAZ_TIMEOUTTimeout de petición HTTP en segundos.
MIDAZ_USER_AGENTHeader User-Agent personalizado enviado en cada petición.
MIDAZ_DEBUGActiva logs de debug (true o false).
MIDAZ_MAX_RETRIESCantidad máxima de reintentos para peticiones fallidas.
MIDAZ_IDEMPOTENCYActiva la generación automática de claves de idempotencia para peticiones no seguras.
MIDAZ_SKIP_AUTH_CHECKOmite la validación de la configuración del Access Manager al iniciar (solo para pruebas).
Para la matriz completa de opciones a lo largo de midaz, pkg/config y pkg/sdkctx, vea 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órelos en el directorio de ejemplos en GitHub.
EjemploQué demuestra
01-hello-worldInicialización mínima más la primera llamada de API (~17 líneas de cuerpo).
02-authAutenticación con Access Manager (configuración de producción).
03-end-to-endOrg → ledger → asset → cuenta → transacción.
04-listing-cursorPaginación basada en cursor con iter.Seq2.
05-listing-pagesPaginación basada en page — List / ListAll / ListPages.
06-idempotencyModos de idempotencia auto / explícito / suprimido.
07-retriesPolítica por defecto, política personalizada, reintentos deshabilitados.
08-logging-slogIntegración con *slog.Logger (logging en v3).
09-testing-with-mocksgo.uber.org/mock para hacer unit testing de su código contra el SDK.
10-observability-otelSuperficie completa de OpenTelemetry (tracing + métricas + logs).
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 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), paquete midaz (era client).
  • Autenticación: WithAuthToken desapareció. Use 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. Use 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, lea la Guía de migración de v2 a v3.

Explorar las APIs


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

Mapeo de APIs externas

Mapeo de APIs internas

Documentación Godoc