{
  "dataset_name": "Cook County residential appeal outcomes by representation, 2023–2025",
  "description": "Cook County residential appeal outcomes split by whether the owner filed alone or through a lawyer or tax agent: county-wide for each tax year at both bodies, and by township at the Board of Review for tax year 2025.",
  "file": "/data/downloads/cook-county-appeal-representation.csv",
  "rows": 46,
  "columns": [
    {
      "name": "geography",
      "description": "“Cook County” for a county-wide row, otherwise the township name."
    },
    {
      "name": "geography_level",
      "description": "county or township."
    },
    {
      "name": "tax_year",
      "description": "Tax year the appeals were filed against."
    },
    {
      "name": "appeal_body",
      "description": "assessor or board_of_review. A win at the Assessor is a recorded change of value; a win at the Board of Review is a recorded result of “Decrease”."
    },
    {
      "name": "self_filed_appeals",
      "description": "Appeals with no agent or attorney named on the record. Empty when we hold none."
    },
    {
      "name": "self_filed_won",
      "description": "Of those, the number that changed or decreased the value."
    },
    {
      "name": "self_filed_rate_pct",
      "description": "self_filed_won ÷ self_filed_appeals. EMPTY below 100 appeals — the study prints no share there either."
    },
    {
      "name": "agent_filed_appeals",
      "description": "Appeals with an agent (Assessor file) or attorney firm (Board of Review file) named."
    },
    {
      "name": "agent_filed_won",
      "description": "Of those, the number that changed or decreased the value."
    },
    {
      "name": "agent_filed_rate_pct",
      "description": "agent_filed_won ÷ agent_filed_appeals. EMPTY below 100 appeals."
    },
    {
      "name": "gap_percentage_points",
      "description": "self_filed_rate_pct minus agent_filed_rate_pct, signed. Positive means self-filed appeals were cut more often. Empty when either side is below the floor."
    },
    {
      "name": "all_appeals",
      "description": "self_filed_appeals + agent_filed_appeals — every closed appeal the row covers."
    }
  ],
  "missing_values": "An empty cell means the value is not published by the source, or that our sample floor suppresses it. It is never written as 0 — a zero in this file is a measured zero.",
  "coverage": {
    "records": "6 county rows (2023–2025, both bodies) plus 38 Board of Review township rows for 2025",
    "temporal": "2023/2025",
    "spatial": "Cook County, Illinois"
  },
  "generated_on": "2026-09-28",
  "generated_by": "civicdelta.dataset_exports.write_exports",
  "mirrors_page": "/research/cook-county-appeal-representation/",
  "sql": {
    "assessor_by_year": "\nSELECT tax_year,\n       (agent_name IS NOT NULL AND btrim(agent_name) <> '') AS represented,\n       count(*), count(*) FILTER (WHERE change = 'change')\nFROM property.assessor_appeals\nWHERE jurisdiction = 'IL-Cook' AND class ~ '^2[0-9]{2}$' AND tax_year = ANY(%(years)s)\n  AND status LIKE 'closed%%' AND change IS NOT NULL\nGROUP BY 1, 2 ORDER BY 1, 2\n",
    "bor_by_year": "\nSELECT tax_year,\n       (attorney_firm_name IS NOT NULL AND btrim(attorney_firm_name) <> '') AS represented,\n       count(*), count(*) FILTER (WHERE result = 'Decrease')\nFROM property.bor_appeals\nWHERE jurisdiction = 'IL-Cook' AND tax_year = ANY(%(years)s) AND result IS NOT NULL\n  AND (CASE WHEN class >= 1000 THEN class / 100 ELSE class END) BETWEEN 200 AND 299\nGROUP BY 1, 2 ORDER BY 1, 2\n",
    "bor_by_township": "\nWITH t AS (\n  SELECT DISTINCT township_code, township_name FROM property.assessments\n  WHERE jurisdiction = 'IL-Cook' AND township_name IS NOT NULL\n), b AS (\n  SELECT township_code::text AS tc,\n         (attorney_firm_name IS NOT NULL AND btrim(attorney_firm_name) <> '') AS represented,\n         count(*) AS n, count(*) FILTER (WHERE result = 'Decrease') AS won\n  FROM property.bor_appeals\n  WHERE jurisdiction = 'IL-Cook' AND tax_year = %(year)s AND result IS NOT NULL\n    AND (CASE WHEN class >= 1000 THEN class / 100 ELSE class END) BETWEEN 200 AND 299\n  GROUP BY 1, 2\n)\nSELECT t.township_name,\n       coalesce(sum(b.n) FILTER (WHERE NOT b.represented), 0), coalesce(sum(b.won) FILTER (WHERE NOT b.represented), 0),\n       coalesce(sum(b.n) FILTER (WHERE b.represented), 0), coalesce(sum(b.won) FILTER (WHERE b.represented), 0)\nFROM b JOIN t ON t.township_code = b.tc\nGROUP BY 1 ORDER BY 1\n"
  },
  "sources": [
    {
      "source_key": "cook_assessor_appeals",
      "dataset_title": "Assessor - Appeals",
      "publisher": "Cook County Assessor's Office",
      "dataset_id": "y282-6ig3",
      "dataset_page": "https://datacatalog.cookcountyil.gov/d/y282-6ig3",
      "loaded_on": "2026-09-28",
      "terms_url": "https://datacatalog.cookcountyil.gov/",
      "terms_summary": "Published as open data on the Cook County Open Data portal. Confirm portal terms of use and record the date.",
      "terms_verified_by_a_human_on": null,
      "attribution": "Cook County Assessor's Office, “Assessor - Appeals” (dataset y282-6ig3), loaded 2026-09-28"
    },
    {
      "source_key": "cook_assessed_values",
      "dataset_title": "Assessor - Assessed Values",
      "publisher": "Cook County Assessor's Office",
      "dataset_id": "uzyt-m557",
      "dataset_page": "https://datacatalog.cookcountyil.gov/d/uzyt-m557",
      "loaded_on": "2026-09-28",
      "terms_url": "https://datacatalog.cookcountyil.gov/",
      "terms_summary": "Published as open data on the Cook County Open Data portal. Confirm portal terms of use and record the date.",
      "terms_verified_by_a_human_on": null,
      "attribution": "Cook County Assessor's Office, “Assessor - Assessed Values” (dataset uzyt-m557), loaded 2026-09-28"
    },
    {
      "source_key": "cook_bor_appeals",
      "dataset_title": "Board of Review Appeal Decision History",
      "publisher": "Cook County Board of Review",
      "dataset_id": "7pny-nedm",
      "dataset_page": "https://datacatalog.cookcountyil.gov/d/7pny-nedm",
      "loaded_on": "2026-09-28",
      "terms_url": "https://datacatalog.cookcountyil.gov/",
      "terms_summary": "Published as open data on the Cook County Open Data portal. Confirm portal terms of use and record the date.",
      "terms_verified_by_a_human_on": null,
      "attribution": "Cook County Board of Review, “Board of Review Appeal Decision History” (dataset 7pny-nedm), loaded 2026-09-28"
    }
  ],
  "attribution": "Source: Cook County Assessor's Office, “Assessor - Appeals” (dataset y282-6ig3), loaded 2026-09-28; Cook County Assessor's Office, “Assessor - Assessed Values” (dataset uzyt-m557), loaded 2026-09-28; Cook County Board of Review, “Board of Review Appeal Decision History” (dataset 7pny-nedm), loaded 2026-09-28. Computed by CivicDelta.",
  "license_note": "Terms are the publisher's, at the terms_url above. Where terms_verified_by_a_human_on is null we have not yet had a person confirm them, and we do not assert a license on the publisher's behalf. CivicDelta's own computation over these files is free to reuse with the attribution line above.",
  "contains": [
    "Residential property only (class 2xx, including condominium units).",
    "Closed appeals with a recorded outcome. Pending appeals are excluded.",
    "Representation as the county's own files record it: an agent or attorney name present, or absent."
  ],
  "does_not_contain": [
    "Evidence that hiring an agent hurts you. Agents pick the cases they take, and this file cannot see which cases those are.",
    "Any individual appeal, PIN, owner, agent or firm.",
    "Dollar amounts, or how large a reduction was.",
    "Townships below the sample floor at either representation level — those rows carry empty rates, not zeros."
  ]
}
