ParseData

Data / Sources & Methodology

Provenance is the product.

We turn two dozen differently-keyed, differently-cadenced public federal and state sources into one attested, point-in-time, entity-resolved record you can trust in a pipeline. Anyone can download a government file; the work is normalizing, resolving, crosswalking, and signing everything that comes after. This page documents that machine — not a build recipe, but the disciplines that make the output trustworthy.

24+
public sources
7
signal categories
3.73M
resolved employer entities
5.07M
source-record → entity links

The shape of it

Six stages, one record

  1. 01AcquireTwo dozen sources, many formats
  2. 02NormalizeSet-based, idempotent upsert on natural keys
  3. 03ResolveTS↔SQL parity-checked deterministic entity graph
  4. 04CrosswalkEIN ↔ CIK ↔ ticker, identifier-verified
  5. 05Derivearchive-and-diff events, point-in-time vintages
  6. 06Servekeyset feeds + HMAC-SHA256 attestation

Every row you pull has traversed all six stages. The rest of this page walks each one — how the data is acquired, how it is normalized and resolved, how identifiers are crosswalked, how events are derived under point-in-time discipline, how it is served, and how it is signed.

Stage 01 — Acquire

Broad coverage, by signal category

No two sources publish the same way — some expose a delta API, some only exist as dozens of separate state files with no shared schema, some are full-text search engines rather than datasets. Each gets a purpose-built, idempotent, resumable fetcher; raw downloads land on dedicated bulk storage, never in the repo, and every run writes a provenance-ledger row (source, vintage, row count, status). The point isn’t the plumbing — it’s that acquisition is repeatable and recorded, so every downstream record traces back to a named source and vintage.

Enforcement & safety

Facility inspections, violations, recalls, warning letters, and labor cases, each as filed with the agency.

EPA · OSHA · MSHA · PHMSA · FDA · NLRB · DOL WHD

Workforce & immigration

H-1B / PERM / prevailing-wage disclosures, benefit-plan filings, and WARN layoff notices.

DOL OFLC · DOL EBSA · state labor agencies

Healthcare & life sciences

Drug approvals, device clearances, clinical trials, prescriber and hospital data, and shortage designations.

FDA · CMS · HRSA · NIH · VA

Financial distress & sanctions

Late-filing and going-concern events, insider transactions, exemption revocations, and exclusion / sanctions lists.

SEC · IRS · HHS-OIG · GSA · Treasury OFAC · Commerce BIS

Carriers, transport & spectrum

Motor-carrier census and safety, aircraft registrations, and wireless-license activity.

FMCSA · FAA · FCC

Federal contracting

Contract and grant opportunities, prime awards, and the prime → sub award cascade.

SAM.gov · USAspending · Grants.gov

Innovation & licensing

Granted patents and assignees, federal permits, and inspected establishments.

USPTO · TTB · USDA FSIS

Stage 02 — Normalize

Set-based, idempotent, resumable

Nothing is loaded row-by-row. Bulk files stream into staging and then upsert into the normalized tables on the natural key — a USDOT number, a case number, a registry id, or, where a source carries no key, a hash of the normalized identity fields. Re-running any ingest converges to the same state.

Name and address normalization is a single, tested reference implementation: legal-suffix stripping applied repeatedly (so ACME HOLDINGS CORP LLC → ACME HOLDINGS), punctuation collapse, USPS street-word canonicalization, and a distinctive-vs-generic classifier. This matters because it is also the join key for entity resolution — which is where determinism becomes non-negotiable.

Stage 03 — Resolve

A deterministic entity graph, proven line-for-line

The employer graph resolves 3.73M entities across 5.07M source-record links — WHD, OSHA, ECHO, LEIE, SAM, OFLC LCA/PERM, and gated FMCSA rows — with no fuzzy matching and no ML. Matching runs as set-based SQL for speed, but the SQL normalization functions are generated from the TypeScript reference implementation, and every build re-verifies TS ≡ SQL on a live sample before it touches a single row — any divergence aborts the build.

the parity gate, run before every rebuild
// A single TypeScript reference implementation is the source of truth for
// normalization; equivalent Postgres functions are GENERATED from it. Before
// every rebuild we sample real values and check every function, TS vs SQL:

for (const r of rows) {
  assert(normalizeName(r.v)          === r.sql_norm_name);
  assert(normalizeAddressLine1(r.v)  === r.sql_norm_addr);
  assert(normalizeCity(r.v)          === r.sql_norm_city);
  assert(zip5(r.v)                   === r.sql_zip5);
  assert(normalizeState(r.v)         === r.sql_norm_state);
  assert(isDistinctiveName(...)      === r.sql_distinctive);
}
// mismatches.length > 0  →  throw, abort build.   "TS == SQL for all functions"

Confidence tiers, disclosed on every row

A record links to an entity at one of three deterministic tiers. The tier and its confidence are carried on the link and surfaced in the feed — you set the threshold, we never hide the basis.

TierMatch basisConfidence
T1normalized name + ZIP50.95
T2normalized name + city + state0.85
T3normalized name + state (distinctive names / address-less rows)0.60

The trap in name-and-state matching is generic names. A distinctive-name classifier (single-token and stoplisted names are not distinctive) gates the entity key: distinctive names may merge on name + state, but generic names must additionally agree on ZIP, city, or resolve to their own record — so “Smith Trucking” in Texas never collapses into one phantom entity. FMCSA’s millions of carriers are further gated: a carrier joins the cross-source graph only when its normalized name+state (plus zip/city agreement for generic names) matches a non-FMCSA record.

Stage 04 — Crosswalk

EIN ↔ CIK ↔ ticker, verified only

