> ## 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.

# Validar uma Transação

> Use este endpoint para validar uma transação em tempo real contra regras e limites configurados. Retorna uma decisão (ALLOW, DENY ou REVIEW) junto com detalhes sobre quais regras corresponderam e uso de limites. A meta de desempenho é inferior a 80ms (p99).



## OpenAPI

````yaml pt/openapi/v3-current/tracer.yaml post /v1/validations
openapi: 3.1.0
info:
  title: API Tracer
  description: >-
    Referência completa da API para os serviços do Tracer, incluindo validação
    de transações, gerenciamento de regras, limites de gastos e eventos de
    auditoria para conformidade SOX/GLBA.
  version: 1.0.1
servers:
  - url: https://tracer.sandbox.lerian.net
security:
  - ApiKeyAuth: []
  - BearerAuth: []
tags:
  - name: Health API
    description: >-
      Endpoints de verificação de integridade para sondas de vivacidade e
      prontidão. Estes endpoints não requerem autenticação.
  - name: Validations API
    description: >-
      Endpoints de validação de transações. A meta de desempenho é inferior a
      80ms (p99). As validações são idempotentes por `requestId` — uma
      requisição duplicada retorna o resultado em cache com HTTP 200, enquanto
      uma requisição nova retorna HTTP 201. Nenhum header de idempotência é
      necessário.
  - name: Rules API
    description: >-
      Endpoints de gerenciamento de regras de validação. As regras utilizam
      expressões CEL (Common Expression Language).
  - name: Limits API
    description: >-
      Endpoints de gerenciamento de limites de gastos. Os limites controlam os
      valores das transações por escopo e período.
  - name: Reservations API
    description: >-
      Endpoints de reserva de capacidade de transação em duas fases. Uma reserva
      retém capacidade contra os limites de gastos; uma confirmação a consolida
      e uma liberação a devolve. Confirmar e liberar são idempotentes.
  - name: Audit Events API
    description: >-
      Endpoints de trilha de auditoria para conformidade SOX/GLBA. Todas as
      decisões de validação e alterações de configuração são registradas.
