EntitySearch State Data
Structured state-level dataset for sidebar components. This data is designed for use in sidebar components on external websites.
Status
Enrichment is complete for 51 of 51 jurisdictions: all 50 states plus the District of Columbia (washington-d-c.json, stateAbbr: "DC"). Initial batch enrichment finished 2026-05-12, and the full set was re-verified against official sources during the 2026 verification campaign.
Note that root ../states.json deliberately remains a 50-state map and does not include DC.
- Coverage: all 50 states,
ALthroughWY, plusDC - Each state file contains contact info, addresses, hours, renewal links, LLC filing facts, name reservation details, and official sources — or consciously left as
nullif not available from official sources. - Root
../states.jsonrecords have been aligned with official fee/source corrections.
Structure
entitysearch-state-data/
├── README.md
├── schema/
│ └── state.schema.json # JSON validation schema
└── states/ # Individual state JSON files, one per jurisdiction
└── alabama.json # Example state file
That is the whole published surface: a schema and 51 records. The dataset ships no images and
no logos of any kind, which is why stateSeal is null in every record. An application that
wants a seal supplies its own; see Optional Enrichment Fields.
Schema Fields
| Field | Type | Description |
|---|---|---|
stateName | string | Full state name |
stateAbbr | string | 2-letter state abbreviation (e.g., AL) |
stateSlug | string | URL-friendly slug (e.g., alabama) |
stateSeal | string|null | State seal URL (WebP preferred) |
businessEntitySearch | object | Search CTA and URL |
secretaryOfState | object | Agency information |
hours | object | Operating hours |
physicalAddresses | array | Physical addresses |
mailingAddress | object | Mailing address |
renewals | object | Renewal links |
corporateDocuments | object | Template links |
filingFacts | object | LLC fee, annual report, name reservation |
sources | array | Official sources |
lastVerified | string | ISO date (YYYY-MM-DD) |
Optional Enrichment Fields
The following fields are not mandatory core data for the entity search experience, and missing values are not considered data quality issues:
| Field | Status | Note |
|---|---|---|
stateSeal | Optional | In an app that consumes seal/logo assets, e.g., Astro src/assets/images/statesseals, can be managed there. |
secretaryOfState.officialName | Optional | Current official name/since info is time-sensitive political/personnel data; can be left empty without a separate maintenance process. |
corporateDocuments | Optional | Operating agreement, bylaws, and partnership agreement template pages can be produced as separate internal content. If no official state template exists, stays null. |
Core data target: Official search URL, agency website, contact info (phone/email if available), address, hours, filing/renewal facts, and source tracking — practical information for the entity search user.
Cross-namespace contract
filingFacts.nameReservation holds the real out-of-pocket reservation cost, not the
statutory filing fee. It mirrors name-rules/states/<slug>.json's nameReservationTotalCost,
which is the authoritative field, and the two must agree. Where a state's statutory fee and
real cost differ, nameReservationNotes explains the gap.
stateName, stateAbbr, and stateSlug must match the name-rules and dba-rules records
for the same jurisdiction.
Data Rules
- Official sources only. "Official" means the government body that publishes the fact,
not the domain suffix. See Methodology in the repository README
for the list of official non-
.govhosts and the narrow mirror exception. - Fee and requirement verification: Every fee, due date, and filing requirement is verified against the official state government portal, official fee schedule, official statute, or official filing portal
- Source requirement:
sources[], rootofficial_link, and rootsource_urlfields must point to official sources - No third-party sources: Legal service providers, blogs, SEO pages, news sites, or commercial summary sources are not used
- Unknown values: Left as
nullor empty - Date format: ISO 8601 (
YYYY-MM-DD) - Image format: WebP preferred
- URL validation: Valid URI format required
Usage
const stateData = require('./states/alabama.json');
// Sidebar usage example
console.log(stateData.stateName); // "Alabama"
console.log(stateData.secretaryOfState.website); // "https://www.sos.alabama.gov"
Validation
To validate JSON files against state.schema.json:
npx ajv-cli validate --strict=false -s entitysearch-state-data/schema/state.schema.json -d 'entitysearch-state-data/states/*.json'
JSON parse check:
jq empty states.json entitysearch-state-data/states/*.json
Future Update Workflow
Since all states have been enriched, future work should focus on periodic verification, official fee change tracking, and link health checks rather than generating new batches. Maintenance work should still follow the same batch logic.
Batch Selection
- Divide states to update into small batches of 2-3 states.
- For each batch, first read the existing state JSON files and root
states.jsonrecords. - Clearly state batch scope in the final response and handoff notes if needed.
Example:
sed -n '1,220p' entitysearch-state-data/states/wisconsin.json
sed -n '1,220p' entitysearch-state-data/states/wyoming.json
sed -n '490,540p' states.json
Official Source Research
For each state, only use these source types:
- Secretary of State or Department of State corporation/business division pages
- Department of Financial Institutions, Department of Revenue, or official filing agency pages
- Official fee schedule HTML/PDF pages
- Official annual report, renewal, or business filing portals
- Official state statute pages
Do not use:
- LegalZoom, Northwest, ZenBusiness, Harbor Compliance, Forbes, etc. commercial pages
- Blogs, SEO landing pages, news sites
- Search result snippets only
If the audit returns
403, timeout, or connection reset due to official portal bot protection, the URL should not be automatically dropped. If it's an official state page, it can be kept; if possible, add an additional official200-returning source that supports the same information.
Fields to Update
For each state file, check these fields:
businessEntitySearch.urlsecretaryOfState.agencysecretaryOfState.websitesecretaryOfState.phonesecretaryOfState.emailhours.timezonehours.regularphysicalAddresses[]mailingAddressrenewals.onlineRenewalUrlrenewals.paperRenewalUrlrenewals.notesfilingFacts.llcFeefilingFacts.llcFeeNotesfilingFacts.annualReportfilingFacts.annualReportDuefilingFacts.nameReservationfilingFacts.nameReservationNotessources[]lastVerified
In root states.json, only update if official data changed or source link was corrected:
formation_feeannual_report_feeannual_report_due_dateofficial_linksource_urllast_verified- root
last_updated
Timestamp and Source Format
lastVerifiedin touched state file must be current ISO date.lastAccessedin touched source records must be current ISO date.- Relevant state
last_verifiedin rootstates.jsonmust be updated. - If official data change was made across the dataset, root
last_updatedmust be updated.
Annual Report and Fee Rules
- If there's no annual report fee in root
states.json, useannual_report_fee: 0. - Follow existing pattern in detail state JSON: if a state has no annual report,
annualReport: nullandannualReportDue: "N/A"can be used. - If online and paper fees differ, the most practical/current online fee can be used as the main value; paper fee should be clearly noted in notes.
- If there's a minimum/maximum or asset-based fee, write the minimum fee as the main value; explain variable structure in
filingFacts.*Notesandrenewals.notes.
Link health
Every batch ends with a liveness pass over the URLs it touched. The maintenance tooling that
performs it is not part of the published dataset, and its output is not committed. What matters
for anyone reading the data is the rule the pass applies, which is stated above: a 403, a
timeout, or a connection reset is bot protection or a network condition, not a dead page, and
no URL is moved without 404 evidence read from the page itself.
Batch End Checklist
- Run JSON parse check:
jq empty states.json entitysearch-state-data/states/*.json
- Run schema validation:
npx ajv-cli validate --strict=false -s entitysearch-state-data/schema/state.schema.json -d 'entitysearch-state-data/states/*.json'
- Re-check the URLs the batch touched, and note any that could not be read.
- Record the batch scope, the caveats, and the next step in the maintenance notes.
- Check with
git diffthat only expected files changed. - Write commit message to describe batch scope.
Example commit messages:
Enrich Wisconsin and Wyoming data
Refresh California and Colorado official fee sources
Audit annual report URLs for southeast batch
Agent Notes
- Keep changes small and limited to batch scope.
- Do not revert other user or agent changes.
- Preserve existing field order and file style in JSON edits.
- If changing fee or due date, specifically note in final response.
- If official URL audit errors, try to distinguish whether it's automation-related or a genuinely broken link.
- If a broken official link is replaced with an updated official page, both state JSON
sources[]and rootstates.jsonsources must be updated.
Built With This Dataset
EntitySearch.us
Comprehensive step-by-step guides for business entity search across all 50 US states. Each state page features screenshots, official portal links, and LLC formation facts powered by this dataset.
https://entitysearch.us/texas/
https://entitysearch.us/wyoming/
https://entitysearch.us/delaware/
This dataset is part of the us-llc-fees-dataset repository.