Skip to main content
Tracer is the layer your authorization or onboarding system calls before a transaction goes through. It runs your fraud, risk, and limit policies in milliseconds and returns ALLOW, DENY, or REVIEW. The decision then lives in one place, not scattered across product code. What changes in your operation: decision logic stops living in scattered if statements across services. Rule changes ship through an API the same day, not in the next release. Validation history gives you one place to investigate why a transaction received its decision. Trade-off to be honest about: you add one HTTP call to the critical path of every transaction. The target is p99 under 80ms. In return, you get a single point for policy and decision history, and you remove duplicated logic from product code.
Who is this guide for? Developers (junior or senior) integrating Tracer for the first time. If you’re evaluating Tracer at a product or strategy level, start with What is Tracer. If you already have it running and need API mechanics, jump to the Tracer API quick start.
This guide walks you through setting up Tracer and running your first validation. In a few steps, you’ll have a working environment ready to validate transactions in real time. For step-by-step API instructions with request and response examples, see the Tracer API quick start.

Why use Tracer


  • Real-time validation: Make ALLOW/DENY/REVIEW decisions in under 80ms (p99)
  • Flexible rules: Expression-based rule engine for custom business logic
  • Spending control: Configure limits by account, portfolio, segment, and period
  • Validation history: Stored decisions for investigation and reporting
  • Product-agnostic: Supports any transaction type (Card, Wire, Pix, Crypto)
By the end of this guide, you will:
  • Understand Tracer architecture and core concepts
  • Have a working development environment
  • Run your first transaction validation
  • Configure a spending limit

What is Tracer


Tracer is a transaction validation platform that evaluates rules and limits and returns instant decisions. Your system calls Tracer before it executes a transaction. It then acts on the decision (ALLOW, DENY, or REVIEW) according to your business logic.

How it works

How Tracer processes a validation request across its Validation, Rules, and Limits contexts and returns an ALLOW, DENY, or REVIEW decision

Figure 1. How Tracer works

In this flow:
  • Rules evaluate expressions against the transaction context
  • Limits check spending thresholds for applicable scopes
  • Decision returns ALLOW, DENY, or REVIEW based on evaluation results

Core contexts

Tracer has three bounded contexts:
  1. Validation Context - Orchestrates requests, coordinates evaluation, and stores validation history
  2. Rules Context - Manages rule definitions and expression evaluation
  3. Limits Context - Manages spending limits and usage tracking

Prerequisites


Before you start, make sure you have:
  • Docker and Docker Compose installed
  • Go 1.26+ for local development (the repository’s go.mod declares the exact toolchain version)
  • PostgreSQL 17 (the shared Midaz primary, started by the platform infrastructure compose, not by Tracer’s own)
  • API Key for authentication

Infrastructure dependencies

Tracer requires the following components:

Ports

Default ports used by Tracer services:

Step 1: Set up the environment


You can run Tracer with Docker Compose or locally for development.
Tracer’s own Compose file declares only two services: the application and a one-shot migration runner. PostgreSQL is not one of them. It comes from the shared platform infrastructure Compose and must be healthy first. The application container starts only after the migration runner applies the schema and exits successfully. The service always boots against an already-migrated database.
In Midaz v4, Tracer is source-available under ELv2 in the Midaz repository and release. It still runs as its own service. Start from components/tracer for local development.
Navigate to the Tracer project directory and start the services:

Option B: Local run

For development, you can run Tracer locally:

Essential environment variables


Step 2: Authenticate to the API


Tracer supports API key and plugin authentication. Plugin authentication takes precedence when you enable both, except on endpoints configured as API-key-only. The remaining steps use the single-tenant API key form because most local-development setups run that way. If plugin authentication applies to your request, replace X-API-Key: your-secure-api-key with Authorization: Bearer $JWT in every example.

API Key (single-tenant)

Include the API Key in the X-API-Key header:

Bearer JWT (multi-tenant)

Include the JWT issued by Access Manager in the Authorization header:
Tracer extracts the tenantId claim from the JWT and routes the request to the correct tenant database. You never pass the tenant identifier in a header, path, body, or rule scope. The token is the only source of truth.

cURL example

Keep API Keys and JWTs secure. Never expose them in client-side code or public repositories.
API key authentication is disabled by default (API_KEY_ENABLED=false). The provided .env.example keeps it off, so local development works without setup. A production deployment must set API_KEY_ENABLED=true (single-tenant) or MULTI_TENANT_ENABLED=true and PLUGIN_AUTH_ENABLED=true (multi-tenant) before you expose the service.

