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

# Declare the BR norm classification of a loan product version

> Records the carteira (Res. BCB 352/2023 art. 81) the credit booked under this product version belongs to, and optionally the modality the norm keys a rate on beyond it. Works on a version that is already active: the contracts booked on it were always in that carteira under the norm, the system simply could not name it, and until it is declared the provision engine counts and names every contract it cannot price rather than measuring it at zero. There is no automatic backfill, because guessing a carteira is guessing how much capital the institution must hold. A version may be declared ONCE: a second call is refused with 409 naming the carteira on the record, because replacing one reprices every contract ever booked under the version and posts the difference against results in a single movement. Changing a carteira means creating a new product version.



## OpenAPI

````yaml /pt/openapi/v3-current/lender.yaml put /api/v1/br/loan-product-versions/{id}/norm-classification
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). See
    docs/contracts/money-route-idempotency.md.
  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.
    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.
    name: Consignado
  - description: >-
      Credit-instrument document template registry: versioned drafting and
      publication of CCB clausulado.
    name: DocumentTemplates
paths:
  /api/v1/br/loan-product-versions/{id}/norm-classification:
    put:
      tags:
        - Loan Products
      summary: Declare the BR norm classification of a loan product version
      description: >-
        Records the carteira (Res. BCB 352/2023 art. 81) the credit booked under
        this product version belongs to, and optionally the modality the norm
        keys a rate on beyond it. Works on a version that is already active: the
        contracts booked on it were always in that carteira under the norm, the
        system simply could not name it, and until it is declared the provision
        engine counts and names every contract it cannot price rather than
        measuring it at zero. There is no automatic backfill, because guessing a
        carteira is guessing how much capital the institution must hold. A
        version may be declared ONCE: a second call is refused with 409 naming
        the carteira on the record, because replacing one reprices every
        contract ever booked under the version and posts the difference against
        results in a single movement. Changing a carteira means creating a new
        product version.
      operationId: declareLoanProductVersionNormClassification
      parameters:
        - description: Loan product version identifier.
          in: path
          name: id
          required: true
          schema:
            description: Loan product version identifier.
            format: uuid
            type: string
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/DeclareNormClassificationBody'
        required: true
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/DeclareNormClassificationResponse'
          description: OK
        '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
        '409':
          content:
            application/problem+json:
              schema:
                $ref: '#/components/schemas/Detail'
          description: Conflict
        '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
components:
  schemas:
    DeclareNormClassificationBody:
      additionalProperties: false
      properties:
        normModality:
          description: >-
            Optional refinement the norm keys a rate on beyond the carteira.
            'consignado' selects the art. 78 §6º carve-out (Res. BCB 397/2024):
            payroll-deducted personal credit at up to fourteen days provisions
            at 0,5% instead of C5's 1,9%.
          enum:
            - consignado
          examples:
            - consignado
          type: string
        normPortfolioClass:
          description: >-
            Carteira the credit booked under this version belongs to (Res. BCB
            352/2023 art. 81). Consignado, CDC and cartão rotativo sem garantia
            are C5 (art. 81, V, a); PJ capital de giro sem garantia is C4 (art.
            81, IV, a). Where more than one carteira fits, art. 81 §1º takes the
            one giving the lower provision for an asset defaulted less than one
            month.
          enum:
            - C1
            - C2
            - C3
            - C4
            - C5
          examples:
            - C5
          type: string
      required:
        - normPortfolioClass
      type: object
    DeclareNormClassificationResponse:
      additionalProperties: false
      properties:
        loanProductVersionId:
          type: string
        normModality:
          type: string
        normPortfolioClass:
          type: string
      required:
        - loanProductVersionId
        - normPortfolioClass
      type: object
    Detail:
      additionalProperties: false
      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

````