Maryland Property Assessments - Values, Structure & Sales avatar

Maryland Property Assessments - Values, Structure & Sales

Pricing

from $0.03 / 1,000 maryland property assessment records

Go to Apify Store
Maryland Property Assessments - Values, Structure & Sales

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

Wenhao Yang

Maintained by Community

Actor 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

InputWhat it does
moderows (default) / aggregate
accountIdexact State account number
countyone of the 24 jurisdictions (spelled either way the source uses)
city / zipsitus city substring / ZIP prefix
addresssitus street-address substring
landUse / zoningland-use class substring / exact zoning code
ownerOccupancyH homeowner occupied, N not, D divided
cycleYearassessment cycle the values belong to
saleFrom / saleTorange on the account's most recent recorded sale
minAssessmentminimum current total assessment
groupByaggregate over county / city / zip / landUse / ownerOccupancy / dwellingType / cycleYear
maxResultscap 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.gov as 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.