Integrating Tracer means deciding where in your authorization flow to make the validation call, what data to send, and how to handle the three possible decisions. The pattern is short: your system collects the full transaction context, callsDocumentation Index
Fetch the complete documentation index at: https://docs.lerian.studio/llms.txt
Use this file to discover all available pages before exploring further.
POST /v1/validations, acts on ALLOW / DENY / REVIEW, and moves on. Tracer never reaches back into your stack — there are no webhooks or callbacks; the integration ends with the response.
What changes in your operation: decisioning moves from in-process logic to an external call. The call is synchronous (request/response, no webhooks), so it sits on the critical path of the transaction. Done well, it adds under 80ms p99 and gives you a single point for policy and audit. Done poorly — no timeout, no retry strategy, no fallback — it becomes a single point of failure.
Trade-off to be honest about: you’re adding a network hop. The good news is the contract is simple: idempotent by requestId, no callbacks, deterministic three-state response. The bad news is you need to think about timeouts, retries, and what to do if Tracer is unreachable — most of this guide is about that.
This guide covers payload requirements, the integration flow, and practices that keep the validation call inside your latency budget.
Integration overview
Tracer is designed to be called by authorization systems (payment gateways, workflow orchestrators, or transaction processors) that need real-time validation decisions. The integration follows a simple request-response pattern:

