Use US County & City Unclaimed Funds Scraper with Python
Search unclaimed money and uncashed checks published by US county and city treasuries across six states. Search by owner name or browse by state, with amount, holder, property type and dates where disclosed.
1. Choose the data you need
Review the published README for supported collection modes, examples, and limits. The recipe below uses the current published input definition.
2. Prepare a source-based input
This JSON contains published prefills and required-field defaults. Review every value for your task before running it; it is not a promise of successful collection.
{
"iaFiscalYear": "latest",
"includeUnknownAmount": false,
"jurisdiction": "ALL",
"maxItems": 3,
"minAmountUsd": 0,
"mode": "search",
"ownerName": "Johnson",
"propertyType": "ALL",
"sortBy": "amountDesc",
"state": "MN",
"valueRange": "500plus"
}
Download input.example.json and save your reviewed copy as input.json.
| Field | Type | Required | Description |
|---|---|---|---|
mode | string | required | search: find records by owner name or property ID. browse: list a register without a name filter. byPropertyId: exact property/warrant/check lookup. |
state | string | required | Which state's unclaimed-property source(s) to query. 'All states' fans out to every supported source in one run. |
jurisdiction | string | optional | Narrow to one specific government source (useful when a state has more than one, e.g. California or Massachusetts). 'All jurisdictions' queries every source in the selected state(s). |
ownerName | string | optional | Full or partial owner/payee name (case-insensitive). Words can be in any order and commas are ignored, so `Smith, John` and `John Smith` both work. |
propertyId | string | optional | Exact property ID, warrant number or check number. Works in every mode; `byPropertyId` is the dedicated lookup mode. |
minAmountUsd | number | optional | Only include records worth at least this much. 0 = no minimum. When an amount filter is active, records whose source discloses no amount are excluded unless `includeUnknownAmount` is on. |
maxAmountUsd | number | optional | Only include records worth at most this much. Leave unset for no maximum. |
includeUnknownAmount | boolean | optional | When an amount filter is active, also keep records whose source publishes no dollar amount (for example City of Austin, TX). |
dateFrom | string | optional | Earliest check/warrant issue date (YYYY-MM-DD). Only sources that disclose dates are searched; California's statewide file has no date field and is skipped. |
dateTo | string | optional | Latest check/warrant issue date, inclusive (YYYY-MM-DD). |
propertyType | string | optional | Broad property-type group. California's 190 raw NAUPA codes are mapped into these groups; use `propertyTypeContains` for an exact raw-string filter. |
propertyTypeContains | string | optional | Advanced: keep only records whose raw source type contains this text, e.g. `Dividend` or `Endowment`. Combined with the group filter. |
sortBy | string | optional | How to order results. `relevance` preserves source and file order. Records missing the chosen field sink to the bottom. |
maxItems | integer | optional | Hard cap on emitted records (1–50,000). |
valueRange | string | optional | Which California State Controller archive to scan for browsing and name searches. Exact property-ID lookups scan all four ranges (smallest first) so lower balances are not missed, then stop at the matching range. `All value ranges` scans four range files one at a time and is much heavier than the default. |
iaFiscalYear | string | optional | Which Iowa DAS outdated-warrant file(s) to read. `Latest` is the newest posted fiscal year. |
3. Start an Actor run
Set APIFY_TOKEN in your environment. Python 3.10 or newer is sufficient; this recipe uses no third-party packages.
Execution may incur charges. Review current pricing on Apify. The request asks for a 120-second timeout and a charge limit; these settings are subject to Apify’s pricing and do not guarantee an all-inclusive spending cap.
import json
import os
import urllib.request
# Save the schema-derived example as input.json; review and edit it first.
with open("input.json", encoding="utf-8") as stream:
actor_input = json.load(stream)
token = os.environ["APIFY_TOKEN"]
request = urllib.request.Request(
"https://api.apify.com/v2/acts/E9Ke5Ax2TNnDP1qfe/runs?timeout=120&maxTotalChargeUsd=0.50",
data=json.dumps(actor_input).encode("utf-8"),
headers={"Authorization": "Bearer " + token, "Content-Type": "application/json"},
method="POST",
)
# This starts a potentially billable run. Do not automatically retry this POST.
with urllib.request.urlopen(request, timeout=40) as response:
run = json.load(response)["data"]
print("Run ID:", run["id"])
print("Status:", run["status"])
# Inspect and download results in Apify Console once the run succeeds.
4. Inspect the actual results
Open the run in Apify Console and wait for a successful completion. Use the published output schema to locate results and the dataset schema to understand declared views. Missing or optional record fields must not be treated as guaranteed values.
One record per unclaimed-property entry from a public US register, with owner, amount, holder, property type, dates, property ID and source traceability wherever the source discloses them.
Questions before you run
Which inputs are required?
The published required fields are mode, state
What does this guide verify?
The fields, prefills, and schema links are rendered from the published build. This is a usage recipe, not a paid live extraction test. Source availability and collection results can vary.
What if the run request times out?
Check Apify Console before retrying. The first request may already have created a run. Do not automatically repeat a run-creation POST.
Generated from source build 5kMa20fol8r9Ve8yA and its README and schemas. Source changes regenerate this guide; no third-party editorial claims are inferred.