Step 3: Configure a spending limit


Spending limits control transaction amounts by scope and period. Create a limit using POST /v1/limits.

Limit types

For detailed configuration of all limit types including time windows and custom periods, see the Spending limits guide.

Scopes

Apply limits to specific contexts:
  • Segment: Apply to all accounts in a segment (e.g., corporate customers)
  • Portfolio: Apply to accounts in a portfolio
  • Account: Apply to a specific account
  • Transaction type: Apply only to CARD, WIRE, PIX, or CRYPTO

Create a limit

Activate a limit

Limit lifecycle

Limits start in DRAFT status and follow the lifecycle DRAFTACTIVEINACTIVE. Inactive limits can return to DRAFT for editing, or you can delete them permanently. Activate a limit to start enforcement. For the full lifecycle and transition rules, see the Spending limits guide.

Monitor usage

Every POST /v1/validations response carries limitUsageDetails, with one entry per limit Tracer checked. Each entry holds the cap, the amount attempted, and the projected consumption of that cap’s current period. That projection includes this transaction. The endpoint GET /v1/limits/{id}/usage reports a cumulative total across the limit’s counters, for a review of overall consumption. For detailed configuration options, see the Spending limits guide.

Step 4: Validate your first transaction


With limits configured, you’re ready to validate a transaction using POST /v1/validations.

Submit a transaction for validation

Send a validation request with the transaction context including:
  • Transaction details (type, amount, asset, timestamp)
  • Account information
  • Optional: segment, portfolio, merchant, and custom
The transactionTimestamp must be recent, which is why the example generates it. Tracer rejects a future timestamp with error code 0419 (1-minute clock skew tolerance). Tracer rejects a timestamp older than 24 hours with error code 0421.
requestId is the idempotency key. Send a new UUID for each attempt. If you repeat one, Tracer returns the decision it already recorded for that key. A rule you activated in between will not appear to take effect.
Tracer evaluates the rules and limits that apply to the transaction, then returns one of three decisions: The response names the rules Tracer evaluated, the rules that matched, and the current limit usage. That detail helps with debugging and customer support.
Why Tracer returns a decision instead of blocking directly. Tracer works as a decisioning layer, not an authorization gateway. The calling system holds the customer relationship and knows the channel. It decides what to do with a DENY. For example, your card-issuing system may honor a DENY for a stand-in pre-auth. It may still capture the request for analytics. By returning a decision, Tracer fits into any authorization flow without owning the customer-facing UX.
For complete payload structure and field details, see the API reference.

Step 5: Create a validation rule


Rules let you define custom business logic that evaluates during validation. Create a rule using the POST /v1/rules endpoint with an expression, action, and optional scopes. For example, to block high-value transactions:
Tracer preserves the name’s case and internal whitespace, trimming only leading and trailing whitespace before storage. Take the ruleId from the response and use it in the activate call below.

Activate a rule

Activation takes effect right away on the instance that served the activate call. A single-instance setup evaluates the rule on your next validation. When you run several instances behind a load balancer, the others pick the change up on their next rule sync. The interval is RULE_SYNC_POLL_INTERVAL_SECONDS, default 10. Deactivation propagates the same way.

Rule lifecycle

Rules follow the same lifecycle as limits: DRAFTACTIVEINACTIVE. To start evaluation, activate the rule using POST /v1/rules/{id}/activate. You can deactivate and reactivate an active rule as needed. For detailed information about rule expressions and lifecycle management, see the Rules engine guide.

Observability


Tracer exposes endpoints for monitoring and observability.

Key metrics

Tracer exposes OpenTelemetry-compatible metrics via the OTLP exporter, plus custom application metrics:
  • tracer_auth_failures_total{reason} - Authentication failures by reason (missing_api_key, invalid_api_key)
  • tracer_validation_rollback_failures_total - Usage rollback failures during REVIEW decisions (eventual consistency gaps that self-correct at period boundaries)
Tracer’s built-in OpenTelemetry HTTP middleware provides standard HTTP request metrics automatically.

Verification


Confirm that everything works correctly.

Checklist

  • Docker services started and healthy
  • API Key authentication working
  • Spending limit configured
  • Test transaction validated successfully
  • Rule created and activated

Next steps


You’ve set up Tracer and validated your first transaction. From here, you can explore more advanced features:

Quick reference


The three flows you’ll use most: For the full endpoint catalog, request/response schemas, and error codes, see the API reference.

What your system should do with each decision

Tracer returns decisions as recommendations. Your system must implement the appropriate action for each decision.