Public-company identity is asserted only when an identifier proves it. FEIN arrives on recent workforce filings (resolved on 88.9% of 2026 workforce rows); CIK↔EIN and the ticker come from public SEC reference data. A row’s ticker_match_basis is set to cik or ein only on an identifier match; a distinctive-name-only match to a unique registrant is flagged name_candidate and the ticker is not asserted is_public_company stays false. 42,596 workforce rows and 1,458 distress subjects carry an identifier-verified ticker; most subjects are private, and false is the correct, common value.

Stage 05 — Derive

Point-in-time, archive-and-diff

The feeds sell changes, and changes only mean something if the past is fixed. Two disciplines make that true:

Point-in-time, no restatement

Every row carries both event_date (when the thing happened, per the agency) and as_published_date (when it entered our record). We never silently rewrite history: a corrected filing is a new vintage, not an overwrite. You can reconstruct exactly what was knowable on any past date — the discipline back-testers and credit teams require.

Archive-and-diff derivation

“New” is computed, not assumed. Sources that prune old rows from their own sites are upserted cumulatively so history is kept; windowed pulls overlap and upsert on a stable key. Every derivation is idempotent — a re-run produces the same events, never duplicates.

The distress composite is a full deterministic rebuild over ten observational markers (WARN 180d, Form 5500 participant-drop ≥20% YoY, final filing, and Schedule H asset drop, IRS auto-revocation, SEC NT late / 8-K distress-item / going-concern, FMCSA authority revocation, and — only for subjects already carrying a marker — an active enforcement case). It counts records present, with dates. It is never a score.

Stage 06 — Serve & attest

Keyset serving, signed provenance

Feeds serve through opaque keyset cursors — the cursor encodes the last row’s sort key, so a drain is exact and its cost is flat at any depth, even as new rows land mid-pull. And every response is signed: an _meta block naming dataset, source, source URL, and vintage, plus an HMAC-SHA256 signature over the canonicalized payload + provenance.

the attestation, deterministic and verifiable
// canonical() sorts object keys recursively → a stable byte string, so the
// same payload always signs identically. HMAC-SHA256 over {payload, dataset,
// source, source_url, vintage} with the gateway secret. scheme: hmac-sha256-v1.
const message   = canonical({ payload, dataset, source, source_url, vintage });
const signature = createHmac("sha256", secret).update(message).digest("hex");
// On dispute we can prove a given payload was served with a given source & vintage.

The signing chain extends past the read: saved-Parse deliveries are HMAC-signed with the Parse’s own secret (X-Govparse-Signature), and delivery is at-least-once — the per-feed watermark advances only after your endpoint returns 2xx.

The estate

Breadth and freshness, without the map

ParseData draws from two dozen public federal and state sources across the 7 signal categories above — together, millions of official records, every one an as-filed government record with its date, resolved to 3.73M employer entities. We deliberately don’t publish a table-by-table map of the estate or the acquisition scripts behind it; what earns your trust is that each record is normalized, entity-resolved, point-in-time, and attested — not a recipe you could clone.

Each source refreshes on the cadence its publisher actually uses — daily for opportunity feeds, weekly for enforcement re-exports, quarterly for disclosure drops, annually for the largest program files. The entity graph rebuilds after each ingest wave, so resolution always sees the freshest sources. These are real scheduled jobs kept in lockstep, not aspirations.

Counts are records present, with dates — never a score or a characterization of any company. The machine-readable endpoint contracts over these datasets are in the catalog.

Field-level detail

Join keys, classifications, and metrics

The health and pharma datasets carry provider- and hospital-level join keys and classifications, so a pull can target by identifier, drug class, molecule, prescriber specialty, or staffing metric. Each field is a value as filed with the agency — never a score or a characterization of any prescriber, hospital, or company.

FieldOnWhat it carries
NPIPart D prescriber dataNational Provider Identifier — the 10-digit join key on every Part D prescriber row; carries prescriber name, specialty, and state as filed.
drug_classPart D drug-class mapTherapeutic-class map (GLP-1, SGLT2, DPP-4, statin, and more) keyed to the brand / generic drug name, so a pull can be scoped by class.
brand / genericPart D prescriber-and-drug dataMolecule-level detail — the specific drug behind each provider-and-drug row, plus total claim and beneficiary counts as reported.
prescriber specialtyPart D prescriber rosterThe provider's CMS specialty, so targeting can filter to endocrinology, cardiology, primary care, and the like.
CCNhospital cost reports + Care CompareCMS Certification Number — the hospital-level join key linking cost-report staffing to Timely & Effective Care throughput per facility.
FTE staffing ratioshospital cost reportsWorksheet S-3 full-time-equivalent staffing counts per hospital and the derived year-over-year staffing change, as filed.
shortage scoreHRSA shortage designationsThe HPSA shortage score and the MUA Index of Medical Underservation for each designated area, as published by HRSA.

The drug-class map groups Part D molecules into observed therapeutic classes — GLP-1, SGLT2, DPP-4, statin, and more — so a Part D pull can be scoped to a class or a single molecule and rolled up per prescriber NPI and specialty. On the hospital side, a CCN joins cost-report full-time-equivalent staffing to the Timely & Effective Care throughput measures for the same facility. It is a classification of the drug and a count of what was filed, not a judgment about any provider.

Guardrails

Where the build stops itself

Observational data

Every field is a record that exists in a named federal source, with its date — never a score, prediction, or characterization of any company. Public-source records are matched to employers by normalized name and address; match tier and confidence are disclosed on every response. FirmStanding is not a consumer reporting agency and this is not a consumer report — not for use in determining eligibility for employment, credit, insurance, tenancy, or any other purpose regulated by the Fair Credit Reporting Act (FCRA).

The receipts for all of this — schemas, samples, and per-column source and cadence — live on each feed page, and the machine-readable endpoint contracts are in the catalog.