Cook County (Chicago) Property Records API

Four GET operations on https://api.ingest0r.com described by the provider's OpenAPI 3.1 (version 0.4.2): v1_search resolves a full or partial street address to ranked parcel PINs with a match_quality flag (always free); v1_parcel returns one parcel record by PIN with the street address joined in ($0.01); v1_dossier returns the full property record — parcel basics plus recorded sales and deed history, building permits linked to the PIN, and assessment history ($0.03); v1_comps returns arm's-length comparable sales over 18 months with an implied low/median/high valuation range ($0.10). No API key: the first 25 paid-route calls per client per day are free (X-Free-Tier-Remaining header), then the route answers HTTP 402 with x402 v2 terms (USDC on Base eip155:8453 or Solana) and is retried with the payment. Every answer carries as_of, source and cite provenance fields and an X-Schema-Version header; the schema is additive-only within /v1. Errors are self-describing JSON {error, detail}; 429 per-IP at 120 requests/minute with Retry-After 60s. Coverage is Cook County, Illinois only; property-keyed public records with no owner or occupant names.

Operations 4

GET /v1/parcel/{pin} Single Cook County, IL parcel record by PIN: street address, city, ZIP, assessor property class, township, neighborhood, ward/municipality,… #
GET /v1/dossier/{pin} Complete Cook County / Chicago property record in one call: parcel basics PLUS recorded sales & deed history, building permits, and… #
GET /v1/comps/{pin} Comparable sales (comps) and a lightweight automated valuation for a Cook County / Chicago property: recent arm's-length sales in the same… #

Documentation

Specifications

Other Resources

Work with this as data

Every API here is available over the APIs.io API and to AI agents over MCP.

MCP server

One button, every client — Claude, Cursor, VS Code and the rest.

https://apis.io/mcp

Tools for apis

7 MCP tools reach this
  • find_apisBrowse and filter every API in the catalog.
  • get_api_artifactsOne API's artifacts, grouped by type.
  • get_openapiThe primary OpenAPI for this API.
  • find_similar_apisAPIs that look like this one.
  • apis_io_searchSTART HERE — APIs, providers and tags for one query, each with its total.
  • resolveTurn a domain, URL or GitHub org into the provider it belongs to.
  • find_cohortsEvery scored population of providers in the catalog.
All 92 tools →

Call it yourself

curl for this page
This API
curl "https://apis.io/api/v1/apis/cook-county-property-records-api"
All apis
curl "https://apis.io/api/v1/apis?limit=25"

Discovery needs no key. Ratings and market analysis are Pro.

Get an API key

Free tier, no form to fill in. Signing in shares your email address with us — we store it to create your key and to recognise you if you sign in with another provider. See our Privacy Policy and Terms.

A second provider on the same verified email joins the account you already have.

OpenAPI Specification

ingest0r-com-openapi.yml Raw ↑
openapi: 3.1.0
info:
  title: Cook County (Chicago) property records API
  version: 0.4.2
  description: 'Pay-per-call property-records API for Cook County, Illinois — including
    the City of Chicago. Look up any property by street ADDRESS or 14-digit PIN and
    get parcel details, recorded sales & deed history, building permits, and property-tax
    assessment history, joined and normalized into one answer. Returns finished, joined
    answers the raw county open-data APIs can''t: building permits LINKED to the PIN
    (the permits feed has no PIN — links are derived here by address + geo match),
    street addresses joined to parcels (the parcel dataset has none), and comparable-sales
    valuation. You get the answer, not rows to query, stitch, and derive yourself.
    Use for real-estate due diligence, automated valuation / comparable-sales (comps),
    title and lien research prep, lead enrichment, and market analysis. ~1.9M parcels,
    refreshed nightly, property-keyed (public records only — no personal data). No
    signup and no API key. Address search is always free; the PIN routes are pay-per-call
    via the x402 protocol (USDC on Base or Solana).'
  contact:
    url: https://api.ingest0r.com
    email: hyperionxmota@gmail.com
  x-keywords:
  - cook county
  - chicago
  - illinois
  - property records
  - real estate
  - parcel
  - PIN
  - address lookup
  - address to PIN
  - property tax
  - assessment
  - recorded sales
  - deed history
  - building permits
  - comparable sales
  - comps
  - automated valuation
  - due diligence
  - lead enrichment
  - title research
  - open data
  - x402
  - pay per call
  - evanston
  - oak park
  - cicero
  - skokie
  - berwyn
  - des plaines
  - arlington heights
  - palatine
  - schaumburg
  - orland park
  - tinley park
  - oak lawn
  - suburban cook county
  - assessed value
  - assessor
  - cook county assessor
  - board of review
  - AVM
  - home value
  - last sold price
  - sale history
  - permit history
  - building permit lookup
  - renovation history
  - pin lookup
  - cook county pin
  - geocode
  - latitude longitude
  - property research
  - real estate investor
  - underwriting
  - ward
  - census tract
  x-rate-limit:
    requests_per_minute: 120
  x-guidance: 'Resolve a street address to a parcel PIN with GET /v1/search/{q} —
    search is FREE, no payment needed. Then fetch the full record with GET /v1/dossier/{pin}.
    Use /v1/parcel/{pin} for a cheap single lookup and /v1/comps/{pin} for comparable
    sales. The PIN routes are pay-per-call via x402 (USDC on Base or Solana) and return
    HTTP 402 with machine-readable payment terms until paid. Try GET /v1/sample FIRST
    — it is FREE and returns a representative response so you can validate the data
    shape before paying. You do not need a wallet to evaluate this API: search and
    the sample cost nothing, and the free live example PINs listed at https://api.ingest0r.com/pricing
    return real records on the normal paid routes at $0. The same data is available
    as an MCP server (streamable-http) at https://api.ingest0r.com/mcp if your client
    speaks MCP rather than plain HTTP. Coverage is Cook County, Illinois (including
    the City of Chicago) ONLY; data is property-keyed public records — no personal,
    owner, or occupant data.'
