osint-investigation

Follow the money via public records and sanctions data.

  • osint
  • investigation
  • public-records
  • sec
  • sanctions
  • corporate-registry
  • property
  • courts
  • due-diligence
  • journalism

Declared platforms: linux · macos · windows

Install
npx skills add 'https://github.com/NousResearch/hermes-agent/tree/main/optional-skills/research/osint-investigation'
Download bundle ↓
main · 24fd22bScanned 2026-09-15

Contributors

GitHub-linked commit authors for this SKILL.md at the saved revision. Co-authors and history before file renames are not included.

File history ↗
View on GitHub
← Back to SKILL.md

OpenCorporates — Global Corporate Registry

1. Summary

OpenCorporates aggregates corporate registry data from 130+ jurisdictions worldwide (~200M companies). Covers US state-level filings (NY DOS, Delaware DOC, California SOS, etc.), UK Companies House, EU registries, and most common-law jurisdictions.

2. Access Methods

  • REST API: https://api.opencorporates.com/v0.4/
  • HTML fallback: https://opencorporates.com/companies?q=...
  • Auth: API token required (free tier 500 calls/month, paid plans available)
  • Rate limit: Token-bound; un-tokened requests return 401

Set OPENCORPORATES_API_TOKEN env var. Get a free token at https://opencorporates.com/api_accounts/new.

3. Data Schema

Key fields emitted by fetch_opencorporates.py:

ColumnTypeDescription
namestrCompany legal name
company_numberstrRegistry-assigned number
jurisdiction_codestre.g. us_ny, us_de, gb
jurisdiction_namestrHuman-readable jurisdiction
incorporation_datestrYYYY-MM-DD
dissolution_datestrYYYY-MM-DD (empty if active)
company_typestrDomestic LLC / Foreign Corp / etc.
statusstrActive / Inactive / Dissolved
registered_addressstrRegistered office address
opencorporates_urlstrLink to OpenCorporates entity page
officers_countstrTotal officers on record
sourcestrapi, html, or html-fallback

4. Coverage

  • US: all 50 states + DC at state level (LLCs, corps, LPs)
  • International: UK, EU, Canada, Australia, NZ, many APAC + LATAM jurisdictions
  • ~200M company records cumulative
  • Update frequency varies by jurisdiction (UK CH is near-realtime; some state registries lag months)

5. Cross-Reference Potential

  • NYC ACRISname (LLC/corp owners of NYC property)
  • USAspendingname (corporate federal contractors)
  • SEC EDGARname (public companies + their subsidiaries)
  • ICIJ Offshorename (international corporate structures)

Join key: normalized company name. Some entries have previous_names arrays which are not currently exported by the fetch script — query OC directly for that.

6. Data Quality

  • Company-name spellings vary across re-incorporations and renames
  • Officer records are spottier than company records (many jurisdictions don't require officer disclosure)
  • Beneficial-ownership data is generally NOT here — most jurisdictions don't require it. UK Companies House has PSC (people with significant control) but that's not universal.
  • Cross-jurisdictional links (parent / subsidiary) are based on registry filings only; corporate trees are often incomplete

7. Acquisition Script

Path: scripts/fetch_opencorporates.py

# Search globally by name
python3 SKILL_DIR/scripts/fetch_opencorporates.py --query "Example Corp" \
    --out data/oc.csv

# Restrict to a jurisdiction
python3 SKILL_DIR/scripts/fetch_opencorporates.py --query "Example Corp" \
    --jurisdiction us_ny --out data/oc_ny.csv

# Set token via env or flag
OPENCORPORATES_API_TOKEN=xxx python3 SKILL_DIR/scripts/fetch_opencorporates.py \
    --query "Microsoft" --out data/oc.csv

Without a token the script falls back to scraping the HTML search page. The fallback is brittle and only fills in name, jurisdiction_code, opencorporates_url — set the token for serious work.

  • OpenCorporates aggregates public records — the underlying facts are public domain
  • OpenCorporates own database is licensed CC-BY-SA-4.0; attribution required
  • API ToS prohibits redistributing the full dataset; per-record reference is fine

9. References