paths:
  /v1/validations:
    post:
      tags:
        - Validations API
      summary: Validar uma Transação
      description: >-
        Use este endpoint para validar uma transação em tempo real contra regras
        e limites configurados. Retorna uma decisão (ALLOW, DENY ou REVIEW)
        junto com detalhes sobre quais regras corresponderam e uso de limites. A
        meta de desempenho é inferior a 80ms (p99).
      operationId: validateTransaction
      parameters:
        - $ref: '#/components/parameters/ContentType'
        - $ref: '#/components/parameters/XApiKey'
        - $ref: '#/components/parameters/XRequestId'
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/ValidationRequest'
            example:
              requestId: 019c96a0-10ce-75fc-a273-dc799079a99c
              transactionType: CARD
              subType: debit
              amount: '1500.00'
              currency: BRL
              transactionTimestamp: '2026-01-30T10:30:00Z'
              account:
                accountId: 019c96a0-0c0c-7221-8cf3-13313fb60081
                type: checking
                status: active
              segment:
                segmentId: 019c96a0-0b4e-7079-8be0-ab6bdccf975f
                name: corporate
              merchant:
                merchantId: 019c96a0-4f70-7678-e1f2-7b8c9d0e1f2a
                name: Store ABC
                category: '5411'
                country: BR
              metadata:
                channel: MOBILE_APP
                deviceId: device-abc123
      responses:
        '200':
          description: >-
            Requisição duplicada detectada (replay idempotente). Retorna o
            resultado de validação em cache da requisição original. O corpo da
            resposta é idêntico ao da resposta 201 original.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ValidationResponse'
              example:
                requestId: 019c96a0-10ce-75fc-a273-dc799079a99c
                validationId: 019c96a0-10d2-7193-8841-0d7347efd09a
                decision: ALLOW
                reason: Transação aprovada
                matchedRuleIds: []
                evaluatedRuleIds:
                  - 019c96a0-1071-7a0d-9916-a831221de252
                  - 019c96a0-4b30-7234-a1b2-3d4e5f6a7b8c
                limitUsageDetails:
                  - limitId: 019c96a0-0c0d-7915-84b9-e497bfee9916
                    limitAmount: '50000.00'
                    currentUsage: '16500.00'
                    exceeded: false
                    period: DAILY
                processingTimeMs: 23
        '201':
          description: >-
            Validação processada com sucesso. Retornado para novas requisições
            de validação (requestId único).
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ValidationResponse'
              example:
                requestId: 019c96a0-10ce-75fc-a273-dc799079a99c
                validationId: 019c96a0-10d2-7193-8841-0d7347efd09a
                decision: ALLOW
                reason: Transação aprovada
                matchedRuleIds: []
                evaluatedRuleIds:
                  - 019c96a0-1071-7a0d-9916-a831221de252
                  - 019c96a0-4b30-7234-a1b2-3d4e5f6a7b8c
                limitUsageDetails:
                  - limitId: 019c96a0-0c0d-7915-84b9-e497bfee9916
                    limitAmount: '50000.00'
                    currentUsage: '16500.00'
                    exceeded: false
                    period: DAILY
                processingTimeMs: 23
        '400':
          description: ''
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorFormat'
              examples:
                Error0001:
                  $ref: '#/components/examples/Error0001'
                Error0003:
                  $ref: '#/components/examples/Error0003'
                Error0060:
                  $ref: '#/components/examples/Error0060'
                Error0063:
                  $ref: '#/components/examples/Error0063'
                Error0064:
                  $ref: '#/components/examples/Error0064'
                Error0089:
                  $ref: '#/components/examples/Error0089'
                Error0220:
                  $ref: '#/components/examples/Error0220'
                Error0221:
                  $ref: '#/components/examples/Error0221'
                Error0222:
                  $ref: '#/components/examples/Error0222'
                Error0223:
                  $ref: '#/components/examples/Error0223'
                Error0224:
                  $ref: '#/components/examples/Error0224'
                Error0225:
                  $ref: '#/components/examples/Error0225'
                Error0226:
                  $ref: '#/components/examples/Error0226'
                Error0227:
                  $ref: '#/components/examples/Error0227'
                Error0228:
                  $ref: '#/components/examples/Error0228'
                Error0230:
                  $ref: '#/components/examples/Error0230'
                Error0231:
                  $ref: '#/components/examples/Error0231'
                Error0232:
                  $ref: '#/components/examples/Error0232'
                Error0233:
                  $ref: '#/components/examples/Error0233'
                Error0234:
                  $ref: '#/components/examples/Error0234'
                Error0235:
                  $ref: '#/components/examples/Error0235'
                Error0236:
                  $ref: '#/components/examples/Error0236'
                Error0237:
                  $ref: '#/components/examples/Error0237'
        '401':
          description: Não Autorizado
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorFormat'
              examples:
                ErrorUnauthenticated:
                  $ref: '#/components/examples/ErrorUnauthenticated'
        '413':
          description: Payload Muito Grande
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorFormat'
              examples:
                Error0011:
                  $ref: '#/components/examples/Error0011'
        '500':
          description: Erro Interno do Servidor
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorFormat'
              examples:
                Error0004:
                  $ref: '#/components/examples/Error0004'
                Error0103:
                  $ref: '#/components/examples/Error0103'
                Error0136:
                  $ref: '#/components/examples/Error0136'
        '503':
          description: Serviço Indisponível
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorFormat'
              examples:
                Error0012:
                  $ref: '#/components/examples/Error0012'
        '504':
          description: Tempo Limite do Gateway
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorFormat'
              examples:
                Error0229:
                  $ref: '#/components/examples/Error0229'
