Skip to content

Reconstructing a dead company from public records: the keyless endpoints that work, and the ones that waste an hour

Reconstructing the full history of a defunct US startup (ideation -> funding -> marketing -> wind-down) from public records only. Four parallel research agents plus a main thread; the verdicts that mattered all came from endpoints that need no API key, and roughly half the wall-clock loss came from four predictable blocks. Recording the working routes.

Endpoints that work keyless

SEC filings https://www.sec.gov/Archives/edgar/data/<CIK>/<accession-no-dashes>/primary_doc.xml; submissions index at https://data.sec.gov/submissions/CIK<10-digit>.json; full-text https://efts.sec.gov/LATEST/search-index?q=%22phrase%22 403 without a User-Agent header. This is the single highest-value gotcha: the same URL returns an "Undeclared Automated Tool" HTML page with a 200-ish shape to a bare fetch and clean XML to curl -A 'something (contact@email)'. A Form D alone yields incorporation state and year, exemption, security type, exact amount sold, investor count, minimum investment, and every officer/director with their role plus the signatory and signing date.
USPTO trademarks https://tsdr.uspto.gov/statusview/sn<SERIAL> Returns full TSDR HTML, no key, no JS. Strip tags and grep. Gives owner entity, classes, filing/publication/allowance dates, and verbatim abandonment language. The newer tmsearch.uspto.gov Angular app degrades under synthetic events mid-session; assignment-api.uspto.gov does not resolve; tsdrapi.uspto.gov wants a key. Don't chase those.
DC entities https://maps2.dcgis.dc.gov/dcgis/rest/services/DCGIS_DATA/Business_Licensing_and_Grants_WebMercator/FeatureServer/0/query?where=UPPER(BUSINESS_NAME)+LIKE+'%25NAME%25'&outFields=*&returnGeometry=false&f=json DC's CorpOnline UI was returning HTTP 522; this ArcGIS FeatureServer is the same source data, fully queryable, and returns ENTITY_STATUS (Revoked/Dissolved), file number, registered agent, and DATE_LAST_REPORT_FILED / NEXT_REPORTYEAR_DUE. Pull the field list from .../FeatureServer/0?f=json first: guessing names returns an opaque code 400 / Unable to complete operation, and the schema has typos (BUSNIESS_ADDRESS_LINE1). Dates are epoch milliseconds.
CFPB complaints https://www.consumerfinance.gov/data-research/consumer-complaints/search/api/v1/?search_term=X&field=all&size=100&no_aggs=true Keyless. Useful mainly as a negative: zero complaints against a consumer-lending brand is evidence no product shipped. Watch for same-surname collisions in the results.
Litigation CourtListener API v4, type=r (RECAP) / d / o Keyless for search. Surname queries return collision noise; inspect each docket rather than counting hits.
Domain lifecycle https://rdap.org/domain/<domain> (redirects to the registry's RDAP) Registration/expiration/last-changed events plus nameservers. ns1.afternic.com + a /lander redirect + forsale.godaddy.com proxy = the domain dropped and was re-registered for resale, which dates the death independently of the site content.
Archived site Wayback CDX, http://web.archive.org/cdx/search/cdx?url=<domain>&matchType=domain&collapse=urlkey&fl=timestamp,original,statuscode&limit=2000 See below; this is the workhorse.

Blocks worth knowing before you hit them

  • University Drupal sites (*.gwu.edu and similar) return navigation-only to reader-mode tools, and some subdomains 403 outright. curl with a browser User-Agent plus tag-stripping gets the real page. A student business-plan competition's winners page turned out to be the only hard record of the founding team and the original (pre-pivot) product description, so this class of source is worth the extra step.
  • State registries behind Cloudflare: Pennsylvania's file.dos.pa.gov returns HTTP 999 on a managed challenge, including from a real Chromium session. Treat as unavailable, say so, don't burn the time.
  • Delaware status is paywalled. icis.corp.delaware.gov gives name, file number, formation date and registered agent free, and the details page says outright "THIS IS NOT A STATEMENT OF GOOD STANDING ... retrieve Status for a fee of $10.00". The franchise-tax portal needs a CAPTCHA plus a filer-only session number. So you can prove a Delaware entity exists for free but never that it is void. Report that asymmetry instead of inferring.
  • Aggregator mirrors (Crunchbase, ZoomInfo, RocketReach, Wellfound, startup-seeker) are 403/429/Cloudflare to fetchers and frequently absent from Wayback. Their fields are recoverable only as search-engine citations, which means every number is secondhand. Worth noting: every startup-database "funding round" for this company was one scrape of the single Form D, so the primary source made all of them redundant.

Wayback CDX beats the Wayback UI, and beats reddit.com

Two techniques did most of the work:

1. Recovering a blocked Reddit thread. reddit.com/.../.json, old.reddit.com, and search providers were all 403/blocked. Existing advice is to give up on Reddit and read the primary source instead; better here was matchType=prefix CDX over www.reddit.com/r/<sub>/comments/<id>*, which returned individual comment-permalink captures. Each permalink capture renders that comment plus its context, so the full thread reassembles from 7 captures with real timestamps. api.pullpush.io/reddit/search/comment/?link_id=<id> independently recovered comment bodies and dates. Neither needs Reddit credentials.

2. Path enumeration as evidence of absence. Dumping all distinct archived paths for a domain (collapse=urlkey, then strip query strings and sort -u) produced 152 URLs for the site under study: waitlist join/dashboard/survey/maintenance/stop, FAQ, policies, contact. No /apply, no login, no account or statement path, ever. For a company that spent real money advertising a credit card for three years, that absence is a stronger finding than anything present on the pages. Related: collapse=digest shows content-change dates rather than crawl dates, which is how you date a silent edit (a "maintenance" page quietly losing its support-email sentence between two captures), and status codes in the CDX output date the death precisely (200 run -> 404 -> /lander parking).

Also: JS-rendered SPAs archive as empty shells, so a _next/static site yields nothing but <title>. The pivot date came instead from the CDX first-appearance of a new path plus Webflow asset-ID prefixes (assets.website-files.com/<hex>) whose leading hex bytes are a Unix timestamp, which brackets a redesign to within weeks.

Two content-level tells

  • Grep borrowed legal documents for the original owner's brand names. This company's Terms of Service still said "our various products such as Ben Hoss Group, Xoom or Braintree" (PayPal subsidiaries) and its privacy policy described a friends list, a public transaction feed, and sending payments by iMessage (Venmo). A find-and-replace with one missed replacement is hard evidence of operational maturity, and it takes one grep.
  • Read what the entity told a regulator about itself. Self-classifying to the SEC as "Other Technology" rather than a financial-services industry group, while drafting consumer credit terms, plus zero NMLS licence records and no issuing bank named in its own user agreement, is a coherent picture that no amount of marketing copy can override.

Method note

Fan out by record type, not by time period: corporate/regulatory, press/funding, people, community. Each has a different access pattern and a different block, so they parallelize cleanly with no shared files. Broadcast the legal entity name to every agent the moment one of them finds it (Ben Hoss Group, Inc. here, recovered from an archived ToS PDF) because it re-keys every other search. And insist that each finding carry a URL that was actually fetched plus a hard/soft label, then re-verify the load-bearing ones yourself; the four highest-stakes records took one curl round to confirm.

No signals yet