Interim vs Final SOS Data: Which Underwriting Steps Can Move First?

September 16, 2026
September 16, 2026
10 Minutes Read
Secretary of State APIblog main image

Executive Summary: Cobalt's cachedData feature creates a useful middle state in long-running Secretary of State searches: structured business information may be available while the live lookup is still processing. Lenders do not need to choose between stopping every task and pretending verification is complete. They can classify workflow steps by reversibility, allow selected preparation to proceed on clearly labeled interim data, and keep decision-bearing actions behind the completed-live gate.

What Is the New Middle State?

Why is the response useful but unfinished?

An incomplete response can include a cached match with fields such as business title, status, normalized status, registration state, and updatedAt. The same response retains 202, Incomplete, and retryId, so the live search remains open. Cobalt's public guidance says this status means processing continues rather than that the request failed.[1]

The data can reduce idle work because an application no longer has to look empty while the state site responds. It cannot, by itself, change the request into a completed live verification.

Why do binary workflows mishandle it?

Many systems model SOS verification as only pending or complete. If data appears, downstream services may infer completion from populated fields. If the top-level status remains pending, other systems may freeze the entire file.

Add an explicit interim state instead. Cobalt's status documentation already distinguishes incomplete processing, cache-related outcomes, final no-results, and failure.[2] Preserve those meanings in the lender's orchestration layer.

Data availability and verification finality are separate dimensions.

How Should Underwriting Steps Be Classified?

What makes a step reversible?

A reversible step can be undone or recomputed without committing a credit outcome, sending money, making a customer representation, or losing the earlier evidence. Examples may include prefilling a review panel, preparing an entity comparison, assigning a queue, or requesting a human check. The lender must decide which examples fit its products and controls.

Use a written test rather than an informal list:

• Business effect. Does the step approve, decline, price, fund, or communicate a final result?

• Undo path. Can the step be reversed automatically if live data differs?

• Visibility. Will a reviewer see that the source is cached and live is pending?

• Dependency. Could another service interpret the output as completed verification?

• Evidence. Will the cached observation, age, rule, and later live result remain traceable?

• Owner. Is one team accountable for the rule and its changes?

If the answer is unclear, keep the step behind the live gate.

What makes a step decision-bearing?

A step is decision-bearing when it changes applicant treatment or commits an outcome that is difficult to reverse. Approval, decline, funding, final identity disposition, and a completed-verification flag belong here unless the lender's authorized policy says otherwise. The new feature does not set or modify that policy.

The distinction is about effect, not interface. A button click can be reversible; an invisible service update can be final. Trace the downstream consequence before classifying the step.

Map each candidate step through every consumer before approving it for interim use. A status written by the orchestration service may feed a decision engine, a customer portal, a document generator, and a reporting warehouse. If one consumer treats an interim value as final, the chain is not reversible in practice. Record the permitted consumers and block propagation to every destination that has not been reviewed.

How Can a Workflow Encode the Separation?

Which states should the model include?

Use one verification request with source-aware observations and guarded transitions. A compact model can be expressed as:

accepted
  -> live_pending_no_cache
  -> live_pending_with_cache
       -> interim_preparation_allowed | interim_review_only
  -> live_complete_match | live_complete_no_match | terminal_error
       -> lender_disposition

The interim branch is subordinate to live_pending. It should not be a shortcut to live_complete_match. Microsoft describes asynchronous request-reply systems similarly: acceptance and a status resource represent work still in progress until a terminal result is available.[3]

How should downstream permissions be represented?

Return named permissions rather than one broad boolean. may_prefill_review is safer than verified=true. Each permission should identify its policy version and observation ID. If a cached record changes or the live result arrives, recompute permissions instead of leaving stale flags in place.

Keep provider state and lender permission separate. Cobalt supplies response status and data; the lender's rules decide what the organization may do with them.

Apply permissions transactionally with the observation that produced them. A worker should not write interim data, fail before writing its source label, and leave a complete-looking record behind. Either persist the observation, provenance, process state, and permission together, or leave the prior state unchanged and retry safely. This protects the business meaning even when infrastructure fails between writes.

Which Preparation Can Move Before Live Completion?

What are defensible categories to evaluate?

Candidate categories include populating a clearly labeled internal panel, calculating non-final comparisons, prioritizing a queue, collecting missing documents, and preparing a case for review. These are examples for policy design, not universal permissions.

The updatedAt field should be evaluated before any age-sensitive interim use. Cobalt explains that cached records carry timestamps for customer recency decisions[4] and that update patterns vary by state.[5] A record's presence alone is not an age pass.