components:
  parameters:
    ContentType:
      name: Content-Type
      in: header
      description: O tipo de mídia do recurso. Deve ser `application/json`.
      required: true
      example: application/json
      schema:
        type: string
    XApiKey:
      name: X-API-Key
      in: header
      description: >-
        A chave de API para autenticação. **Este header é obrigatório para todos
        os endpoints, exceto verificações de integridade**.
      required: true
      schema:
        type: string
    XRequestId:
      name: X-Request-Id
      in: header
      description: Um identificador único usado para rastrear cada requisição.
      required: false
      example: 019c96a0-10ce-75fc-a273-dc799079a99c
      schema:
        type: string
        format: uuid
  schemas:
    ValidationRequest:
      type: object
      description: >-
        Requisição de validação de transação. Todo o contexto necessário para a
        validação deve ser incluído (Padrão Payload-Complete).
      required:
        - requestId
        - transactionType
        - amount
        - currency
        - transactionTimestamp
        - account
      properties:
        requestId:
          type: string
          format: uuid
          description: >-
            ID único gerado pelo cliente para idempotência e correlação na
            trilha de auditoria.
        transactionType:
          type: string
          enum:
            - CARD
            - WIRE
            - PIX
            - CRYPTO
          description: Tipo de transação (método de pagamento).
        subType:
          type: string
          maxLength: 50
          description: >-
            Subtipo da transação para contexto adicional (ex.: débito, crédito,
            pré-pago).
        amount:
          type: string
          description: >-
            Valor da transação como string decimal (ex.: "1500.00"). Deve ser um
            valor decimal positivo.
        currency:
          type: string
          minLength: 3
          maxLength: 3
          description: >-
            Código de moeda ISO 4217 (maiúsculas). Códigos em minúsculas são
            rejeitados.
        transactionTimestamp:
          type: string
          format: date-time
          description: Timestamp da transação no formato RFC3339 com fuso horário.
        account:
          $ref: '#/components/schemas/AccountContext'
        segment:
          $ref: '#/components/schemas/SegmentContext'
        portfolio:
          $ref: '#/components/schemas/PortfolioContext'
        merchant:
          $ref: '#/components/schemas/MerchantContext'
        metadata:
          type: object
          additionalProperties: true
          description: Pares chave-valor personalizados para expressões de regras.
    ValidationResponse:
      type: object
      description: Resultado da validação de transação.
      properties:
        requestId:
          type: string
          format: uuid
          description: Eco do identificador de requisição fornecido pelo cliente.
        validationId:
          type: string
          format: uuid
          description: >-
            Identificador único gerado pelo servidor para este registro de
            validação.
        decision:
          type: string
          enum:
            - ALLOW
            - DENY
            - REVIEW
          description: Decisão da validação (ALLOW, DENY ou REVIEW).
        reason:
          type: string
          description: Motivo legível da decisão.
        matchedRuleIds:
          type: array
          items:
            type: string
            format: uuid
          description: IDs das regras que corresponderam e dispararam a decisão.
        evaluatedRuleIds:
          type: array
          items:
            type: string
            format: uuid
          description: IDs de todas as regras que foram avaliadas.
        limitUsageDetails:
          type: array
          items:
            $ref: '#/components/schemas/LimitUsageDetail'
          description: Detalhes sobre cada limite verificado durante a validação.
        processingTimeMs:
          type: number
          format: double
          description: Tempo de processamento em milissegundos (meta < 80ms p99).
        evaluatedAt:
          type: string
          format: date-time
          description: >-
            Timestamp do servidor quando a avaliação começou, em formato
            RFC3339.
        totalRulesLoaded:
          type: integer
          description: Número total de regras carregadas para avaliação.
        truncated:
          type: boolean
          description: Se a resposta foi truncada devido a limites de tamanho.
    ErrorFormat:
      type: object
      description: A mensagem de erro da resposta.
      required:
        - code
        - title
        - message
      properties:
        code:
          type: string
          description: Um identificador único e estável para o erro.
        title:
          type: string
          description: Um breve resumo do problema.
        message:
          type: string
          description: Orientação detalhada para resolver o erro.
        fields:
          type: object
          additionalProperties: true
          description: Informações adicionais sobre os campos que causaram o erro.
    AccountContext:
      type: object
      description: Contexto da conta para validação.
      required:
        - accountId
      properties:
        accountId:
          type: string
          format: uuid
          description: Identificador da conta (obrigatório).
        type:
          type: string
          description: Tipo da conta.
          enum:
            - checking
            - savings
            - credit
        status:
          type: string
          description: Status da conta.
          enum:
            - active
            - suspended
            - closed
        metadata:
          type: object
          additionalProperties: true
          description: Atributos adicionais da conta para avaliação de regras.
    SegmentContext:
      type: object
      description: Contexto do segmento (opcional). Se fornecido, segmentId é obrigatório.
      properties:
        segmentId:
          type: string
          format: uuid
          description: >-
            Identificador do segmento (obrigatório se o objeto segment for
            fornecido).
        name:
          type: string
          description: Nome do segmento para expressões de regras.
        metadata:
          type: object
          additionalProperties: true
          description: Atributos adicionais do segmento para avaliação de regras.
    PortfolioContext:
      type: object
      description: >-
        Contexto do portfólio (opcional). Se fornecido, portfolioId é
        obrigatório.
      properties:
        portfolioId:
          type: string
          format: uuid
          description: >-
            Identificador do portfólio (obrigatório se o objeto portfolio for
            fornecido).
        name:
          type: string
          description: Nome do portfólio para expressões de regras.
        metadata:
          type: object
          additionalProperties: true
          description: Atributos adicionais do portfólio para avaliação de regras.
    MerchantContext:
      type: object
      description: >-
        Contexto do estabelecimento (opcional, recomendado para transações de
        cartão). Se fornecido, merchantId é obrigatório.
      properties:
        merchantId:
          type: string
          format: uuid
          description: >-
            Identificador do estabelecimento (obrigatório se o objeto merchant
            for fornecido).
        name:
          type: string
          description: Nome do estabelecimento.
        category:
          type: string
          description: >-
            Código de Categoria do Estabelecimento (MCC). Deve ser um código de
            4 dígitos conforme ISO 18245.
          pattern: ^[0-9]{4}$
        country:
          type: string
          description: >-
            País do estabelecimento. Deve ser um código ISO 3166-1 alpha-2 (2
            letras maiúsculas).
          pattern: ^[A-Z]{2}$
        metadata:
          type: object
          additionalProperties: true
          description: Atributos adicionais do estabelecimento para avaliação de regras.
    LimitUsageDetail:
      type: object
      description: Detalhes sobre uma verificação de limite durante a validação.
      properties:
        limitId:
          type: string
          format: uuid
          description: O limite que foi verificado.
        limitAmount:
          type: string
          description: 'Valor total do limite como string decimal (ex.: "50000.00").'
        currentUsage:
          type: string
          description: >-
            Uso projetado após aplicar a transação. Quando excedido, mostra qual
            seria o uso se permitido.
        exceeded:
          type: boolean
          description: >-
            Se o limite foi excedido. Quando verdadeiro, o contador não foi
            incrementado.
        period:
          type: string
          description: Tipo de período do limite.
          enum:
            - DAILY
            - WEEKLY
            - MONTHLY
            - CUSTOM
            - PER_TRANSACTION
        scope:
          type: string
          description: 'Escopo legível (ex.: "account:uuid", "segment:uuid" ou "global").'
        attemptedAmount:
          type: string
          description: Valor da transação sendo validada, como string decimal.
        skipped:
          type: boolean
          description: >-
            Se este limite foi pulado durante a avaliação (não aplicado). Quando
            true, o contador não foi incrementado e `exceeded` é sempre false.
            Omitido quando false.
        skipReason:
          type: string
          enum:
            - outside_time_window
            - outside_custom_period
          description: >-
            Motivo pelo qual o limite foi pulado. Apenas presente quando
            `skipped` é true.
  examples:
    Error0001:
      summary: Generic Validation Error
      value:
        code: TRC-0001
        title: Validation Error
        message: >-
          Field validation failed. Please verify the provided data and try
          again.
    Error0003:
      summary: Invalid Request Body
      value:
        code: TRC-0003
        title: Invalid Request Body
        message: >-
          The request body is invalid or malformed. Please verify the JSON
          format and try again.
    Error0060:
      summary: Metadata Key Too Long
      value:
        code: TRC-0060
        title: Metadata Key Too Long
        message: >-
          The metadata key exceeds the maximum length of 64 characters. Please
          reduce the key size.
    Error0063:
      summary: Metadata Exceeds Maximum Entries
      value:
        code: TRC-0063
        title: Metadata Exceeds Maximum Entries
        message: >-
          The metadata exceeds the maximum of 50 entries. Please reduce the
          number of entries.
    Error0064:
      summary: Metadata Key Contains Invalid Characters
      value:
        code: TRC-0064
        title: Invalid Metadata Key
        message: >-
          The metadata key contains invalid characters. Only alphanumeric
          characters and underscore are allowed.
    Error0089:
      summary: Amount Exceeds CEL Precision
      value:
        code: TRC-0089
        title: Amount Exceeds CEL Precision
        message: >-
          The amount exceeds the safe precision for CEL evaluation (maximum
          ±2^53). Please reduce the amount.
    Error0220:
      summary: Request ID Required
      value:
        code: TRC-0220
        title: Missing Required Field
        message: >-
          The requestId field is required. Please provide a unique UUID for the
          request.
    Error0221:
      summary: Invalid Transaction Type
      value:
        code: TRC-0221
        title: Invalid Transaction Type
        message: >-
          The transactionType must be one of CARD, WIRE, PIX, or CRYPTO. Please
          provide a valid transaction type.
    Error0222:
      summary: Amount Must Be Positive
      value:
        code: TRC-0222
        title: Invalid Amount
        message: >-
          The amount must be a positive decimal value (e.g., "1500.00"). Please
          provide a valid amount.
    Error0223:
      summary: Currency Required
      value:
        code: TRC-0223
        title: Missing Required Field
        message: >-
          The currency field is required. Please provide a valid ISO 4217
          currency code.
    Error0224:
      summary: Invalid Currency
      value:
        code: TRC-0224
        title: Invalid Currency
        message: >-
          The currency must be a valid uppercase ISO 4217 code (e.g., BRL, USD).
          Lowercase codes are not accepted.
    Error0225:
      summary: Transaction Timestamp Required
      value:
        code: TRC-0225
        title: Missing Required Field
        message: >-
          The transactionTimestamp field is required. Please provide a timestamp
          in RFC3339 format.
    Error0226:
      summary: Future Timestamp Not Allowed
      value:
        code: TRC-0226
        title: Future Timestamp Not Allowed
        message: >-
          The transactionTimestamp cannot be in the future. Please provide a
          valid timestamp.
    Error0227:
      summary: Account Required
      value:
        code: TRC-0227
        title: Missing Required Field
        message: >-
          The account field is required. Please provide account context for the
          validation.
    Error0228:
      summary: Past Timestamp Not Allowed
      value:
        code: TRC-0228
        title: Past Timestamp Not Allowed
        message: >-
          The transactionTimestamp is too far in the past. Please provide a more
          recent timestamp.
    Error0230:
      summary: Segment ID Required
      value:
        code: TRC-0230
        title: Missing Required Field
        message: >-
          The segment.id field is required when the segment object is provided.
          Please provide the segment ID.
    Error0231:
      summary: Portfolio ID Required
      value:
        code: TRC-0231
        title: Missing Required Field
        message: >-
          The portfolio.id field is required when the portfolio object is
          provided. Please provide the portfolio ID.
    Error0232:
      summary: SubType Exceeds Maximum Length
      value:
        code: TRC-0232
        title: SubType Too Long
        message: >-
          The subType field exceeds the maximum length of 50 characters. Please
          reduce the size.
    Error0233:
      summary: Invalid Account Type
      value:
        code: TRC-0233
        title: Invalid Account Type
        message: >-
          The account.type must be one of checking, savings, or credit. Please
          provide a valid type.
    Error0234:
      summary: Invalid Account Status
      value:
        code: TRC-0234
        title: Invalid Account Status
        message: >-
          The account.status must be one of active, suspended, or closed. Please
          provide a valid status.
    Error0235:
      summary: Invalid Merchant Category
      value:
        code: TRC-0235
        title: Invalid Merchant Category
        message: >-
          The merchant.category must be a 4-digit MCC code. Please provide a
          valid category.
    Error0236:
      summary: Invalid Merchant Country
      value:
        code: TRC-0236
        title: Invalid Merchant Country
        message: >-
          The merchant.country must be an ISO 3166-1 alpha-2 code (e.g., BR,
          US). Please provide a valid country code.
    Error0237:
      summary: Merchant ID Required
      value:
        code: TRC-0237
        title: Missing Required Field
        message: >-
          The merchant.id field is required when the merchant object is
          provided. Please provide the merchant ID.
    ErrorUnauthenticated:
      summary: Unauthorized
      value:
        code: Unauthenticated
        title: Unauthorized
        message: >-
          API Key missing or invalid. Provide a valid API Key in the X-API-Key
          header.
    Error0011:
      summary: Payload Too Large
      value:
        code: TRC-0011
        title: Payload Too Large
        message: >-
          The request payload exceeds the maximum size limit of 100KB. Please
          reduce the payload size and try again.
    Error0004:
      summary: Internal Server Error
      value:
        code: TRC-0004
        title: Internal Server Error
        message: >-
          An unexpected error occurred. Please try again later or contact
          support if the issue persists.
    Error0103:
      summary: Rule Evaluation Failed
      value:
        code: TRC-0103
        title: Internal Server Error
        message: Rule evaluation failed. Please try again or contact support.
    Error0136:
      summary: Limit Check Failed
      value:
        code: TRC-0136
        title: Internal Server Error
        message: Limit check failed. Please try again or contact support.
    Error0012:
      summary: Service Unavailable
      value:
        code: TRC-0012
        title: Service Unavailable
        message: >-
          The service is temporarily unavailable or the request was cancelled.
          Please try again later.
    Error0229:
      summary: Validation Timeout
      value:
        code: TRC-0229
        title: Gateway Timeout
        message: >-
          The validation processing exceeded the 80ms budget. Please try again
          or contact support if the issue persists.
  securitySchemes:
    ApiKeyAuth:
      type: apiKey
      in: header
      name: X-API-Key
      description: >-
        Autenticação por API Key. Usada por implantações single-tenant
        (`MULTI_TENANT_ENABLED=false`). Enviada em todas as requisições `/v1/*`.
    BearerAuth:
      type: http
      scheme: bearer
      bearerFormat: JWT
      description: >-
        Autenticação JWT bearer. Usada por implantações multi-tenant
        (`MULTI_TENANT_ENABLED=true`). O JWT é emitido pelo Access Manager e
        deve conter o claim `tenantId` — o Tracer resolve o tenant a partir do
        token, não de qualquer cabeçalho ou campo do corpo.

````