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

# Create a consignado compensating adjustment

> Commits a new compensating adjustment operation, its opening history entry and the durable posting-intent outbox event, atomically; the posting intent is always recorded. When no single ledger account resolves for the contract's currency and role (configured, or the Lender's default when it provisions accounts), the create is refused 422, nothing is recorded and the divergence stays adjustable. An internal_ccb_residual on a contract that never disbursed or was cancelled is refused 422 the same way. A disbursement clearing posts its reason's pair: disbursement_excess_recovered Dr cash / Cr above, disbursement_excess_loss Dr loss / Cr above, disbursement_remainder_paid_off_rail Dr below / Cr cash, disbursement_remainder_cancelled Dr below / Cr suspense. A refinance_payoff_vs_rail item clears by refinance_payoff_short_recovered Dr cash / Cr suspense, refinance_payoff_short_loss Dr loss / Cr suspense (the Lender payoff above the rail's) or refinance_payoff_excess_refunded Dr suspense / Cr cash (the rail's above the Lender's). A refinance_reversal_disbursed_change item (the change of a refinance the rail undid) accepts only disbursement_excess_recovered and disbursement_excess_loss, for exactly the item's amount. A 202 response means accepted durably, never posted: the ledger relay posts it separately. Idempotent via the X-Idempotency header enforced by the platform middleware.



## OpenAPI

````yaml /pt/openapi/v3-current/lender.yaml post /api/v1/internal/br/consignado/compensating-adjustments
openapi: 3.1.0
info:
  contact:
    email: contact@lerian.studio
    name: Lerian Studio
    url: https://lerian.studio
  description: >-
    Code-first OpenAPI 3.1 surface for the Lender service. Routes that move
    money are at-most-once per X-Idempotency: when one answers 5xx, the
    X-Idempotency-Fenced response header says whether that key is now refusing
    resends (true) or free to retry (false or absent).
  license:
    name: Lerian Studio General License
  title: Lender API
  version: 1.0.0
servers:
  - url: https://lender.sandbox.lerian.net
security:
  - BearerAuth: []
tags:
  - description: >-
      Caller session projection: validated subject and effective permissions for
      the presented token.
    name: Session
  - description: >-
      Ledger accounting operations: journal entries and accrual postings for
      loan accounts. Operations under /api/v1/internal are back-office
      operations for the client's operators: they require a person's login, and
      a service credential gets 403.
    name: Accounting
  - description: >-
      Loan application intake and lifecycle: submission, decisioning, and
      status.
    name: LoanApplications
  - description: >-
      Loan product catalog: definition, versioning, and activation of lending
      products.
    name: LoanProducts
  - description: >-
      Loan account servicing operations: balances, schedules, and account-level
      actions.
    name: Loan Accounts
  - description: >-
      Portfolio dashboard read operations: aggregated portfolio and performance
      views.
    name: Dashboard
  - description: >-
      Jurisdiction registry: supported jurisdiction profiles and their
      capabilities.
    name: Jurisdictions
  - description: >-
      Jurisdiction-specific loan application operations (Brazil origination
      surface).
    name: Loan Applications
  - description: >-
      Tax computation operations for jurisdiction-specific lending (e.g. Brazil
      IOF).
    name: Tax
  - description: >-
      Brazil consignado privado operations: contract lifecycle, exclusion
      repair, and compensating adjustments. Operations under /api/v1/internal
      are back-office operations for the client's operators: they require a
      person's login, and a service credential gets 403.
    name: Consignado
  - description: >-
      Inbound record quarantine. Operations under /api/v1/internal are
      back-office operations for the client's operators: they require a person's
      login, and a service credential gets 403.
    name: Streaming
  - description: >-
      Credit-instrument document template registry: versioned drafting and
      publication of CCB clausulado.
    name: DocumentTemplates
