brickandmortar/twin-cities-public-records
Twin Cities public records, joined 25 datasets · 1,575,384 rows · free, CC BY 4.0 · mirrored from brickandmortar.dev A city emits records constantly — parcels, recorded sales, assessments, permits, licences, inspections, 911 calls, cleanup sites, flood zones, federal loans, wages, census measures — and almost nobody joins them. These are the joined slices, published as files rather than as an API you have to ask for a key to. The join is the work; the data is free. This is a… See the full description on the dataset page: https://huggingface.co/datasets/brickandmortar/twin-cities-public-records.
Twin Cities public records, joined
25 datasets · 1,575,384 rows · free, CC BY 4.0 · mirrored from brickandmortar.dev
A city emits records constantly — parcels, recorded sales, assessments, permits, licences, inspections, 911 calls, cleanup sites, flood zones, federal loans, wages, census measures — and almost nobody joins them. These are the joined slices, published as files rather than as an API you have to ask for a key to. The join is the work; the data is free.
This is a mirror. The canonical home of every file here, with its other formats, its per-column blank rates and a preview, is https://brickandmortar.dev/. If a number here disagrees with the site, the site is right and this tree is stale — open an issue and it gets rebuilt.
Coverage is not uniform, and that is the first thing to know
There is no single sentence that describes the ground under all 25 of these files. They cover 1, 2, 4, 5 and 7 counties depending on which office publishes the record, and 2 of them name no counties at all — providers, parcel-coverage, whose registries record a city or a whole state and never a county. Every dataset's own card states the counties in that file, by name. Read it before you assume a metro-wide denominator; a count from a two-county file over a seven-county population is the single easiest wrong number to produce here.
Counties appearing across the collection: Anoka, Carver, Dakota, Hennepin, Ramsey, Scott, Washington.
What is in it
Licence
CC BY 4.0 — Creative Commons Attribution 4.0 International. Free to use commercially. The one condition is attribution:
Brick & Mortar — https://brickandmortar.dev/
The licence is decided per slice, not sitewide, because it is a claim about someone else's records and the sources are not uniform. Each card carries its own basis — a work of the United States government, Minnesota government data public by statute, or a private publisher's own open licence — so you can check the reasoning rather than take a badge on faith. Where a source's own terms govern, they govern; two slices carry their upstream licence in their source line and it travels with the file.
What is deliberately NOT mirrored
This list is the point of the collection, not an appendix to it. Each of these was loaded, joined and in some cases published, and then withheld. Waiting does not clear a rights problem the way it clears a coverage one, so none of them is coming later.
- `occupants` — WITHHELD ON RIGHTS at the source, and a mirror cannot clear what the site could not. Ratings and review counts observed from Google Places. We cannot grant redistribution rights over Google's data. The licence registers answer the same question from each city's licensing office of record — see the
licencesslice, which resolves 10.85% of commercial sites against this layer's 0.79%. - `search-visibility` — WITHHELD ON RIGHTS at the source, and a mirror cannot clear what the site could not. Result titles, domains and page-one positions from Google Search. Same reason: these are Google's results, and republishing them under a licence that permits commercial redistribution is not ours to do.
- Minnesota Secretary of State bulk business data — the entity master, filing history and officer names that bridge a shell LLC to a human. Obtained under the state's no-charge researcher route, whose certification reads "I agree that I will not sell or publish the entirety of, or any substantial portion of, the database." It is an intermediate join key here and never a published record: findings derived from it may travel, the rows may not. A commercial licence that permits publication exists and has not been bought.
- Two `parcels` formats — GeoJSON and JSON, withheld by the slice itself on size grounds. That reason does not bind on a host built for large files, and they are still not here: a mirror mirrors. The CSV carries
latandlonon every row, so a point file is one line of code. - Anything derived from Google — ratings, review counts, opening hours, result titles, page-one positions. Publishing under a licence that grants commercial redistribution is not something we can do over another company's observations, so no layer carrying them can ever be a file here. This is a permanent class, and it is why
businessescomes from Overture andlicencescomes from each city's own register instead.
Load it
from datasets import load_dataset
ds = load_dataset("brickandmortar/twin-cities-public-records", "trades")
print(ds["train"][0])Or take a file straight off the hub — every config above is plain CSV with a header row, no comment block, UTF-8.
Provenance
Generated by scripts/build_mirror.py in the Brick & Mortar repo, from the same payloads that write the site's own dataset pages and its export endpoint. Nothing in this tree is hand-typed, which is the only way a mirror stays a mirror.