Which preparation still needs guardrails?

Prefill can influence a person even if it does not trigger a machine decision. Label the source and pending state, prevent copied values from becoming permanent without confirmation, and show what changed when the live result arrives. Queue prioritization also needs a neutral rationale so a cached match difference is not treated as fraud or applicant fault.

The lender owns interface language, age thresholds, match rules, and all credit consequences. Cobalt does not prescribe them.

Which Actions Should Stay Behind the Final Gate?

Why must final verification remain closed?

The feature brief identifies cached information as interim and the later live search as final. Cached data may be stale, may have no live screenshot, and may differ from the state site's result because matching behavior differs. Those constraints make a separate final gate necessary even when the early record looks plausible.

Cobalt's source-identification guidance recommends keeping cached and live provenance visible.[6] Store the final result as a new observation and transition the request only after the documented terminal state arrives.

What if policy wants to use cached data more broadly?

That is a lender governance decision outside the API contract. Require an authorized owner, explicit scope, documented evidence, monitoring, exception handling, and an undo or escalation plan. Do not let an engineer expand a reversible prefill rule into approval authority by reusing a generic flag.

This article does not establish a regulatory standard or say that cached data is sufficient for a particular credit decision. It defines an integration boundary that preserves the provider's interim and final meanings.

Make the boundary visible in service contracts. A downstream response can expose verificationPhase: live_pending, dataSource: cached, and a narrow list of allowed operations. Reject calls that request a final-only action while the phase is pending. Server-side enforcement matters because interface labels alone cannot stop another service from calling a decision endpoint.

What Happens When cachedData Is Absent or Rejected?

Does absence create a negative result?

No. The optional field appears when a cached match is available. Cobalt's cache-miss guidance says an unsuccessful cached search does not establish that a business is absent from the state registry.[7] Keep the request pending and wait for live.

Do not create an empty entity, final no-match, adverse signal, or second independent request. The absence branch simply has no interim preparation input.

What if the record fails age or match policy?

Retain the observation and the failed policy result if allowed, then withhold the named interim permission. The live search continues. Use separate codes for cache absent, age rejected, match rejected, and final live no-match so operations can explain each case.

The final no-match belongs to the terminal live response, not to an interim policy failure. Cobalt's documented statuses keep those conditions distinct.[2]

Operations should see a next action for every non-final branch. Cache absence may say "live search continuing." An age rejection may say "interim data withheld by age policy." A match review may name the fields requiring comparison. Clear branch language reduces manual resubmission and keeps staff from converting a waiting state into an unsupported conclusion.

How Should the Live Result Reconcile Earlier Work?

What should happen when fields agree?

Store the live response, mark the request complete, and let final-decision rules evaluate it. Prepared comparisons or forms can be confirmed against the live observation. Record that confirmation rather than silently replacing the source label.

Use the original retryId or callback correlation to update the same lender request. Cobalt supports polling and callbacks for long-running requests.[8] Both delivery paths should reach the same transition logic.

What should happen when fields differ?

Pause dependent work and create a neutral comparison case. Preserve both observations, query inputs, timestamps, identifiers, and any interim action already taken. Compare stable identifiers and context rather than assuming the top-ranked name proves error or misconduct.

Cobalt explains that match confidence and alternative results need contextual interpretation.[9] The no-match exception guide offers a related operations pattern, while this workflow focuses on cached-to-live transition.

How Should a Lender Test and Govern the Split?

Which scenarios belong in release testing?

Test cache present and absent, age pass and fail, match pass and review, duplicate incomplete delivery, callback and polling completion, live agreement and variance, final no-match, and terminal error. Verify that no interim branch can set the terminal verification flag.

AWS recommends idempotent handling around retries because repeated delivery should not repeat the state effect.[10] Give the final transition one idempotency key and ensure duplicate polls or callbacks cannot trigger a second disposition.

Also test partial failure around each permitted preparation step. Simulate a worker crash after storing the interim observation, after granting a permission, and after sending work to a queue. Reprocessing should converge on one request state and one business effect. Then run the same cases when the live result arrives before the retry, so a late interim worker cannot move a completed request backward.

Which evidence should operations retain?

Record what data was available, when it was available, the policy version, the permission granted or withheld, every interim action, the final observation, and the closing disposition. OWASP recommends recording event status, reason, and resulting action as part of useful application logging.[11]

Review branch volumes and variance patterns before expanding permissions. Do not promise throughput or approval gains without measured customer evidence. For the broader integration model, see Cobalt's asynchronous webhook architecture guide. To map reversible and final gates into your own workflow, schedule a demo.