Payload-Complete Pattern
Tracer uses the Payload-Complete Pattern, which means all context required for validation must be included in the request. This design ensures:
| Benefit | Description |
|---|---|
| Predictable latency | No external calls during validation; response time stays under 80ms |
| Simplicity | Single request contains everything needed for decision |
| Reliability | No dependency on external services during validation |
| Flexibility | Your system controls data freshness and enrichment logic |
Your responsibilities
As the integrating system, you are responsible for:- Enriching the payload with account, segment, portfolio, and merchant data before calling Tracer
- Providing accurate context for rule and limit evaluation—Tracer cannot fetch missing data
- Handling the decision (ALLOW, DENY, or REVIEW) appropriately in your workflow
- Implementing retry logic if Tracer is temporarily unavailable
- Managing review workflows when Tracer returns
REVIEW—Tracer does not include case management
Tracer’s responsibilities
Tracer is responsible for:- Evaluating rules against the provided context
- Checking limits against current usage
- Recording audit trail for compliance
- Returning decision with detailed information
Integration flow
Follow these steps to integrate your system with Tracer.
Step 1: Prepare the transaction context
Before calling Tracer, gather all relevant data from your systems:
Step 2: Call Tracer API
Send a POST request to/v1/validations with the complete transaction context including:
- Transaction details (type, subType, amount, currency, timestamp)
- Account information (required)
- Optional: segment, portfolio, merchant, and custom
Step 3: Handle the response
Process the decision returned by Tracer:| Decision | Action |
|---|---|
ALLOW | Proceed with the transaction |
DENY | Reject the transaction; show reason to user if appropriate |
REVIEW | Queue for manual review in your review system |
validationId for audit trail correlation, details about which rules matched, and current limit usage information.
Using metadata
Metadata allows you to pass custom fields that your rules can evaluate. Use this for context like channel, device information, customer tier, or any business-specific attributes.Metadata keys must be alphanumeric with underscores only, maximum 64 characters. Maximum 50 entries per request.
Request idempotency
Validation requests are idempotent based on the
requestId field. If you send the same requestId twice, Tracer returns the cached result from the first request instead of reprocessing.
| Response code | Meaning |
|---|---|
201 Created | New validation processed |
200 OK | Duplicate request detected; cached result returned |
requestId ensures exactly-once processing semantics.
Idempotency contract:
- Same
requestId→ Same response (guaranteed) - Different
requestId→ Independent processing (even if transaction data is identical)
Authentication
Tracer supports two authentication modes that can be used independently or combined.
API key authentication
The simplest option. Send your API key in theX-API-Key header with every request.
| Environment variable | Description |
|---|---|
API_KEY_ENABLED | Enable API key authentication (default: false) |
API_KEY | The secret key value |
API_KEY_ENABLED_ONLY_VALIDATION | Use API key only for the /v1/validations endpoint (default: false) |
Plugin authentication (Access Manager)
For enterprise deployments, Tracer can delegate authentication to the Lerian Access Manager. This enables centralized authentication across all Lerian services.| Environment variable | Description |
|---|---|
PLUGIN_AUTH_ENABLED | Enable plugin authentication (default: false) |
PLUGIN_AUTH_ADDRESS | URL of the auth service (default: http://localhost:4000) |
Authentication priority
When both modes are enabled, Tracer uses this priority:- If
PLUGIN_AUTH_ENABLED=trueand the endpoint is not flagged for API-key-only → Plugin auth - If
API_KEY_ENABLED=trueor the endpoint is flagged for API-key-only → API key auth
/v1/* API surface documented in this reference.
The
/v1/validations endpoint can be configured for API-key-only authentication via API_KEY_ENABLED_ONLY_VALIDATION=true. This is useful in high-throughput scenarios where plugin auth adds unacceptable latency. This flag is incompatible with multi-tenant mode (MULTI_TENANT_ENABLED=true) — the service fails to start with TRC-0327.Multi-tenant authentication
WhenMULTI_TENANT_ENABLED=true, Tracer runs in multi-tenant mode and the authentication model changes:
- Plugin auth is required. The service fails to start with TRC-0326 if
PLUGIN_AUTH_ENABLED=false. - Every
/v1/*request must carry a JWT bearer token issued by Access Manager:Authorization: Bearer <jwt>. tenantIdis resolved from the JWT claim, not from a header, path, body, metadata, or rule scope. There is noX-Tenant-IDheader — passing the tenant identifier anywhere other than the token claim is unsupported and ignored.- Each tenant operates on its own PostgreSQL database. The tenant-specific connection is resolved by the platform’s Tenant Manager service at request time.
- Public endpoints (
/health,/readyz,/version,/swagger/*) stay unauthenticated in multi-tenant mode too — the bearer-token requirement applies only to/v1/*.
"code": "Unauthenticated" (the same code used for missing API keys; no separate TRC code is emitted).
If the multi-tenant deployment hits its per-instance tenant cap, requests for cold tenants return HTTP 503 with TRC-0335 and a Retry-After header. The client should back off and retry; the cap auto-resets as the LRU pool evicts cold tenants.
See Multi-tenancy for the platform-wide tenant model.
Performance considerations
Optimize your integration for low latency and high reliability.
Timeout budget
Tracer is designed to respond in under 80ms (p99). Configure your client timeout accordingly:| Configuration | Recommended value |
|---|---|
| Client timeout | 100ms |
| Connection timeout | 50ms |
| Read timeout | 100ms |
Retry strategy
Implement retry logic for transient failures:Fallback behavior
Decide what happens when Tracer is unavailable:| Strategy | When to use |
|---|---|
| Fail-open | Allow transaction if Tracer is down (prioritize availability) |
| Fail-closed | Deny transaction if Tracer is down (prioritize security) |
| Queue for review | Queue transaction for manual review |
Data freshness
Since you control the payload enrichment, data freshness is your responsibility. Tracer trusts the data you provide and cannot detect stale information.
| Data type | Freshness recommendation | Risk if stale |
|---|---|---|
| Account status | Real-time or near real-time | Transactions on suspended accounts may be allowed |
| Segment membership | Can be cached (changes infrequently) | Wrong limits or rules may apply |
| Portfolio assignment | Can be cached (changes infrequently) | Incorrect scope matching |
| Merchant data | Can be cached with periodic refresh | Risk rules may not trigger correctly |
Date and time format
All datetime fields must use RFC3339 format with mandatory timezone: Valid formats:
Integration checklist
Before going to production, verify:
- API Key is configured and secured
- Each request includes a unique requestId (UUID)
- Client handles both 201 and 200 responses as success
- Client timeout is set to 100ms
- Retry logic is implemented for 5xx errors
- Fallback behavior is defined
- All required fields are populated
- Timestamps use RFC3339 format with timezone
- Currency codes are uppercase ISO 4217
- Decision handling is implemented (ALLOW/DENY/REVIEW)
- Validation IDs are logged for audit trail correlation
Example integration (pseudocode)
Next steps
- Rules engine - Create rules that evaluate against the context you provide
- Spending limits - Configure limits that apply to your transaction scopes
- Audit and compliance - Query validation history and audit trail

