Floating vs. locking
When a borrower selects a product structure, there are two ways to move the loan forward:
Both paths send initial disclosures and freeze the loan to its selected product. The difference is the rate: a floated borrower remains exposed to market movement—up or down—until they lock, whereas a locked borrower is protected from increases but can no longer benefit from decreases (unless they pay for a float-down option). See Rate lock for the locked side of this flow.
Floating is not the same as simply attaching a product structure. Attaching a product structure starts a 3-business-day timer after which initial disclosures auto-fire. Floating dispatches those initial disclosures immediately, on demand, without waiting for the timer and without locking the rate.
Why float instead of lock?
Floating is useful when a borrower is ready to move forward with the loan process but is not yet ready to commit to a rate:- Begin processing sooner — Dispatching initial disclosures lets borrowers sign, establish ITP, and trigger order-outs (appraisal, title, verifications) without waiting to lock.
- Keep rate optionality — The borrower stays exposed to the market and can lock later if rates improve, rather than committing to today’s rate.
- Compress timelines — Because disclosures and order-outs can start before the lock decision, the loan can be further along by the time the rate is locked.
How floating works in Pylon
Float a product structure with thefloatStructure mutation, which takes the loan ID and returns the ID of the disclosures run it dispatched:
floatStructure validates the loan, then enqueues the initial disclosure package for the loan’s committed product structure. It deliberately does not lock the rate, send a lock notification, or run any post-lock change-of-circumstance workflow—it only performs the pre-lock half of the flow.
Preconditions
These checks run synchronously, before the run is enqueued. If any fails, the mutation rejects immediately with a client-correctable error and nothing is dispatched:- AUS must pass — The latest AUS run must allow locking. If AUS has not been run or has not passed, the mutation rejects with
AUS_LOCK_NOT_ALLOWED(HTTP 412). - The loan must not already be rate locked — A locked loan cannot be floated; the mutation rejects with
LOAN_ALREADY_LOCKED(HTTP 403). - The loan must not be frozen — A loan whose initial disclosures have already been sent is frozen and cannot have a second disclosure package dispatched.
- Initial disclosures must not already have been dispatched — If an initial disclosure package is already in flight or has completed successfully, the mutation rejects with
LOAN_INITIAL_DISCLOSURES_ALREADY_DISPATCHED(HTTP 412). This guarantees a borrower never receives duplicate initial disclosures. (A previously failed disclosure send does not count as dispatched, so it can be safely retried.)
Tracking the disclosure send
Because the send is asynchronous, use thedisclosuresRunStatus query—with the disclosuresRunId returned by floatStructure—to observe the outcome:
status settles. The status field transitions through:
When
status is FAILED, errors explains why. A common cause is a TRID timing rejection—for example, attempting to send an initial Loan Estimate when the loan is at or near its closing date:
This loan is N days before closing. Initial CD must be sent or closing date extended
This indicates the closing date is inside the window where a Closing Disclosure is required, so an initial Loan Estimate can no longer be sent. To resolve it, extend the loan’s closing date to a date comfortably in the future and call floatStructure again (a FAILED run does not block a retry).
Right after
floatStructure, expect status to be PROCESSING—a single immediate read will rarely show the final result. Poll every few seconds until it becomes SUCCEEDED or FAILED.Checking whether a loan is floated
TheLoan type exposes a derived isFloated boolean. A loan is floated when its initial disclosures have been sent but its rate is not yet locked:
isFloated as the canonical signal that a loan has begun the disclosure process but still has an open rate decision. A floated loan is also frozen (isFrozen is true), because its initial disclosures have been sent and its product structure can no longer be changed.
isFloated only flips to true once the disclosure package has actually been sent, not when floatStructure returns. If floatStructure succeeded but isFloated is still false after the run has settled, the send failed—check disclosuresRunStatus for the reason.Lifecycle: from float to lock
A typical floated loan moves through these states:- Product structure attached — The borrower commits to a product. The 3-business-day disclosure timer starts.
- Float requested —
floatStructureenqueues the initial disclosure package and returns adisclosuresRunId. The send then runs asynchronously; polldisclosuresRunStatusuntil it reportsSUCCEEDED. - Floated — Once the package is sent, the loan is frozen,
isFloatedis true, and the rate remains unlocked. - ITP established — Borrowers sign their initial disclosures, establishing Intent to Proceed (ITP) and triggering order-outs.
- Locked — When the borrower is ready,
confirmRateLocklocks the rate.isFloatedbecomes false (the rate is nowLOCKED) and the loan proceeds through processing toward closing. Because the loan was already disclosed while floating, locking it is a change of circumstance—see Locking a floated loan below.
Locking a floated loan
A floated loan has already received its initial Loan Estimate, so locking it changes the disclosed terms and owes the borrower a revised Loan Estimate as a change of circumstance. WhenconfirmRateLock is called on a floated loan, Pylon files a change-of-circumstance work item for the disclosure desk before committing the lock. The work item records the lock terms (when it was locked, the lock period, and who initiated it) along with the changes to the loan since the last disclosure, so the revised Loan Estimate is queued as soon as the lock lands rather than depending on someone remembering to request it.
The ordering is a guarantee: the disclosure work item is filed after every lock precondition has passed but before the rate-lock write, so a locked loan can never exist without a revised-disclosure work item owning the follow-up.
The confirmRateLock response returns the id of the support ticket that was opened, as changeOfCircumstanceTicketId:
changeOfCircumstanceTicketId is null when the loan was not floated—no revised Loan Estimate is due, so no ticket is opened. When the lock was a float→lock, the field is always present: the lock is refused if the ticket cannot be opened, so a successful response never leaves the id missing.
Locking a loan that was never floated (a direct confirmRateLock with no prior float) does not go through this path—there are no prior initial disclosures to revise.
Related concepts
- Rate lock - The second half of the flow, where the interest rate is committed
- Intent to Proceed (ITP) - Established when borrowers sign the disclosures that floating dispatches
- Automated Underwriting System (AUS) - Must pass before a loan can be floated
- TRID (TILA-RESPA Integrated Disclosure) - The regulation governing the initial disclosures that floating sends
- Change of circumstance - Why locking a floated loan requires a revised Loan Estimate
- Disclosures - How to retrieve and track the disclosures dispatched by floating
- Loan - Where
isFloatedand rate lock state are managed