Maryland Property Assessments - Values, Structure & Sales
Pricing
from $0.03 / 1,000 maryland property assessment records
Maryland Property Assessments - Values, Structure & Sales
All 2.44M Maryland real-property assessment accounts (public open data, 24 jurisdictions): assessment values, land/improvement split, CAMA structure (year built, sq ft, units, grade, type), last recorded sale with seller name, exemptions, homestead. Search by county, city, ZIP, address or sale date.
Pricing
from $0.03 / 1,000 maryland property assessment records
Rating
0.0
(0)
Developer
Wenhao Yang
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
2 days ago
Last modified
Categories
Share
Every real property in Maryland is reassessed on a rolling cycle, and the Department of Assessments and Taxation publishes the result as an open record: one account per parcel, with what the State thinks the land and the buildings on it are worth, what actually stands there, and the last sale it has on file. This actor turns that file into a charged-per-record search, filter and aggregate tool over all 2,441,527 accounts in the state.
Built for: comparable-sales work, portfolio and portfolio-adjacent screening, land-assembly research, exemption and homestead analysis, zoning and land-use studies, and anyone who needs the State's own assessment record rather than a third-party estimate of it.
What it covers
2,441,527 accounts across all 24 Maryland jurisdictions - the 23 counties plus Baltimore City, which is a separate jurisdiction from Baltimore County and is never merged with it. One account = one row; every row is a distinct account number, with no fan-out by owner or by building.
Each record carries:
- assessment values - current total, the land / improvements split, the prior year's total, and the base-cycle (pre-reassessment) values
- what stands on the land - year built, structure area, dwelling units, land area, dwelling type, building style, grade and construction code
- classification - land use, zoning code, owner-occupancy code, subdivision, and the map / grid / parcel / block references that identify the parcel on the county plat
- the most recent recorded sale - transfer date, consideration, seller name, how conveyed, transfer number, and the market land / improvement values the State assigned at that sale
- taxation and relief - homestead qualification code and date, exempt class, and the county and state exemption assessments
The fine print that matters
222 columns is not 222 fields. This is a flattened MDP export and a large block of it carries nothing. Measured on the full 2,441,527-row corpus: 25 numeric columns are 0 on every row where they are populated (the assessment-credit and tax-roll value blocks), and 8 more columns are entirely empty. Others are filled on every row but hold a single value - phase_in_value was verified to carry the same number as the total assessment on all 2,441,527 rows, and stories, dwelling_condition and the municipal exemption assessment repeat one value on 97-99%+ of rows. Those columns are not returned, and neither is the tax-roll block (taxYear is 0000 on every row; the billing date likewise). What this actor returns is the set of fields that actually vary.
The assessment roll runs ahead of the calendar. assessment_cycleYear is 2027 on 2,433,372 of 2,441,527 accounts (99.6%), because the State publishes the next cycle's values during the current one. If you are comparing to a tax bill you are holding, check the cycle year rather than assuming it matches the year on the paper.
Sale dates are text, and they carry absence markers. The transfer date is stored as YYYY.MM.DD text, not a date type, and 131,214 accounts (5.4%) carry 0000.00.00 there instead of a sale - an account with no recorded sale in the file, not a sale in year zero. Those are stripped on the way out, and every date-range filter fences them so that "sold since 2020" cannot sweep them in. The homestead date carries the same kind of marker (1899.12.30 / 1900.01.01 on 1,140,602 rows) and is stripped the same way.
Not every sale is a market sale. salePrice is 0 on 781,317 accounts - the deed was conveyed without consideration. The conveyanceType field says which kind of transfer it was, and on the full corpus 901,893 records are non-arms-length (foreclosure, gift or auction) against 1,397,265 arms-length ones. A comparable-sales run that ignores this field is averaging foreclosures into its comps.
Exemptions are the exception, not the rule - and that is the point of returning them. The county and state exemption assessments are non-zero on ~132,500 accounts (5.4%), and exemptClass is populated on 142,810 (5.8%). Those are the parcels whose taxable base differs from their assessed value, and they are the ones a plain property-value list gets wrong.
Typical questions
- "Every account in Montgomery County, or in Baltimore City."
- "Accounts whose most recent sale was in the last six months, with the price and the seller."
- "Comparable sales: arms-length, improved, over $100,000."
- "Parcels assessed over $500,000."
- "Exempt property - churches, government, nonprofits - by exempt class."
- "Homestead-qualified owner-occupied property in a ZIP."
- "A single account by its account number."
- "Aggregate by county, city, ZIP, land use, owner occupancy or dwelling type."
Inputs
| Input | What it does |
|---|---|
mode | rows (default) / aggregate |
accountId | exact State account number |
county | one of the 24 jurisdictions (spelled either way the source uses) |
city / zip | situs city substring / ZIP prefix |
address | situs street-address substring |
landUse / zoning | land-use class substring / exact zoning code |
ownerOccupancy | H homeowner occupied, N not, D divided |
cycleYear | assessment cycle the values belong to |
saleFrom / saleTo | range on the account's most recent recorded sale |
minAssessment | minimum current total assessment |
groupBy | aggregate over county / city / zip / landUse / ownerOccupancy / dwellingType / cycleYear |
maxResults | cap records (default 50) |
Default run = 50 accounts - a plain read of the whole roll, fast enough for the daily auto-test. For a targeted query add a filter; for a broad view use aggregate.
Example inputs
One account by number - the exact State account id.
{ "accountId": "04111108005540" }
A county's accounts. Either spelling works; Baltimore and Baltimore City
are matched as the separate jurisdictions they are.
{ "county": "Montgomery", "maxResults": 5 }
Recent recorded sales - accounts whose most recent sale fell in this window.
{ "saleFrom": "2026-01-01", "saleTo": "2026-09-27", "maxResults": 5 }
High-value property in a ZIP prefix
{ "zip": "208", "minAssessment": "750000", "maxResults": 5 }
How the state splits by land use - one row per classification.
{ "mode": "aggregate", "groupBy": "landUse" }
Low cost
From $0.00005 per record, down to $0.00003 at Gold Pay-per-event: you are charged per record delivered, and nothing for the query. Cost scales with what you pull, not with the size of the file, and each record is metered individually - pulling one ZIP's worth of accounts costs a fraction of a cent.
Example output
One account - accountId=04111108005540 returns the assessment, the structure
description and the last recorded sale:
{"platform": "md-property-assessments","source": "maryland-real-property-assessments","mode": "rows","groupKey": "","groupCount": "","groupBy": "","accountId": "04111108005540","countyName": "Baltimore","countyNameRaw": "Baltimore","jurisdictionCode": "BACO","address": "5215 BUSH ST","city": "WHITE MARSH","zip": "21162","unit": "","cycleYear": "2027","totalAssessment": "198300","landValue": "83500","improvementValue": "114800","priorYearTotalAssessment": "198300","baseCycleLandValue": "83500","baseCycleImprovementValue": "114800","yearBuilt": "1952","structureAreaSqFt": "768","dwellingUnits": "1","landArea": "4000.000","landAreaUnit": "S","dwellingType": "DWEL Standard Unit (0001)","buildingStyle": "STRY 1 Story With Basement (0002)","dwellingGrade": "Average (4)","constructionCode": "Siding (001)","landValuationUnit": "SQ","landUse": "Residential (R)","zoning": "","ownerOccupancy": "H","subdivision": "0000","townCode": "","legalDescription": "IMPS (Improvements).","map": "0073","grid": "0001","parcel": "0341","block": "K","section": "","saleDate": "2026-08-28","salePrice": "0","sellerName": "BRUCHEY JOHN F","conveyanceType": "Private non-arms-length transfer such as a foreclosure, gift or auction (4)","transferNumber": "000000","saleMktLandValue": "83500","saleMktImprovementValue": "111200","homesteadCode": "A","homesteadDate": "2009-01-27","exemptClass": "","countyExemptAssessment": "0","stateExemptAssessment": "0","lastActivityDate": "2026-08-24","sourceUpdatedAt": "2026-09-03"}
An aggregate row - {"mode": "aggregate", "groupBy": "county"} returns one
row per jurisdiction (24 rows, spelling variants merged), with the record fields
blank:
{"platform": "md-property-assessments","source": "maryland-real-property-assessments","mode": "aggregate","groupKey": "Montgomery","groupCount": "355368","groupBy": "county","accountId": "","countyName": "","totalAssessment": "","sourceUpdatedAt": "2026-09-03"}
Notes
- Source: Maryland Department of Assessments and Taxation, published on
opendata.maryland.govas public open data. No login, no key. - Freshness: the portal stamps a batch refresh date on the whole file; every
record carries it as
sourceUpdatedAt. - Coverage: all 24 jurisdictions. The file is the State's real-property roll; personal property, business filings and business licenses are separate state datasets and are not included here.