Cook County Assessment Appeals - Values & Board Decisions avatar

Cook County Assessment Appeals - Values & Board Decisions

Pricing

from $0.06 / 1,000 cook county assessment records

Go to Apify Store
Cook County Assessment Appeals - Values & Board Decisions

Cook County Assessment Appeals - Values & Board Decisions

Cook County assessment records keyed on one parcel id (public open data, 59.8M rows): a parcel's value as mailed, certified and Board-revised; every appeal case with type, status and reasons; and Board of Review decisions showing the Assessor's value against the Board's and the outcome.

Pricing

from $0.06 / 1,000 cook county 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

27 minutes ago

Last modified

Categories

Share

Every parcel in Cook County gets an assessed value, and every assessment can be challenged - first with the Assessor, then with the Board of Review. This actor turns the county's assessment record into a charged-per-record search, filter and aggregate tool across three datasets that all key on the same parcel id: the values, the appeals against them, and the Board's decisions.

Built for: property tax appeal and protest work, assessment-ratio and equity studies, appraisal and valuation research, portfolio due diligence, and anyone who needs the county's own assessment record rather than a portal lookup one PIN at a time.

What it covers

Three corpora, all joined on the 14-digit parcel index number (PIN) - an exact key, not a name match. One parcel's whole assessment history lines up on one id.

CorpusRowsYearsOne row is
values50,670,5511999-2026 (28)a parcel's assessed value on one roll
appeals2,646,3991999-2026 (14)an appeal case against a parcel
decisions6,933,4282010-2025 (16)a Board of Review decision on an appeal

Depth beyond a value figure:

  • Three valuation stages on one row. The values corpus carries the same parcel's assessment as mailed (first notice), as certified (after Assessor review) and as revised by the Board of Review - so the effect of each stage is visible in the record itself.
  • The appeal case in full. Type (residential / condo-coop / commercial / land / incentive / omitted), status, whether the value changed, up to three coded reasons with their descriptions, and the agent who filed it.
  • The outcome, quantified. Board decisions carry the Assessor's value against the Board's revised value side by side (assessorTotalValue vs boardTotalValue) with the result: Decrease 3,194,842 / No Change 3,733,475 / Increase 5,111.

The fine print that matters

The appeals corpus has a hole in it, and it is the county's, not ours. The source states in its own description that appeals "for many years are currently missing from this dataset as we repopulate our system of record", with appeals from 2021 on expected to remain available. Measured 2026-09-17 that is exactly what the data shows: 1999-2004 are present, 2005-2020 are essentially absent (2014 has a single row, 2020 has 27), and 2021-2026 are present and full. So a year filter on 2015 returns an empty result - which is correct - and this actor validates the year against the years the corpus actually holds, so you get an explicit message telling you so rather than a silently empty answer that looks like a bug.

A profile is the join. mode=profile with a PIN returns that parcel's values, appeal cases and Board decisions in one response. Because the three datasets share the PIN, this is an exact join, and it traces a whole appeal chain: one Barrington parcel was mailed $104,500 for 2025, certified at the same figure, then reduced by the Board to $70,470 - and its 2026 mailed value is $70,470, carrying the decision forward into the next roll.

The three corpora carry different year spans (28 / 14 / 16), so a year valid in one may not exist in another - and a filter belonging to one corpus (say result, which only Board decisions have) is rejected when set against another, rather than silently returning unfiltered rows.

Value fields are returned as the county publishes them, including the three separate exemption columns the source keeps apart. On the newest roll the assessment is still moving through the cycle: the Board column is empty on all 1,863,562 parcels because no Board review has completed, while the certified column is populated on 367,712 of them (19.7%) as certifications land through the year. That is the county's own state of progress, not a gap in the data.

Typical questions

  • "Did this parcel win its appeal, and by how much?" - one PIN, values plus decisions.
  • "Board decisions that reduced the assessment, by class or township."
  • "Every appeal filed against a parcel, with the agent and the reasons cited."
  • "A parcel's assessed value at the mailed, certified and Board stages."
  • "All appeals handled by a given agent or tax firm."
  • "Aggregate decisions by outcome, major class or year."

Inputs

InputWhat it does
moderows (default) / aggregate / profile
corpusvalues (default) / appeals / decisions
pinexact 14-digit parcel id - required for profile
yearroll year; blank = newest roll of that corpus
township / classexact township code / property class
result / majorClassBoard outcome (Decrease / No Change / Increase) and major class - decisions only
status / appealType / change / hearingType / agentappeal case fields - appeals only
appellantthe appealing party - decisions only
groupByaggregate over tax year / class / township / appeal type / status / result / major class
maxResultscap records (default 50)

Default run = 50 records from the newest roll - fast for the daily auto-test. For a targeted query add a filter; for a whole parcel use profile; for a broad view use aggregate.

Example inputs

One parcel's whole appeal chain - mode=profile keys on the PIN and returns that parcel's values, its appeal cases and its Board decisions together.

{ "mode": "profile", "pin": "01011000020000", "maxResults": 50 }

Board decisions that cut the assessment

{ "corpus": "decisions", "result": "Decrease", "maxResults": 5 }

Appeal cases that have closed

{ "corpus": "appeals", "status": "closed", "maxResults": 5 }

Decisions by outcome - one row per result.

{ "mode": "aggregate", "corpus": "decisions", "groupBy": "result" }

Low cost

From $0.0001 per record, down to $0.00006 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 datasets, and each record is metered individually - a full parcel profile costs a fraction of a cent.

Example output

One parcel on one roll - mode=profile, pin=01011000020000 returns the values row below alongside that parcel's appeal cases and Board decisions:

{
"platform": "cook-assessment-appeals",
"source": "cook-county-values",
"corpus": "values",
"mode": "rows",
"groupKey": "",
"groupCount": "",
"groupBy": "",
"agentCode": "",
"agentName": "",
"appealCertifiedBuilding": "",
"appealCertifiedLand": "",
"appealCertifiedTotal": "",
"appealMailedBuilding": "",
"appealMailedLand": "",
"appealMailedTotal": "",
"appealSeq": "",
"appealTrack": "",
"appealType": "",
"appealTypeCode": "",
"appealTypeDescription": "",
"appellant": "",
"assessorImprovementValue": "",
"assessorLandValue": "",
"assessorTotalValue": "",
"boardBuilding": "",
"boardHomeownerExemption": "",
"boardImprovementValue": "",
"boardLand": "",
"boardLandValue": "",
"boardTotal": "",
"boardTotalValue": "",
"caseNumber": "",
"certifiedBuilding": "",
"certifiedHomeownerExemption": "",
"certifiedLand": "",
"certifiedTotal": "",
"change": "",
"changeReason": "",
"class": "592",
"hearingType": "",
"mailedBuilding": "33591.0",
"mailedHomeownerExemption": "0.0",
"mailedLand": "36879.0",
"mailedTotal": "70470.0",
"majorClass": "",
"neighborhoodCode": "10012",
"noChangeReason": "",
"noChangeReasonDescription": "",
"pin": "01011000020000",
"reasonCode1": "",
"reasonCode2": "",
"reasonCode3": "",
"reasonDescription1": "",
"reasonDescription2": "",
"reasonDescription3": "",
"result": "",
"sourceUpdatedAt": "2026-09-15",
"status": "",
"subkey": "",
"taxCode": "",
"taxYear": "2026",
"townshipCode": "10",
"townshipName": "Barrington",
"volume": ""
}

mode=aggregate, corpus=decisions, groupBy=result - one row per outcome:

Decrease 3,194,842
No Change 3,733,475
Increase 5,111