Skip to main content
POST
Record a settled external payment
Use this endpoint when your lender or loan management system (LMS) collected a payment outside Finosu and the money has already settled. Finosu records and applies the payment; it does not create an ACH/card processor charge. This is different from Confirm ACH Settlement, which updates a payment that Finosu already originated.

Authentication and account identity

Send the company API key in X-API-Key. The key determines the company scope; company or customer IDs in the request cannot widen it. loanId is required and must be the exact company-owned external loan/account identifier. A customer identifier is not accepted because one customer can have multiple loans. Unknown or other-company identifiers return 404. If legacy data makes an identifier ambiguous within the authenticated company, Finosu returns 409 and records nothing.

Request

  • transactionId is the lender’s stable transaction identity. It must be unique across every feed used by the authenticated company, not merely within one loan.
  • sourceSystem is a stable lowercase LMS identifier using letters, digits, ., _, or -. Finosu stores it as payment provenance.
  • amount is a positive USD decimal no greater than 21474836.47, with at most two fractional digits. JSON strings are recommended to preserve decimal precision.
  • paymentDate is the settlement date in ISO YYYY-MM-DD format.
  • status must be settled. Pending, submitted, failed, returned, reversed, or refunded events are not accepted by this contract.
  • Set settlesLoan to true only after the lender has finalized this payment as full payoff or negotiated settlement. It invokes the existing external settlement flow, including stopping servicing and pending communications.
CamelCase is preferred. Matching snake_case field names remain accepted. Extra fields are rejected.

Idempotency and conflicts

No separate idempotency header is needed. Finosu atomically claims (authenticated company, transactionId) in the payment transaction itself.
  • The first accepted request returns 201 and status: "recorded".
  • An exact retry returns 200, the original paymentTransactionId, and status: "duplicate". It does not apply money or settlement effects again.
  • Reusing the same transactionId with a changed loan, source, amount, date, currency, status, or settlesLoan value returns 409. The original payment remains unchanged.
The database uniqueness claim is race-safe, so simultaneous exact retries produce one payment.

Accounting and integration behavior

The payment is stored as a successful EXTERNAL_IMPORT transaction and uses the same scheduled-payment allocation and external-settlement services as the canonical CSV flow. Rollover rows may be created when one payment covers multiple installments, but their total equals the request amount. Finosu does not create an AchPayment, payment method, gateway transaction, or processor charge. Imports dated before boarding remain pre-boarding history and are not allocated to a later Finosu payment plan. Existing balance calculations exclude that history where the transferred balance already includes it, preventing double counting. Post-boarding imports participate in normal balance, reporting, and payoff calculations. EXTERNAL_IMPORT payments are ineligible for LMS payment writeback. The stored source provenance also identifies the originating LMS, preventing the import from being echoed back as a new Finosu-originated payment.

Response

Returns, reversals, and corrections

Do not represent a return, reversal, or correction by sending a negative amount or by reusing transactionId with changed data; both are rejected. The existing /ach-returns API is only for ACH payments Finosu originated and is not a general reversal API. Until a separate immutable external-adjustment contract is published, contact Finosu support for a reviewed correction. This endpoint never deletes or edits an existing financial record.

Errors

  • 401 — missing, invalid, or inactive X-API-Key
  • 404 — loanId is not owned by the authenticated company
  • 409 — ambiguous loanId, or conflicting reuse of transactionId
  • 422 — invalid identifier, amount, currency, date, status, or request shape
  • 500 — the atomic payment/accounting operation failed and was rolled back

Authorizations

X-API-Key
string
header
required

Body

application/json

A successful payment already settled outside Finosu. CamelCase is preferred; matching snake_case aliases are accepted. Extra fields are rejected.

loanId
string
required

Exact company-owned external loan/account identifier.

Required string length: 1 - 255
transactionId
string
required

Stable lender transaction identity, unique across the authenticated company.

Required string length: 1 - 200
sourceSystem
string
required

Stable lowercase identifier of the originating LMS.

Required string length: 1 - 50
Pattern: ^[a-z0-9][a-z0-9._-]*$
amount
string<decimal>
required

Positive USD amount no greater than 21474836.47, with at most two decimal places.

Pattern: ^(?!0+(?:\.0{1,2})?$)\d{1,8}(?:\.\d{1,2})?$
currency
enum<string>
required
Available options:
USD
paymentDate
string<date>
required

Settlement date in YYYY-MM-DD format.

status
enum<string>
required
Available options:
settled
settlesLoan
boolean
default:false

True only for a lender-finalized full payoff or negotiated settlement.

Response

Exact idempotent replay; no accounting or settlement effects were repeated.

paymentTransactionId
string<uuid>
required
transactionId
string
required
loanId
string
required
amount
string<decimal>
required
currency
enum<string>
required
Available options:
USD
paymentDate
string<date>
required
status
enum<string>
required
Available options:
recorded,
duplicate
replayed
boolean
required
overpayment
boolean
required
settledLoan
boolean
required