Skip to content
All data sources

Texas Appraisal History API and MCP server

No authtexas-appraisal-history

Search all 252 Texas counties in the Exempt.Land parcel corpus by address, owner, legal description, map point, or map window; screen rural land by acreage and owner type; and read full appraisal and exemption history for one parcel.

Texas Appraisal History is published by Exempt.Land Texas appraisal corpus, covers Texas — all 252 counties present in the Exempt.Land parcel corpus (~13.2 million parcels), and holds records 2019 to present.

It refreshes on a schedule the publisher sets.

Last verified . That is when these facts were last rebuilt from the ParcelOps source registry, not when Exempt.Land Texas appraisal corpus last refreshed the data itself.

API access

Your AI client reaches Texas Appraisal History through one ParcelOps MCP endpoint, so there is no separate key to hold for it and no per-source client to write. Reaching it takes no credentials of your own.

Where it came from

PublisherExempt.Land Texas appraisal corpus

Freshness and coverage

FreshnessScheduled · Values follow county appraisal collection cycles. Source timestamps are returned when present.
Places coveredTexas — all 252 counties present in the Exempt.Land parcel corpus (~13.2 million parcels)
Time covered2019 → present · Appraisal history runs from 2019 to the current tax year. The three-year methods default to the previous three completed years; the full timeline returns every collected year.
CredentialsNo credentials required

What this source cannot tell you

  • Anything outside Texas — all 252 counties present in the Exempt.Land parcel corpus (~13.2 million parcels). A request past that edge comes back empty rather than approximated.
  • Anything from before 2019.
  • Anything Exempt.Land Texas appraisal corpus does not publish. ParcelOps returns this source as it stands and never fills a blank field from a different one.
  • This is county appraisal history, not verified sale history, title evidence, or a legal-boundary source.
  • City fields are blank in portions of the corpus, so address search requires county plus street address.
  • Appraisal districts use different land-use codes. Raw labels remain visible beside a convenience residential/commercial classification.
  • Agricultural and wildlife classification is collected for every appraisal year present, so false means "not agricultural". Homestead and over-65 are null on roughly 97% of rows because most county-years were never collected for exemption status: null means unknown, never "no exemption". Confirm exemption status with the appraisal district.
  • Owner entity type (individual, LLC, trust, corporation, and so on) is classified from the district owner-name string, not looked up in a corporate registry. About 31% classify as unknown, so filtering by type silently excludes them.
  • Owner names are district-published and are frequently abbreviated, misspelled, or stale after a sale. They find candidates rather than prove ownership.
  • Parcel geometry is appraisal district data, simplified for display. It is not survey grade and does not establish a legal boundary.
  • District acreage and geometry-derived acreage disagree frequently. Both are returned and neither is silently preferred.
  • Owner and legal-description search require a county, because a statewide fuzzy scan costs roughly ten times a county-scoped one. Broad or very common terms additionally require an acreage floor of at least 10 acres, or the request is refused rather than run past its three-second limit.
  • Land screening is supported at 10 acres and above. Below that the query is not index-backed against a 13.2-million-row table and is refused rather than served slowly.
  • Assessed and capped values are populated for no parcel in this corpus and are not returned at all, rather than returned as nulls that would read as "no cap applies".

Methods (12)

