What the statewide parcel layer can answer, county by county
Whether the free statewide parcel layer can answer your question where you are, before you build anything on it. Look up a county, read across to the field you need. The short version: 33 of 59 consenting counties can tell you what a property is worth, 42 what it is used for, 36 how big the lot is — and only 10 of all 87 know what anything sold for.
A row here is a whole county — there are 87 and the county column is the filter. This file is the map of what the state's parcel layer can answer where you are, so read your county off it; the parcels it describes are the ones behind the adjacency, sales and owner files.
The file
87 Minnesota counties · 16 fields · 2,710,201 parcels compiled by MnGeo
87 rowsGround covered: Minnesota — statewide. · 40 columns available · free, no account, no rate limit.
What the rows look like
10 real rows from this file, spread evenly across it rather than taken off the top — every file here is written in some order, so its first rows are never a fair sample of it. These are the default columns, which is what the download button hands over.
| county | status | parcels | answers (of 16) | value % | use class % | lot acres % | sale price % |
|---|---|---|---|---|---|---|---|
| Aitkin County, Minnesota | partial | 43,024 | 9 | 100.0 | 100.0 | 99.9 | 0.0 |
| Cass County, Minnesota | partial | 51,689 | 8 | 94.4 | 95.6 | 0.0 | 0.0 |
| Dodge County, Minnesota | not opted in | 0 | — | — | — | — | — |
| Isanti County, Minnesota | partial | 23,889 | 6 | 97.9 | 99.7 | 0.0 | 0.0 |
| Lake of the Woods County, Minnesota | partial | 8,957 | 6 | 99.1 | 99.2 | 98.0 | 0.0 |
| Morrison County, Minnesota | thin | 30,117 | 3 | 98.8 | 98.8 | 0.0 | 0.0 |
| Pine County, Minnesota | not opted in | 0 | — | — | — | — | — |
| Roseau County, Minnesota | not opted in | 0 | — | — | — | — | — |
| Todd County, Minnesota | not opted in | 0 | — | — | — | — | — |
| Yellow Medicine County, Minnesota | thin | 10,763 | 2 | 0.0 | 0.0 | 0.0 | 0.0 |
An em dash means the record is blank, and that is the source's gap rather than ours. Across the whole file: answers (of 16) is blank on 32.2% of rows, value % is blank on 32.2% of rows, use class % is blank on 32.2% of rows, lot acres % is blank on 32.2% of rows, sale price % is blank on 32.2% of rows.
The cuts of this file
Every cut is the same columns, filtered. Pick one and the row count changes; the file does not.
Every column in this file
Columns marked default come down unless you pick your own with
&columns=.
| Column | What it is | In the default file |
|---|---|---|
county |
county | default |
status |
status | default |
parcels |
parcels | default |
questions_answered |
answers (of 16) | default |
emv_total_pct |
value % | default |
useclass1_pct |
use class % | default |
acres_poly_pct |
lot acres % | default |
sale_value_pct |
sale price % | default |
empty_despite_opt_in |
empty fields | optional |
empty_fields |
which fields are empty | optional |
county_data_date |
county data date | optional |
fips |
FIPS | optional |
emv_total_n |
assessed value rows | optional |
emv_land_pct |
land value % | optional |
emv_land_n |
land value rows | optional |
emv_bldg_pct |
building value % | optional |
emv_bldg_n |
building value rows | optional |
total_tax_pct |
tax billed % | optional |
total_tax_n |
tax billed rows | optional |
useclass1_n |
use class rows | optional |
acres_poly_n |
lot acres (mapped) rows | optional |
acres_deed_pct |
lot acres (deeded) % | optional |
acres_deed_n |
lot acres (deeded) rows | optional |
year_built_pct |
year built % | optional |
year_built_n |
year built rows | optional |
fin_sq_ft_pct |
finished area % | optional |
fin_sq_ft_n |
finished area rows | optional |
num_units_pct |
unit count % | optional |
num_units_n |
unit count rows | optional |
dwell_type_pct |
dwelling type % | optional |
dwell_type_n |
dwelling type rows | optional |
owner_name_pct |
owner name % | optional |
owner_name_n |
owner name rows | optional |
tax_name_pct |
taxpayer name % | optional |
tax_name_n |
taxpayer name rows | optional |
homestead_pct |
homestead flag % | optional |
homestead_n |
homestead flag rows | optional |
sale_date_pct |
sale date % | optional |
sale_date_n |
sale date rows | optional |
sale_value_n |
sale price rows | optional |
Where it comes from
Minnesota Geospatial Information Office — Parcels, Compiled from Opt-In Open Data Counties (plan_parcels_open), measured field by field
This source does not stamp the day it was published, so we cannot honestly date our copy of it and will not guess. The period the records themselves cover is on the system card.
What this layer cannot answer is stated in full on the system card — read it before quoting a figure.
What you may do with it
Creative Commons Attribution 4.0 International (CC BY 4.0). Share it, change it, build a product on it, sell that product — all fine. The one condition is credit: say it came from Brick & Mortar and link back.
Records published by Minnesota Geospatial Information Office, county assessors, county GIS offices. Government data held by a Minnesota state agency or political subdivision, presumed public under the Minnesota Government Data Practices Act (Minn. Stat. ch. 13) and published by the agency itself.
Read the full licence · how we license every dataset, and the two we do not
Without the page
/api/export?dataset=parcel-coverage&format=csv returns the
same file. Call /api/export
with no arguments for the whole catalogue.
Point an AI at it
Every file carries its own source, its capture date and the layer's own warnings in the header, so a model reading one gets the caveats with the numbers rather than the numbers alone. Paste this at an assistant that can fetch a URL:
Read https://brickandmortar.dev/api/export?dataset=parcel-coverage&format=csv
Everything above the header row is provenance and limits. Read it first,
then answer using only what the rows support.
llms.txt describes the whole warehouse the same way — what each dataset holds, which counties it really covers, and what it cannot answer.