Skip to content
RateStack
Capability · Lock management

Lock management with an Exception Inbox the desk actually uses.

End-to-end rate-lock lifecycle: create, extend, cancel, fund. Exception Inbox with SSE push and AI-suggested resolutions. Sell-side pricing with per-investor audit. Per-organization desk configuration with effective-dated inheritance. ShedLock-guarded expiry sweeper that runs safely across replicas.

Overview

What it is, in one paragraph

Locks pin a specific ratesheet version + investor + rate at lock time. Every state transition (create → extend → cancel → fund) writes a journal entry with the actor, the timestamp, and the prior + next state, all hashed into the platform-wide audit chain. Sell-side pricing runs alongside loan-level pricing so the secondary desk sees the same numbers as the LO. The Exception Inbox surfaces detected anomalies (pricing drift, pullthrough confidence drop, missed fills) with AI-suggested resolutions, streaming via SSE for live triage. Lock-desk policy (cutoff times, max extension days, free-extension grace, fee curves) lives per-organization with effective-dated inheritance.

  • Pinned execution

    Lock captures the ratesheet version, the investor, the program, the noteRate, and the computed price. Repricing later uses exactly that pin.

  • Exception Inbox + AI suggest

    Pricing drift, pullthrough drop, sell-side mismatch — exceptions stream via SSE with an AI-drafted resolution. Resolve, dismiss, embed, or recompute.

  • Sell-side parity

    Sell-side pricing returns alongside loan-level pricing. The secondary desk and the LO see the same investor, the same trace, the same numbers.

  • Per-org desk policy

    Cutoff time, max extension days, fee curves, free-extension windows, allowed lock periods — all configured per organization with effective-dated inheritance from the platform default.

  • Lifecycle journal

    Every state transition writes a journal entry with the actor, the prior state, the next state, and the reason. Hash-chained into common_audit_log.

  • Distributed expiry sweeper

    ShedLock-guarded job runs on every replica; only one acquires the lock per minute and rolls eligible locks into EXPIRED, emitting locks.expired for downstream.

How it works

The pipeline, end to end.

Numbered steps from input to output. Each step maps to a specific subsystem you can inspect via OpenTelemetry.

  1. 1

    Quote becomes a lock

    Operator (LO or autopilot) selects a quote and submits a CreateLockRequest. The server re-prices to validate, captures the pin, and writes the lock + initial journal entry transactionally.

  2. 2

    Extend within policy

    ExtendLockRequest applies the org's extension fee curve, validates against the max-extension cap, and writes a journal entry. The lock's expiry timestamp slides forward.

  3. 3

    Exceptions surface as drift

    Detectors over pricing, pullthrough, and sell-side compare expected vs. observed; deviations fire to the Exception Inbox with an AI-drafted resolution and the cited source events.

  4. 4

    Sell-side runs alongside

    RequestSellSide fires the sell-side ladder against the same input + pin. CompleteSellSide marks the executed investor and writes a SellSidePricingView row.

  5. 5

    Fund and close

    FundLockRequest transitions the lock to FUNDED; locks.funded fires; the lock becomes immutable except for audit-only annotations.

  6. 6

    Sweeper expires what's idle

    Every minute, the ShedLock-guarded sweeper queries locks past their expiry, transitions them to EXPIRED, and emits locks.expired. Replicas race; one wins; everyone observes the result.

Hands on

Create a lock and pin the price

Live cURL sample — copy, paste, ship.

# Create a lock — server pins ratesheet version + computed price
curl -X POST https://api.ratestack.com/v1/locks?actorUserId=$ME \
  -H "X-API-Key: $RATESTACK_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: $(uuidgen)" \
  -d '{
    "loanId": "loan_8a7c4f",
    "investorCode": "INV_42",
    "noteRate": 6.625,
    "lockPeriodDays": 30,
    "executionMode": "BEST_EX",
    "comment": "Borrower confirmed rate, locking through 2026-06-02"
  }'

Why this matters

The pain it removes.

Defensible pricing on lock day

Pinning the ratesheet version means a lock cannot be 'lost' to a later activation. The price you locked is the price the engine reproduces, forever.

Exceptions stop hiding in email

The Exception Inbox is a single named surface — SSE push, AI suggestions, audit-chained actions. Triage is a workflow, not a fire drill.

One desk view across channels

Retail LO, hedge desk, and secondary all operate against the same lock row, the same audit chain, the same sell-side bid history.

Frequently asked

Direct answers, no marketing spin.

Can a lock survive a ratesheet rollback?

Yes. The lock pins the ratesheet version it was priced against. Rolling back a ratesheet does not affect existing locks; it affects future pricing only.

How do free-extension grace windows work?

The desk config carries a grace-window curve (e.g., 'first 7 days extend free'). The extend endpoint applies the curve at request time and journals the fee as $0.00 with the rule that fired.

What kinds of exceptions does the Inbox surface?

Pricing drift (Stage-1 vs Stage-2 disagreement), pullthrough confidence drop, sell-side mismatch (sell-side completion doesn't reconcile to the lock), and missed fills (locks expiring with no fund event). See the Exception Inbox feature for the full catalog.

What happens if two operators extend at once?

The lock row uses optimistic locking. The second writer gets a 409 Conflict with the current version; the operator retries with the new state visible.

How long are lock journals retained?

Indefinitely by default. Retention policy is configurable per environment but the recommended posture for compliance is no expiration on lock journals.

How we compare

Lock management with an Exception Inbox the desk actually uses. — vs the alternatives.

Specific angles, not generic feature checklists. Each row links to a longer side-by-side; we're transparent about where competitors are the better choice.

Comparisons reflect each vendor's public positioning. Where a fact is unverifiable, we mark it "Depends" or "Unknown" instead of guessing.

Ready to see it on your data?

Wire lock management with an exception inbox the desk actually uses. up to your real workflow.

We'll spin you a sandbox, load your actual ratesheets, and walk you through this capability against your top scenarios.

Lock management — lifecycle, exceptions, sell-side, audit | RateStack