paths:
  /api/v1/internal/br/consignado/compensating-adjustments:
    post:
      tags:
        - Consignado
      summary: Create a consignado compensating adjustment
      description: >-
        Commits a new compensating adjustment operation, its opening history
        entry and the durable posting-intent outbox event, atomically; the
        posting intent is always recorded. When no single ledger account
        resolves for the contract's currency and role (configured, or the
        Lender's default when it provisions accounts), the create is refused
        422, nothing is recorded and the divergence stays adjustable. An
        internal_ccb_residual on a contract that never disbursed or was
        cancelled is refused 422 the same way. A disbursement clearing posts its
        reason's pair: disbursement_excess_recovered Dr cash / Cr above,
        disbursement_excess_loss Dr loss / Cr above,
        disbursement_remainder_paid_off_rail Dr below / Cr cash,
        disbursement_remainder_cancelled Dr below / Cr suspense. A
        refinance_payoff_vs_rail item clears by refinance_payoff_short_recovered
        Dr cash / Cr suspense, refinance_payoff_short_loss Dr loss / Cr suspense
        (the Lender payoff above the rail's) or refinance_payoff_excess_refunded
        Dr suspense / Cr cash (the rail's above the Lender's). A
        refinance_reversal_disbursed_change item (the change of a refinance the
        rail undid) accepts only disbursement_excess_recovered and
        disbursement_excess_loss, for exactly the item's amount. A 202 response
        means accepted durably, never posted: the ledger relay posts it
        separately. Idempotent via the X-Idempotency header enforced by the
        platform middleware.
      operationId: createConsignadoCompensatingAdjustment
      parameters:
        - description: >-
            Canonical idempotency request ID (lib-commons enforcer reads this).
            Reusing the same key on a retry returns the SAME durably accepted
            operation, never a duplicate.
          in: header
          name: X-Idempotency
          required: true
          schema:
            description: >-
              Canonical idempotency request ID (lib-commons enforcer reads
              this). Reusing the same key on a retry returns the SAME durably
              accepted operation, never a duplicate.
            type: string
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/CompensatingAdjustmentHumaRequest'
        required: true
      responses:
        '202':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/CompensatingAdjustmentHumaBody'
          description: Accepted
          headers:
            X-Idempotency-Replayed:
              description: >-
                "true" when this response replays a request already executed
                under the same X-Idempotency, so nothing ran a second time and
                no money moved again. Absent on a first execution.
              schema:
                type: string
        '400':
          content:
            application/problem+json:
              schema:
                $ref: '#/components/schemas/Detail'
          description: >-
            The at-most-once contract refused the request before any handler
            ran: no X-Idempotency header (IDEMPOTENCY_KEY_REQUIRED), a key under
            a spelling this service does not read
            (IDEMPOTENCY_KEY_HEADER_UNKNOWN), or a request that could not be
            scoped to a tenant (IDEMPOTENCY_TENANT_REQUIRED). The code is in the
            problem document's `code` member.
        '401':
          content:
            application/problem+json:
              schema:
                $ref: '#/components/schemas/Detail'
          description: Unauthorized
        '403':
          content:
            application/problem+json:
              schema:
                $ref: '#/components/schemas/Detail'
          description: Forbidden
        '404':
          content:
            application/problem+json:
              schema:
                $ref: '#/components/schemas/Detail'
          description: Not Found
        '413':
          content:
            application/problem+json:
              schema:
                $ref: '#/components/schemas/Detail'
          description: Request Entity Too Large
        '422':
          content:
            application/problem+json:
              schema:
                $ref: '#/components/schemas/Detail'
          description: Unprocessable Entity
        '500':
          content:
            application/problem+json:
              schema:
                $ref: '#/components/schemas/Detail'
          description: Internal Server Error
        '503':
          content:
            application/problem+json:
              schema:
                $ref: '#/components/schemas/Detail'
          description: Service Unavailable
        '504':
          content:
            application/problem+json:
              schema:
                $ref: '#/components/schemas/Detail'
          description: Gateway Timeout
        default:
          content:
            application/problem+json:
              schema:
                $ref: '#/components/schemas/Detail'
          description: Error
components:
  schemas:
    CompensatingAdjustmentHumaRequest:
      additionalProperties: false
      properties:
        adjustmentAmount:
          description: >-
            Signed compensating entry magnitude, exact two-decimal string. Sign
            convention: payment_shortfall must be negative, payment_excess and
            every disbursement_* reason must be positive.
          type: string
        correctionEventId:
          description: >-
            Landed correction event this adjustment resolves. At most one of
            divergenceId/correctionEventId may be set.
          maxLength: 255
          type: string
        currency:
          description: ISO-4217 currency code.
          maxLength: 3
          minLength: 3
          type: string
        debtAmountAfter:
          description: >-
            CCB debt after this adjustment. Both-or-neither with
            debtAmountBefore.
          type: string
        debtAmountBefore:
          description: >-
            CCB debt before this adjustment. Both-or-neither with
            debtAmountAfter.
          type: string
        divergenceId:
          description: >-
            Divergence this adjustment resolves. At most one of
            divergenceId/correctionEventId may be set.
          format: uuid
          type: string
        justification:
          description: Operator's structured justification.
          maxLength: 4000
          minLength: 1
          type: string
        numeroContrato:
          description: Canonical rail contract number.
          maxLength: 15
          minLength: 2
          type: string
        reason:
          description: >-
            Closed reason catalog; no free-form 'other'. A disbursement_* or
            refinance_payoff_* reason clears a disbursement in parts or a
            refinance payoff: it names the divergence and moves exactly its open
            amount.
          enum:
            - payment_shortfall
            - payment_excess
            - immutable_client_correction
            - internal_ccb_residual
            - disbursement_excess_recovered
            - disbursement_excess_loss
            - disbursement_remainder_paid_off_rail
            - disbursement_remainder_cancelled
            - refinance_payoff_short_recovered
            - refinance_payoff_short_loss
            - refinance_payoff_excess_refunded
          type: string
      required:
        - numeroContrato
        - reason
        - justification
        - currency
        - adjustmentAmount
      type: object
    CompensatingAdjustmentHumaBody:
      additionalProperties: false
      properties:
        adjustmentAmount:
          description: Signed compensating entry magnitude, exact two-decimal string.
          type: string
        correctionEventId:
          description: Landed correction event this adjustment resolves, when set.
          type: string
        createdAt:
          description: RFC3339 UTC.
          type: string
        createdBy:
          description: Validated actor identity that created this operation.
          type: string
        currency:
          description: ISO-4217 currency code.
          type: string
        debtAmountAfter:
          description: CCB debt after, when this adjustment changes the debt.
          type: string
        debtAmountBefore:
          description: CCB debt before, when this adjustment changes the debt.
          type: string
        divergenceId:
          description: Divergence this adjustment resolves, when set.
          type: string
        existing:
          description: >-
            True when this call replayed an already-committed operation for the
            same idempotency key, never a duplicate.
          type: boolean
        id:
          description: Compensating adjustment operation identifier.
          type: string
        idempotencyKey:
          description: Idempotency key this operation was created (or replayed) under.
          type: string
        justification:
          description: Operator's structured justification.
          type: string
        numeroContrato:
          description: Canonical rail contract number.
          type: string
        reason:
          description: Closed reason catalog.
          type: string
        resolvedGlAccount:
          description: >-
            GL account this operation was authorized against: the suspense
            account, or the above or below account a disbursement_* reason
            clears. A contract that already booked into the role keeps that
            account; otherwise the role's account, configured or the Lender's
            default when it provisions accounts.
          type: string
      required:
        - id
        - numeroContrato
        - reason
        - justification
        - currency
        - adjustmentAmount
        - idempotencyKey
        - createdBy
        - createdAt
        - resolvedGlAccount
        - existing
      type: object
    Detail:
      additionalProperties: true
      properties:
        code:
          description: >-
            Stable, machine-readable domain error code scoped to the emitting
            service (format: <SERVICE>-NNNN).
          type: string
        detail:
          description: >-
            A human-readable explanation specific to this occurrence of the
            problem.
          examples:
            - Property foo is required but is missing.
          type: string
        errors:
          description: Optional list of individual error details
          items:
            $ref: '#/components/schemas/ErrorDetail'
          type:
            - array
            - 'null'
        instance:
          description: >-
            A URI reference that identifies the specific occurrence of the
            problem.
          examples:
            - https://example.com/error-log/abc123
          format: uri
          type: string
        status:
          description: HTTP status code
          examples:
            - 400
          format: int64
          type: integer
        title:
          description: >-
            A short, human-readable summary of the problem type. This value
            should not change between occurrences of the error.
          examples:
            - Bad Request
          type: string
        type:
          default: about:blank
          description: A URI reference to human-readable documentation for the error.
          examples:
            - https://example.com/errors/example
          format: uri
          type: string
        upstream:
          $ref: '#/components/schemas/Upstream'
          description: >-
            RFC 9457 extension member: the error a proxied third-party provider
            reported. Absent unless the emitting service explicitly surfaced
            one.
      type: object
    ErrorDetail:
      additionalProperties: false
      properties:
        location:
          description: >-
            Where the error occurred, e.g. 'body.items[3].tags' or
            'path.thing-id'
          type: string
        message:
          description: Error message text
          type: string
        value:
          description: The value at the given location
      type: object
    Upstream:
      additionalProperties: false
      properties:
        code:
          description: The upstream provider's own error code, verbatim.
          examples:
            - E4001
          type: string
        message:
          description: >-
            The upstream provider's own error message, verbatim (bounded, never
            its raw response body).
          examples:
            - account not found at provider
          type: string
      type: object
  securitySchemes:
    BearerAuth:
      bearerFormat: JWT
      description: JWT bearer token issued by the identity provider.
      scheme: bearer
      type: http

````

This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.