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

# Record signed credit instrument

> Records the signed CCB the integrator collected: the Lender computes the document's sha-256, custodies the bytes, then records which instrument was signed. The same document as the newest record replays it: the replay is keyed on the document's digest and returns the stored record unchanged, ignoring any metadata that differs in the resend. A different document only enters as a replacement that names the newest record in supersedes and gives a replacementReason; the newest record is the one that counts.



## OpenAPI

````yaml /pt/openapi/v3-current/lender.yaml post /api/v1/loan-applications/{applicationId}/signed-credit-instrument
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/loan-applications/{applicationId}/signed-credit-instrument:
    post:
      tags:
        - CreditInstruments
      summary: Record signed credit instrument
      description: >-
        Records the signed CCB the integrator collected: the Lender computes the
        document's sha-256, custodies the bytes, then records which instrument
        was signed. The same document as the newest record replays it: the
        replay is keyed on the document's digest and returns the stored record
        unchanged, ignoring any metadata that differs in the resend. A different
        document only enters as a replacement that names the newest record in
        supersedes and gives a replacementReason; the newest record is the one
        that counts.
      operationId: recordSignedCreditInstrument
      parameters:
        - description: Loan application identifier.
          in: path
          name: applicationId
          required: true
          schema:
            description: Loan application identifier.
            format: uuid
            type: string
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/RecordSignedCreditInstrumentHumaInputBody'
        required: true
      responses:
        '201':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/SignedCreditInstrumentHumaBody'
          description: Created
          headers:
            X-Idempotency-Replayed:
              schema:
                description: >-
                  true when the same document was already recorded and this
                  response replays that record.
                type: boolean
        '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
        '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: >-
            Any other status this operation may carry, rendered as a problem
            document — including a refusal produced ahead of the service, such
            as a gateway or ingress answering on its behalf.
components:
  schemas:
    RecordSignedCreditInstrumentHumaInputBody:
      additionalProperties: false
      properties:
        creditInstrumentId:
          description: >-
            The Lender-emitted CCB that was signed. Required when the product
            version has the Lender emit; refused when the client issues.
          format: uuid
          type: string
        document:
          description: >-
            The signed PDF, base64-encoded (standard alphabet), at most 20 MiB
            decoded.
          format: byte
          type: string
        evidenceRef:
          description: The integrator's reference to the signature evidence.
          maxLength: 1024
          minLength: 1
          type: string
        originalDocumentDigest:
          description: >-
            sha-256 hex of the document that was signed. Required when the
            client issues; when the Lender emitted, optional and checked against
            its CCB.
          pattern: ^[0-9a-fA-F]{64}$
          type: string
        replacementReason:
          description: >-
            Only to replace: why, in one line of at most 500 characters. Goes
            with supersedes.
          maxLength: 500
          type: string
        signatories:
          description: Every party that signed.
          items:
            $ref: '#/components/schemas/SignatoryHumaInput'
          maxItems: 20
          minItems: 1
          type:
            - array
            - 'null'
        signedAt:
          description: >-
            When the signature completed (RFC3339); at most 5 minutes after the
            Lender's clock, the signature provider's clock skew.
          format: date-time
          type: string
        signedDocumentDigest:
          description: >-
            sha-256 hex of the decoded document. The Lender computes its own and
            refuses a mismatch (LENDER-0605).
          pattern: ^[0-9a-fA-F]{64}$
          type: string
        supersedes:
          description: >-
            Only to replace: the id of the proposal's newest record. Goes with
            replacementReason.
          format: uuid
          type: string
      required:
        - document
        - signedDocumentDigest
        - signedAt
        - evidenceRef
        - signatories
      type: object
    SignedCreditInstrumentHumaBody:
      additionalProperties: false
      properties:
        creditInstrumentId:
          description: >-
            The Lender-emitted CCB that was signed (uuid). Absent when the
            client issued.
          type: string
        custodian:
          description: >-
            Who holds the signed PDF: lender, downloadable here; or integrator,
            whose gateway holds it while the Lender keeps its digest.
          type: string
        evidenceRef:
          description: The integrator's reference to the signature evidence.
          type: string
        id:
          description: Record identifier (uuid).
          type: string
        loanApplicationId:
          description: Loan application identifier (uuid).
          type: string
        origin:
          description: 'Who issued what was signed: lender_emitted or client_issued.'
          type: string
        originalDocumentDigest:
          description: >-
            sha-256 hex of the document that was signed. Empty when the
            integrator declared no original.
          type: string
        recordedAt:
          description: When the Lender recorded it (RFC3339, UTC).
          type: string
        replacementReason:
          description: >-
            Why this record replaced the previous one. Absent on the first
            record.
          type: string
        signatories:
          description: Every party that signed, without name or document.
          items:
            $ref: '#/components/schemas/SignatoryHumaBody'
          type:
            - array
            - 'null'
        signedAt:
          description: When the signature completed (RFC3339, UTC).
          type: string
        signedDocumentDigest:
          description: sha-256 hex the Lender computed over the signed PDF.
          type: string
        signedDocumentSize:
          description: Size of the signed PDF in bytes.
          format: int64
          type: integer
        supersedesId:
          description: >-
            The record this one replaced (uuid). Absent on the proposal's first
            record.
          type: string
      required:
        - id
        - loanApplicationId
        - origin
        - originalDocumentDigest
        - signedDocumentDigest
        - signedDocumentSize
        - custodian
        - signatories
        - signedAt
        - evidenceRef
        - recordedAt
      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
    SignatoryHumaInput:
      additionalProperties: false
      properties:
        name:
          description: The party's name. Recorded, never returned by the API.
          maxLength: 256
          minLength: 1
          type: string
        role:
          description: The party's role in the instrument, e.g. borrower.
          maxLength: 64
          minLength: 1
          type: string
        signedAt:
          description: >-
            When this party signed (RFC3339); not after the instrument's
            signedAt.
          format: date-time
          type: string
        taxId:
          description: >-
            The party's tax document. Its shape belongs to the jurisdiction.
            Recorded, never returned by the API.
          maxLength: 32
          minLength: 1
          type: string
      required:
        - role
        - name
        - taxId
        - signedAt
      type: object
    SignatoryHumaBody:
      additionalProperties: false
      properties:
        role:
          description: The party's role in the instrument.
          type: string
        signedAt:
          description: When this party signed (RFC3339, UTC).
          type: string
      required:
        - role
        - signedAt
      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.