servers:
- url: https://api.ingest0r.com
paths:
  /v1/search/{q}:
    get:
      operationId: v1_search
      summary: Address → PIN lookup for Cook County / Chicago.
      description: 'Address → PIN lookup for Cook County / Chicago. Resolve a full
        or partial STREET ADDRESS to its parcel PIN(s): ranked candidate parcels with
        address, city, ZIP, a match score and a match_quality flag (exact | likely
        | weak | none) — resolving the address-to-parcel gap (the raw parcel dataset
        has no address). The entry point when you have an address but not a PIN —
        call this before /v1/dossier, /v1/parcel, or /v1/comps. Public assessor records.
        FREE — no payment required (the PIN routes are pay-per-call).'
      parameters:
      - name: q
        in: path
        required: true
        description: Street address or partial (4+ chars), e.g. '1 E 113th St'. A
          trailing city/state/ZIP is fine and is stripped ('1 E 113th St, Chicago,
          IL 60628').
        schema:
          type: string
      x-payment-info:
        price:
          mode: fixed
          amount: '0.00'
          currency: USD
        protocols:
        - x402: {}
        x-free: true
      responses:
        '200':
          description: Free result — no payment required.
          content:
            application/json:
              schema:
                type: object
                properties:
                  query:
                    type: string
                  normalized:
                    type: string
                    description: the street portion actually matched
                  match_quality:
                    type: string
                    description: exact | likely | weak | none. Only 'exact' is certain;
                      'weak' means no candidate shares the house number - do not rely
                      on it
                  matches:
                    type: array
                    items:
                      type: object
                      properties:
                        pin:
                          type: string
                        prop_address:
                          type: string
                        prop_city:
                          type: string
                        prop_zip:
                          type: string
                        exact:
                          type: boolean
                        score:
                          type: number
                          description: 0-1 address similarity
              example:
                query: 7645 W Howard St, Chicago, IL 60631
                normalized: 7645 W HOWARD ST
                match_quality: exact
                matches:
                - pin: 09253060510000
                  prop_address: 7645 W HOWARD ST
                  prop_city: CHICAGO
                  prop_zip: '60631'
                  score: 1.0
                  exact: true
        '400':
          description: query_too_short — send at least 4 characters of a street address.
          content:
            application/json:
              schema:
                type: object
                properties:
                  error:
                    type: string
                    description: stable machine-readable code
                  detail:
                    type: string
                    description: how to fix the request, in prose
              example:
                error: query_too_short
        '429':
          description: rate_limited — per-IP limit; honor the Retry-After header (60s)
            and retry.
          content:
            application/json:
              schema:
                type: object
                properties:
                  error:
                    type: string
                    description: stable machine-readable code
                  detail:
                    type: string
                    description: how to fix the request, in prose
              example:
                error: rate_limited
        '503':
          description: busy — capacity shed, retryable; honor Retry-After (2s). Not
            a failure of the request itself.
          content:
            application/json:
              schema:
                type: object
                properties:
                  error:
                    type: string
                    description: stable machine-readable code
                  detail:
                    type: string
                    description: how to fix the request, in prose
              example:
                error: busy
  /v1/parcel/{pin}:
    get:
      operationId: v1_parcel
      summary: 'Single Cook County, IL parcel record by PIN: street address, city,
        ZIP, assessor property class, township, neighborhood, ward/municipality,…'
      description: 'Single Cook County, IL parcel record by PIN: street address, city,
        ZIP, assessor property class, township, neighborhood, ward/municipality, census
        tract, school districts, walkability and airport-noise context, and lat/lon
        — with the street address joined in (the raw parcel dataset has none). The
        cheap single-property lookup. Source: Cook County Assessor, refreshed nightly.'
      parameters:
      - name: pin
        in: path
        required: true
        description: Cook County PIN, 10 or 14 digits, dashes ok (14-08-120-017-0000).
          Only have an address? /v1/search first.
        schema:
          type: string
      x-payment-info:
        price:
          mode: fixed
          amount: '0.01'
          currency: USD
        protocols:
        - x402:
            x402Version: 2
            payTo: '0x98D530C0667A4B18e692F182DdCAb1c2bECb5B9B'
            accepts:
            - scheme: exact
              network: eip155:8453
              asset: '0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913'
              currency: USDC
              payTo: '0x98D530C0667A4B18e692F182DdCAb1c2bECb5B9B'
            - scheme: exact
              network: solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp
              asset: EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v
              currency: USDC
              payTo: G3qr8ahZnuFSYjvrCYM4LLDdoLzFq8Boq9XrURVcA9YF
            asset: '0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913'
            network: eip155:8453
      responses:
        '200':
          description: Paid result.
          content:
            application/json:
              schema:
                type: object
                properties:
                  pin:
                    type: string
                  prop_address:
                    type: string
                  prop_city:
                    type: string
                  prop_zip:
                    type: string
                  class:
                    type: string
                  township_name:
                    type: string
                  nbhd_code:
                    type: string
                  tax_year:
                    type: integer
                  lat:
                    type: number
                  lon:
                    type: number
                  municipality:
                    type: string
                  ward:
                    type: string
                  police_district:
                    type: string
                  census_tract_geoid:
                    type: string
                  school_elementary_district:
                    type: string
                  school_secondary_district:
                    type: string
                  walk_score_cmap:
                    type: number
                  airport_noise_dnl:
                    type: number
              example:
                pin: 09253060510000
                prop_address: 7645 W HOWARD ST
                prop_city: CHICAGO
                prop_zip: '60631'
                class: '203'
                township_name: Jefferson
                nbhd_code: '71361'
                municipality: CITY OF CHICAGO
                ward: '41'
                tax_year: 2026
                lat: 42.0184
                lon: -87.8181
        '402':
          description: 'Payment required (x402): pay per the returned challenge and
            retry the request.'
        '400':
          description: invalid_pin — PIN must be 14 digits (or the 10-digit form,
            dashed or not).
          content:
            application/json:
              schema:
                type: object
                properties:
                  error:
                    type: string
                    description: stable machine-readable code
                  detail:
                    type: string
                    description: how to fix the request, in prose
              example:
                error: invalid_pin
        '404':
          description: not_found — well-formed PIN that is not in the Cook County
            parcel universe (coverage is Cook County only).
          content:
            application/json:
              schema:
                type: object
                properties:
                  error:
                    type: string
                    description: stable machine-readable code
                  detail:
                    type: string
                    description: how to fix the request, in prose
              example:
                error: not_found
        '429':
          description: rate_limited — per-IP limit; honor the Retry-After header (60s)
            and retry.
          content:
            application/json:
              schema:
                type: object
                properties:
                  error:
                    type: string
                    description: stable machine-readable code
                  detail:
                    type: string
                    description: how to fix the request, in prose
              example:
                error: rate_limited
        '503':
          description: busy — capacity shed, retryable; honor Retry-After (2s). Not
            a failure of the request itself.
          content:
            application/json:
              schema:
                type: object
                properties:
                  error:
                    type: string
                    description: stable machine-readable code
                  detail:
                    type: string
                    description: how to fix the request, in prose
              example:
                error: busy
  /v1/dossier/{pin}:
    get:
      operationId: v1_dossier
      summary: 'Complete Cook County / Chicago property record in one call: parcel
        basics PLUS recorded sales & deed history, building permits, and…'
      description: 'Complete Cook County / Chicago property record in one call: parcel
        basics PLUS recorded sales & deed history, building permits, and property-tax
        assessment history, joined and normalized, with neighborhood/ward/school/walkability
        context. Permits are LINKED to the PIN (the raw permit feed has none) — one
        finished record, not raw rows to stitch. For due diligence, valuation, underwriting.
        Nightly-fresh; no personal data.'
      parameters:
      - name: pin
        in: path
        required: true
        description: Cook County PIN, 10 or 14 digits, dashes ok (14-08-120-017-0000).
          Only have an address? /v1/search first.
        schema:
          type: string
      x-payment-info:
        price:
          mode: fixed
          amount: '0.03'
          currency: USD
        protocols:
        - x402:
            x402Version: 2
            payTo: '0x98D530C0667A4B18e692F182DdCAb1c2bECb5B9B'
            accepts:
            - scheme: exact
              network: eip155:8453
              asset: '0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913'
              currency: USDC
              payTo: '0x98D530C0667A4B18e692F182DdCAb1c2bECb5B9B'
            - scheme: exact
              network: solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp
              asset: EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v
              currency: USDC
              payTo: G3qr8ahZnuFSYjvrCYM4LLDdoLzFq8Boq9XrURVcA9YF
            asset: '0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913'
            network: eip155:8453
      responses:
        '200':
          description: Paid result.
          content:
            application/json:
              schema:
                type: object
                properties:
                  pin:
                    type: string
                  prop_address:
                    type: string
                  class:
                    type: string
                  municipality:
                    type: string
                  ward:
                    type: string
                  sales_history:
                    type: array
                    items:
                      type: object
                      properties:
                        date:
                          type: string
                        price:
                          type: number
                        doc_no:
                          type: string
                        deed_type:
                          type: string
                  permits:
                    type: array
                    items:
                      type: object
                      properties:
                        issued:
                          type: string
                        type:
                          type: string
                        cost:
                          type: number
                        desc:
                          type: string
                  assessment_history:
                    type: array
                    items:
                      type: object
                      properties:
                        year:
                          type: integer
                        certified:
                          type: number
                        board:
                          type: number
                        mailed:
                          type: number
                        stage:
                          type: string
                          description: pending|mailed|certified|board
                  assessment_note:
                    type: string
                    description: ASSESSED values, not market value or tax owed
              example:
                pin: 09253060510000
                prop_address: 7645 W HOWARD ST
                prop_city: CHICAGO
                prop_zip: '60631'
                class: '203'
                municipality: CITY OF CHICAGO
                ward: '41'
                sales_history:
                - date: '2014-08-01'
                  price: 385000.0
                  doc_no: '1423956016'
                  deed_type: Warranty
                permits:
                - issued: '2020-12-15'
                  type: PERMIT - EASY PERMIT PROCESS
                  cost: 24149.0
                  desc: SOLAR PANEL PERMIT
                assessment_history:
                - year: 2025
                  certified: 42001.0
                  board: 42001.0
                  mailed: 42001.0
                  stage: board
        '402':
          description: 'Payment required (x402): pay per the returned challenge and
            retry the request.'
        '400':
          description: invalid_pin — PIN must be 14 digits (or the 10-digit form,
            dashed or not).
          content:
            application/json:
              schema:
                type: object
                properties:
                  error:
                    type: string
                    description: stable machine-readable code
                  detail:
                    type: string
                    description: how to fix the request, in prose
              example:
                error: invalid_pin
        '404':
          description: not_found — well-formed PIN that is not in the Cook County
            parcel universe (coverage is Cook County only).
          content:
            application/json:
              schema:
                type: object
                properties:
                  error:
                    type: string
                    description: stable machine-readable code
                  detail:
                    type: string
                    description: how to fix the request, in prose
              example:
                error: not_found
        '429':
          description: rate_limited — per-IP limit; honor the Retry-After header (60s)
            and retry.
          content:
            application/json:
              schema:
                type: object
                properties:
                  error:
                    type: string
                    description: stable machine-readable code
                  detail:
                    type: string
                    description: how to fix the request, in prose
              example:
                error: rate_limited
        '503':
          description: busy — capacity shed, retryable; honor Retry-After (2s). Not
            a failure of the request itself.
          content:
            application/json:
              schema:
                type: object
                properties:
                  error:
                    type: string
                    description: stable machine-readable code
                  detail:
                    type: string
                    description: how to fix the request, in prose
              example:
                error: busy
  /v1/comps/{pin}:
    get:
      operationId: v1_comps
      summary: 'Comparable sales (comps) and a lightweight automated valuation for
        a Cook County / Chicago property: recent arm''s-length sales in the same…'
      description: 'Comparable sales (comps) and a lightweight automated valuation
        for a Cook County / Chicago property: recent arm''s-length sales in the same
        assessor neighborhood and property class over the last 18 months, with an
        implied low/median/high price range, each comp carrying its distance in metres
        from the subject. Thin markets widen automatically (36 months, then the property-class
        group) and the response reports which rung was used. Non-arm''s-length and
        multi-parcel deeds are filtered out — a derived valuation you won''t get from
        a raw open-data query. For valuation, underwriting, investment screening,
        and due diligence.'
      parameters:
      - name: pin
        in: path
        required: true
        description: Cook County PIN, 10 or 14 digits, dashes ok (14-08-120-017-0000).
          Only have an address? /v1/search first.
        schema:
          type: string
      x-payment-info:
        price:
          mode: fixed
          amount: '0.10'
          currency: USD
        protocols:
        - x402:
            x402Version: 2
            payTo: '0x98D530C0667A4B18e692F182DdCAb1c2bECb5B9B'
            accepts:
            - scheme: exact
              network: eip155:8453
              asset: '0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913'
              currency: USDC
              payTo: '0x98D530C0667A4B18e692F182DdCAb1c2bECb5B9B'
            - scheme: exact
              network: solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp
              asset: EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v
              currency: USDC
              payTo: G3qr8ahZnuFSYjvrCYM4LLDdoLzFq8Boq9XrURVcA9YF
            asset: '0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913'
            network: eip155:8453
      responses:
        '200':
          description: Paid result.
          content:
            application/json:
              schema:
                type: object
                properties:
                  pin:
                    type: string
                  comps:
                    type: array
                    items:
                      type: object
                      properties:
                        pin:
                          type: string
                        prop_address:
                          type: string
                        sale_date:
                          type: string
                        sale_price:
                          type: number
                        deed_type:
                          type: string
                        comp_class:
                          type: string
                        distance_m:
                          type: number
                          description: metres from the subject parcel
                  method:
                    type: string
                    description: which matching rung produced these comps
                  implied_range:
                    type: object
                    properties:
                      low:
                        type: number
                      median:
                        type: number
                      high:
                        type: number
                      n:
                        type: integer
              example:
                pin: 09253060510000
                comps:
                - pin: 09253140190000
                  prop_address: 7452 N OTTAWA AVE
                  sale_date: '2019-08-16'
                  sale_price: 567500
                  deed_type: Warranty
                implied_range:
                  low: 385000
                  median: 470000
                  high: 567500
                  n: 7
        '402':
          description: 'Payment required (x402): pay per the returned challenge and
            retry the request.'
        '400':
          description: invalid_pin — PIN must be 14 digits (or the 10-digit form,
            dashed or not).
          content:
            application/json:
              schema:
                type: object
                properties:
                  error:
                    type: string
                    description: stable machine-readable code
                  detail:
                    type: string
                    description: how to fix the request, in prose
              example:
                error: invalid_pin
        '404':
          description: not_found — well-formed PIN that is not in the Cook County
            parcel universe (coverage is Cook County only).
          content:
            application/json:
              schema:
                type: object
                properties:
                  error:
                    type: string
                    description: stable machine-readable code
                  detail:
                    type: string
                    description: how to fix the request, in prose
              example:
                error: not_found
        '429':
          description: rate_limited — per-IP limit; honor the Retry-After header (60s)
            and retry.
          content:
            application/json:
              schema:
                type: object
                properties:
                  error:
                    type: string
                    description: stable machine-readable code
                  detail:
                    type: string
                    description: how to fix the request, in prose
              example:
                error: rate_limited
        '503':
          description: busy — capacity shed, retryable; honor Retry-After (2s). Not
            a failure of the request itself.
          content:
            application/json:
              schema:
                type: object
                properties:
                  error:
                    type: string
                    description: stable machine-readable code
                  detail:
                    type: string
                    description: how to fix the request, in prose
              example:
                error: busy
x-payment:
  protocol: x402
  x402Version: 2
  accepts:
  - scheme: exact
    network: eip155:8453
    asset: '0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913'
    currency: USDC
    payTo: '0x98D530C0667A4B18e692F182DdCAb1c2bECb5B9B'
  - scheme: exact
    network: solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp
    asset: EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v
    currency: USDC
    payTo: G3qr8ahZnuFSYjvrCYM4LLDdoLzFq8Boq9XrURVcA9YF