A method is one call your agent can make against this source.

  • searchProperties

    read

    Find address candidates by street address in any of the 252 Texas counties in the corpus.

    What you must providecountystreetAddress
    FreshnessScheduled (source-level)
    Input schema
    {
      "type": "object",
      "properties": {
        "county": {
          "type": "string",
          "maxLength": 64,
          "description": "Any Texas county name, such as Harris, Travis, or Gillespie."
        },
        "streetAddress": {
          "type": "string",
          "minLength": 3,
          "maxLength": 200,
          "description": "Number and street only, such as 1200 Main St."
        },
        "limit": {
          "type": "integer",
          "minimum": 1,
          "maximum": 25,
          "default": 25
        }
      },
      "required": [
        "county",
        "streetAddress"
      ],
      "additionalProperties": false
    }
  • getPropertyHistory

    read

    Return up to three requested county appraisal years for one search result.

    What you must provideparcelId
    FreshnessScheduled (source-level)
    Input schema
    {
      "type": "object",
      "properties": {
        "parcelId": {
          "type": "string",
          "pattern": "^[1-9]\\d{0,19}$",
          "description": "ParcelOps parcel ID returned by the address search."
        },
        "years": {
          "type": "array",
          "minItems": 1,
          "maxItems": 3,
          "uniqueItems": true,
          "items": {
            "type": "integer",
            "minimum": 2019,
            "maximum": 2100
          },
          "description": "Up to three tax years. Defaults to the previous three completed years."
        }
      },
      "required": [
        "parcelId"
      ],
      "additionalProperties": false
    }
  • getHomeownerSummary

    read

    Summarize value changes, county contacts, deadline guidance, and homeowner next steps.

    What you must provideparcelId
    FreshnessScheduled (source-level)
    Input schema
    {
      "type": "object",
      "properties": {
        "parcelId": {
          "type": "string",
          "pattern": "^[1-9]\\d{0,19}$",
          "description": "ParcelOps parcel ID returned by the address search."
        },
        "years": {
          "type": "array",
          "minItems": 1,
          "maxItems": 3,
          "uniqueItems": true,
          "items": {
            "type": "integer",
            "minimum": 2019,
            "maximum": 2100
          },
          "description": "Up to three tax years. Defaults to the previous three completed years."
        }
      },
      "required": [
        "parcelId"
      ],
      "additionalProperties": false
    }
  • lookupParcel

    read

    Return the full county record for one parcel: owner and owner classification, legal description, mailing address, district acquisition date, centroid, bounding box, and both district and geometry-derived acreage.

    What you must provideparcelId
    FreshnessScheduled (source-level)
    Input schema
    {
      "type": "object",
      "properties": {
        "parcelId": {
          "type": "string",
          "pattern": "^[1-9]\\d{0,19}$",
          "description": "ParcelOps parcel ID returned by any search on this connector."
        }
      },
      "required": [
        "parcelId"
      ],
      "additionalProperties": false
    }
  • getParcelTimeline

    read

    Return every collected appraisal year for one parcel, including agricultural, wildlife, homestead, over-65, and exemption-code fields. Null exemption flags mean not collected, never "no exemption".

    What you must provideparcelId
    FreshnessScheduled (source-level)
    Input schema
    {
      "type": "object",
      "properties": {
        "parcelId": {
          "type": "string",
          "pattern": "^[1-9]\\d{0,19}$",
          "description": "ParcelOps parcel ID returned by any search on this connector."
        },
        "years": {
          "type": "array",
          "minItems": 1,
          "maxItems": 12,
          "uniqueItems": true,
          "items": {
            "type": "integer",
            "minimum": 2019,
            "maximum": 2100
          },
          "description": "Optional tax years. Omit to return every collected year from 2019 onward."
        }
      },
      "required": [
        "parcelId"
      ],
      "additionalProperties": false
    }
  • searchByOwner

    read

    Find parcels in one Texas county whose appraisal district owner name contains the given text, largest parcels first.

    What you must providecountyownerName
    FreshnessScheduled (source-level)
    Input schema
    {
      "type": "object",
      "properties": {
        "county": {
          "type": "string",
          "maxLength": 64,
          "description": "Texas county name. Required: a statewide fuzzy scan costs about ten times a county-scoped one."
        },
        "ownerName": {
          "type": "string",
          "minLength": 3,
          "maxLength": 80,
          "description": "Owner name or fragment, such as King Ranch."
        },
        "minAcres": {
          "type": "number",
          "minimum": 10,
          "description": "Optional acreage floor, minimum 10. Required in practice for short or very common terms, which otherwise exceed the three-second limit."
        },
        "limit": {
          "type": "integer",
          "minimum": 1,
          "maximum": 50,
          "default": 25
        }
      },
      "required": [
        "county",
        "ownerName"
      ],
      "additionalProperties": false
    }
  • screenLand

    read

    Screen rural land in one Texas county by acreage range and owner entity type, largest parcels first. Supported at 10 acres and above.

    What you must providecountyminAcres
    FreshnessScheduled (source-level)
    Input schema
    {
      "type": "object",
      "properties": {
        "county": {
          "type": "string",
          "maxLength": 64,
          "description": "Texas county name, such as Gillespie."
        },
        "minAcres": {
          "type": "number",
          "minimum": 10,
          "description": "Acreage floor, minimum 10. Smaller floors are not index-backed and are refused rather than run slowly."
        },
        "maxAcres": {
          "type": "number",
          "minimum": 10,
          "description": "Optional acreage ceiling; must exceed minAcres."
        },
        "ownerEntityTypes": {
          "type": "array",
          "minItems": 1,
          "maxItems": 8,
          "uniqueItems": true,
          "items": {
            "type": "string",
            "enum": [
              "individual",
              "llc",
              "corporation",
              "trust",
              "partnership",
              "government",
              "exempt_org",
              "unknown"
            ]
          },
          "description": "Optional owner classification filter. About 31% of parcels classify as unknown, so filtering excludes them."
        },
        "limit": {
          "type": "integer",
          "minimum": 1,
          "maximum": 100,
          "default": 50
        }
      },
      "required": [
        "county",
        "minAcres"
      ],
      "additionalProperties": false
    }
  • identifyParcelAtPoint

    read

    Return the parcel whose appraisal district boundary contains one WGS84 coordinate inside Texas.

    What you must providelatitudelongitude
    FreshnessScheduled (source-level)
    Input schema
    {
      "type": "object",
      "properties": {
        "latitude": {
          "type": "number",
          "minimum": 25.5,
          "maximum": 36.7,
          "description": "WGS84 latitude inside Texas."
        },
        "longitude": {
          "type": "number",
          "minimum": -107,
          "maximum": -93.4,
          "description": "WGS84 longitude inside Texas."
        },
        "limit": {
          "type": "integer",
          "minimum": 1,
          "maximum": 10,
          "default": 5
        }
      },
      "required": [
        "latitude",
        "longitude"
      ],
      "additionalProperties": false
    }
  • getParcelsInArea

    read

    Return parcels intersecting a WGS84 bounding box inside Texas, for map windows up to 0.25 square degrees.

    What you must providebbox
    FreshnessScheduled (source-level)
    Input schema
    {
      "type": "object",
      "properties": {
        "bbox": {
          "type": "string",
          "maxLength": 120,
          "description": "Bounding box as minLon,minLat,maxLon,maxLat. Must fall inside Texas and cover at most 0.25 square degrees, roughly a 50 km window."
        },
        "limit": {
          "type": "integer",
          "minimum": 1,
          "maximum": 200,
          "default": 50
        }
      },
      "required": [
        "bbox"
      ],
      "additionalProperties": false
    }
  • searchByLegalDescription

    read

    Find parcels in one Texas county whose legal description contains the given subdivision, block, lot, abstract, or survey text.

    What you must providecountyquery
    FreshnessScheduled (source-level)
    Input schema
    {
      "type": "object",
      "properties": {
        "county": {
          "type": "string",
          "maxLength": 64,
          "description": "Texas county name."
        },
        "query": {
          "type": "string",
          "minLength": 3,
          "maxLength": 120,
          "description": "Legal description text, such as BLOCK 5 LOT 12."
        },
        "minAcres": {
          "type": "number",
          "minimum": 10,
          "description": "Optional acreage floor, minimum 10. Required in practice for very common terms such as lot or blk."
        },
        "limit": {
          "type": "integer",
          "minimum": 1,
          "maximum": 50,
          "default": 25
        }
      },
      "required": [
        "county",
        "query"
      ],
      "additionalProperties": false
    }
  • getParcelBoundary

    read

    Return one parcel boundary as GeoJSON, simplified for display. Not survey grade and not a legal boundary.

    What you must provideparcelId
    FreshnessScheduled (source-level)
    Input schema
    {
      "type": "object",
      "properties": {
        "parcelId": {
          "type": "string",
          "pattern": "^[1-9]\\d{0,19}$",
          "description": "ParcelOps parcel ID returned by any search on this connector."
        }
      },
      "required": [
        "parcelId"
      ],
      "additionalProperties": false
    }
  • getServiceInfo

    read

    Return county and field coverage, data gaps, and storage and compute safeguards.

    FreshnessScheduled (source-level)
    Input schema
    {
      "type": "object",
      "properties": {},
      "required": [],
      "additionalProperties": false
    }

Where this source is used