Every state, and what it does not license.
21 published states across three lanes. Generated from the type definitions the engine is built from, so this page cannot describe a state the API does not serve.
Most systems report one status. The distinction between "the broker said yes" and "we went back and checked" is the reason there are 21.
What a search-derived finding proves
Present only on findings the search lane produced. Absent on direct-scan findings, where scanStatus already carries the verdict. Only current_page_confirmed counts toward exposedCount or drives a filing.
-
indexed_candidateA search index held a URL whose title matched a name. The page was NOT fetched, so this is not established exposure and must not be rendered like a confirmed finding. -
current_page_confirmedFetched, classified as an individual profile, and matched to the subject on an attribute found in the rendered page content. The only search state that counts toward exposedCount. -
subject_not_observedFetched, but confirmation was not reached. NOT a claim of absence — carries a NotConfirmedReason, because "we could not confirm" and "they are not there" differ. -
current_page_unreadableThe fetch was blocked or errored. Unresolved, and never downgraded to "not there". -
wrong_subjectThe live page is about a DIFFERENT named person. Suppressed from the customer's results in every mode, because showing a stranger's profile is worse than showing nothing.
Why a fetched candidate did not confirm
Always accompanies subject_not_observed. "We could not confirm" and "they are not there" are different facts, and only the first is what that state records.
-
stale_indexThe index entry pointed at a page that no longer exists (404/410). -
generic_redirectThe fetch landed somewhere structurally different — a dead profile bounced to a homepage. -
soft_404HTTP 200 with a "no results" body. A failure the status code does not report. -
page_changedThe page rendered but is not an individual profile: a search page, index, or opt-out guide. -
identity_insufficientThe subject is named but no independent discriminating attribute was found, so the match could be a namesake. Two attributes are required when the surname is common. -
parser_uncertainWe could not tell. The honest default rather than a guess in either direction.
Where a filing actually stands
Ten states, because "sent" and "worked" and "could not be sent" are three different things. Note undeliverable in particular: the request never reached the broker, which is counted as neither filed nor pending.
-
queuedRecorded and waiting for the send drain. Nothing has left the building. -
submittedThe statutory request was sent to the broker's listed compliance address. Submitted is NOT delivered and NOT accepted — it means a well-formed request went to the address on file. -
needs_inputBroker replied asking for something before it will proceed (a postal address, DOB, proof of authority, a consumer portal step). Sent, NOT failed, NOT confirmed — awaiting input. Carries a structured `needsInput` so the demand is actionable, not a blob (spec §6). -
confirmedThe broker confirmed it acted. This sets providerAttestedAt, NOT scanVerifiedAt: a broker's word is evidence of what the broker said, never evidence the record is gone. -
failedThe broker received the request and declined it. A decision was made, and it went against us — distinct from `undeliverable`, where no decision was ever made. -
captcha_requiredThe removal route is gated behind a CAPTCHA the engine will not solve on the subject's behalf. -
not_removableNo statutory removal route exists for this source. Detecting a listing and being able to file against it are separate things, and this is where they diverge. -
no_recordsBroker's identity engine found no name+DOB match to suppress. Terminal, and NOT a failure — the scan can still have found the person by name (they match differently). -
undeliverableThe filing never reached the broker: a hard bounce came back for its compliance address (SPEC-BOUNCE-CLASSIFICATION §4). Distinct from `failed`, which means the broker received the request and declined it — a decision that was never made here. Distinct from `pending`, which claims we are awaiting a reply that can never come. Counted in neither `filed` nor `pending`, because "we could not file" must never be reported as "we filed", the same contract `canAssertClean` enforces one layer up. -
deferredRecorded as owed but not executed, because the removal executor is gated off. An audit row exists so the trail is correct the day it is enabled; nothing was sent.
Two timestamps that are never derived from each other
providerAttestedAt is when a broker told us it had acted. scanVerifiedAt is when we went back and observed the record gone.
Neither is ever computed from the other, and a filing can carry the first for months without the second. A vendor that reports one number cannot tell you which of these it had — and for a compliance claim, that is the only thing worth knowing.