Cook County Assessor Parcel Scraper
Pricing
from $0.02 / 1,000 parcel record extracteds
Cook County Assessor Parcel Scraper
Export official Cook County parcel assessments, owner and mailing names, property addresses, and mailed, certified, and Board values by PIN, year, township, class, or address.
Pricing
from $0.02 / 1,000 parcel record extracteds
Rating
0.0
(0)
Developer
Stas Persiianenko
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
4 days ago
Last modified
Categories
Share
Export official Cook County parcel assessments, owner and mailing names, property addresses, and valuation history without navigating assessor pages one by one.
Use a PIN lookup for a single property, upload several PINs for portfolio review, or search by year, township, class, address, or owner name. Every default result joins two official Cook County Open Data datasets into one analysis-ready parcel-year record.
- π Find parcel addresses and owner or mailing names
- π΅ Compare mailed, certified, and Board assessment values
- π Export one year or a historical year range
- π― Filter by Cook County PIN, township, class, address, or owner
- π¦ Download JSON, CSV, Excel, XML, or RSS from the Apify dataset
- π Connect recurring exports to APIs, webhooks, Make, Zapier, Google Sheets, or an MCP client
What does Cook County Assessor Parcel Scraper do?
The Actor queries Cook County's official Socrata data catalog and joins:
- Assessed Values (
uzyt-m557) for property class, township, neighborhood, and mailed, certified, and Board values. - Parcel Addresses (
3723-97qp) for property address, owner identity, and mailing identity and address.
The sources share a parcel-year row_id. The Actor uses that key first and falls back to PIN plus year when needed. You get one normalized row instead of reconciling separate government exports.
Who is this Cook County parcel data for?
Real-estate investors and acquisition teams
Screen parcels by location and assessed value, build owner outreach lists, and refresh a target area when a new assessment year appears.
Tax-appeal and valuation analysts
Compare mailed, certified, and Board totals and separate land from building values for a parcel or a portfolio.
Insurers and lenders
Enrich underwriting records with an official parcel identifier, property address, class, township, and assessment history.
Property managers and portfolio owners
Run the same PIN list periodically and route fresh parcel-year records to a warehouse or spreadsheet.
Researchers and civic-data teams
Create reproducible extracts from two named official datasets with source IDs and timestamps retained in every result.
Why use this Actor?
Cook County publishes useful data, but users otherwise need to understand Socrata, write SoQL, paginate both datasets, and join the rows safely. This Actor packages that work into guided inputs and a stable schema.
- β No Cook County login required
- β No browser or proxy required
- β Server-side filtering reduces unnecessary downloads
- β Deterministic pagination and deduplication
- β Typed numeric valuation fields
- β Optional raw SoQL filters for advanced users
- β Optional Socrata app token for higher rate limits
What data can I extract?
| Field group | Example fields |
|---|---|
| Parcel identity | pin, pin10, year, rowId |
| Classification | propertyClass, townshipCode, townshipName, neighborhoodCode |
| Mailed values | land, building, total, HIE |
| Certified values | land, building, total, HIE |
| Board values | land, building, total, HIE |
| Property location | street, city, state, ZIP |
| Mailing record | name, street, city, state, ZIP |
| Owner record | name, street, city, state, ZIP |
| Provenance | source dataset IDs, source URL, scrape timestamp |
Fields unavailable for a particular historical record are omitted rather than filled with invented values.
How to scrape Cook County property records
- Open the Actor input page.
- Enter one or more 14-digit PINs, or choose search filters.
- Set the assessment year range.
- Keep
maxItemssmall for a first run. - Click Start.
- Preview the joined records in the Cook County parcels dataset view.
- Export the dataset or connect it to your downstream workflow.
PINs may include hyphens or spaces. The Actor normalizes them to the official 14-digit representation.
Input options
Parcel search
pins: one or more 14-digit Cook County parcel index numbers.yearFrom: earliest assessment year.yearTo: latest assessment year.townshipNames: exact township names such asBloom.propertyClasses: exact class codes such as202.addressQuery: case-insensitive text in property street, city, or ZIP.ownerQuery: case-insensitive text in owner or mailing name.
Output controls
maxItems: maximum joined parcel-year rows to save.includePartialRecords: include a row found in only one official source. It is off by default.scanLimit: cap source rows examined when combining cross-dataset filters.
Advanced Socrata controls
assessedValuesWhere: additional SoQL$whereexpression foruzyt-m557.parcelAddressesWhere: additional SoQL$whereexpression for3723-97qp.appToken: optional Socrata token. Anonymous access works without it.
All filter groups combine with AND. For example, a township, year, and class search returns records satisfying all three.
Example input: one parcel across one year
{"pins": ["32-21-321-009-0000"],"yearFrom": 2020,"yearTo": 2020,"maxItems": 10}
This resolves PIN 32213210090000 and joins its 2020 assessment with its property, mailing, and owner addresses.
Example input: township and property class
{"townshipNames": ["Bloom"],"propertyClasses": ["202"],"yearFrom": 2020,"yearTo": 2020,"maxItems": 500}
Use this workflow to assemble a bounded set of similarly classified properties for valuation review.
Example input: owner or address lead search
{"addressQuery": "HANOVER","ownerQuery": "SOUTHALL","yearFrom": 2020,"yearTo": 2020,"maxItems": 100}
The Actor uses the parcel-address dataset as the search driver, then joins matching assessed values.
Example input: advanced assessed-value filter
{"townshipNames": ["Bloom"],"yearFrom": 2020,"yearTo": 2020,"assessedValuesWhere": "board_tot > 100000","maxItems": 1000}
Raw predicates are intended for users familiar with Socrata SoQL and the official field names.
Example output
{"pin": "32213210090000","year": 2020,"propertyClass": "202","townshipName": "Bloom","mailedTotalValue": 3294,"certifiedTotalValue": 3294,"boardTotalValue": 3294,"propertyAddress": "1617 HANOVER ST","propertyCity": "CHICAGO HEIGHTS","ownerName": "JOHNI SOUTHALL","mailingName": "JOHNI SOUTHALL","rowId": "322132100900002020","sourceDatasetIds": ["uzyt-m557", "3723-97qp"],"scrapedAt": "2026-07-24T06:12:33.662Z"}
Valuation amounts are returned as numbers. PINs, ZIP codes, classes, and neighborhood codes remain strings so leading zeroes are preserved.
How much does it cost to scrape Cook County parcel records?
The Actor uses pay-per-event pricing: a $0.005 start fee plus $0.000033422 per joined parcel record on the BRONZE plan, with plan-based volume discounts. Apify shows the exact maximum charge before each run.
A 100-record BRONZE run is approximately $0.00834 at these rates. Failed joins and source rows that are not saved are not charged as result items.
These prices were derived from a representative 100-record cloud run. The live Apify pricing panel is authoritative.
Export formats
Apify datasets make the same records available as:
- JSON for applications and data pipelines
- CSV for spreadsheets and imports
- Excel for analyst review
- XML for legacy integrations
- RSS for lightweight monitoring
Use dataset query parameters to select fields, filter rows, unwind arrays, or clean the export.
API usage with Node.js
import { ApifyClient } from 'apify-client';const client = new ApifyClient({ token: process.env.APIFY_TOKEN });const run = await client.actor('automation-lab/cook-county-assessor-parcel-scraper').call({pins: ['32213210090000'],yearFrom: 2020,yearTo: 2020,maxItems: 10,});const { items } = await client.dataset(run.defaultDatasetId).listItems();console.log(items);
API usage with Python
import osfrom apify_client import ApifyClientclient = ApifyClient(os.environ['APIFY_TOKEN'])run = client.actor('automation-lab/cook-county-assessor-parcel-scraper').call(run_input={'pins': ['32213210090000'],'yearFrom': 2020,'yearTo': 2020,'maxItems': 10,})items = client.dataset(run['defaultDatasetId']).list_items().itemsprint(items)
API usage with cURL
curl -X POST \"https://api.apify.com/v2/acts/automation-lab~cook-county-assessor-parcel-scraper/runs?token=$APIFY_TOKEN" \-H "Content-Type: application/json" \-d '{"pins":["32213210090000"],"yearFrom":2020,"yearTo":2020,"maxItems":10}'
Poll the returned run ID or use Apify webhooks to receive a notification when the run finishes.
MCP integration for AI agents
Connect Apify's MCP server to let an AI assistant run the Actor and inspect its dataset.
For Claude Code, run:
$claude mcp add --transport http apify "https://mcp.apify.com?tools=automation-lab/cook-county-assessor-parcel-scraper"
For Claude Desktop, Cursor, or VS Code, add this MCP JSON block:
{"mcpServers": {"apify": {"url": "https://mcp.apify.com?tools=automation-lab/cook-county-assessor-parcel-scraper"}}}
Your client will ask you to authenticate with Apify.
Example prompts:
- βLook up 2020 Cook County assessment and owner records for PIN 32213210090000.β
- βExport up to 100 class 202 parcels in Bloom township for 2020.β
- βCompare mailed, certified, and Board values for these parcel PINs.β
Integrations and automation workflows
Google Sheets portfolio refresh
Schedule the Actor monthly, export the latest dataset to Google Sheets, and use PIN plus year as the upsert key.
CRM owner lead enrichment
Search a bounded geography or class, then map owner and mailing fields into a CRM through Make or Zapier.
Tax-appeal analysis warehouse
Send each annual extract to BigQuery, Snowflake, or PostgreSQL. Compare value columns by PIN and year.
Change alerts
Use a scheduled run plus a webhook to trigger a downstream comparison when Cook County publishes a new year or updates Board values.
Tips for accurate and efficient runs
- Start with PINs or a narrow year range.
- Use exact township and class values from prior results.
- Increase
scanLimitonly when a cross-dataset text filter needs a wider search. - Keep
includePartialRecordsoff when your workflow requires both source datasets. - Use an app token for recurring high-volume workloads.
- Treat owner and mailing names as public-record labels that may contain spacing or punctuation differences.
- Preserve PINs as strings in spreadsheets.
Reliability and rate limits
The Actor retries HTTP 429 and transient 5xx responses with exponential backoff. It orders pages by row_id, deduplicates records, and limits the number of scanned rows.
Anonymous Socrata access is suitable for normal workloads. An optional user-supplied app token can increase rate limits, but it does not unlock additional fields and is never required.
If the official catalog is temporarily unavailable, the run fails rather than returning fabricated or silently stale data.
Data provenance
Every record names the official dataset IDs used for the join and includes a source URL, source row ID, and extraction timestamp.
Source datasets:
- Cook County Assessed Values:
uzyt-m557 - Cook County Parcel Addresses:
3723-97qp
Cook County remains the authoritative publisher. Field definitions and historical coverage can evolve upstream.
Legal and responsible use
The Actor accesses public Cook County government datasets. Public availability does not remove your obligations under privacy, anti-discrimination, consumer-protection, outreach, and data-retention laws.
Do not use owner or address data for harassment, unlawful discrimination, identity theft, or decisions that require regulated notices and verification. Review the official dataset terms and applicable laws for your use case.
Troubleshooting
Why did my valid query return no rows?
Check that the year exists for the PIN and that all filters can be true together. Township and property class are exact matches. Address and owner searches are contains matches, but combining both requires both to match.
Why did the run stop at scanLimit before reaching maxItems?
A cross-dataset filter can reject many driver rows after the join. Increase scanLimit, narrow the year/PIN/township filters, or use an expert SoQL predicate on the appropriate source.
Why are some optional fields absent?
Historical source rows vary. Missing upstream values are omitted. Turn on includePartialRecords only if a one-source row is useful to you.
Do I need a Cook County or Socrata account?
No. Both official endpoints work anonymously. The app token is optional and intended only for improved rate limits.
Can I search a PIN with hyphens?
Yes. Hyphens, spaces, and other non-digits are removed before validation.
FAQ
Does this include property tax bills or sale history?
This Actor focuses on the official assessed-values and parcel-address datasets described above. It does not claim tax-bill, exemption, sale, deed, or building-characteristic coverage.
Can I export multiple assessment years?
Yes. Set yearFrom and yearTo. Each parcel-year is a separate dataset row.
Does it scrape the assessor website with a browser?
No. It uses official JSON resources, which is faster, cheaper, and easier to audit.
Are owner names guaranteed to be the current legal owner?
No. They reflect the labels published in the selected parcel-year source. Verify critical decisions against current official records.
Can I use custom SoQL?
Yes. Advanced users can add a $where expression separately for each official dataset.
Related real-estate scrapers
- Maricopa County Property Records Scraper for Maricopa County, Arizona.
- Clark County Property Records Scraper for Clark County, Nevada.
- Browse other public-data and real-estate Actors from automation-lab.
Support
For a reproducible support request, include the run ID, sanitized input, expected PIN/year, and the official source row you expected. Do not post private app tokens in support messages.