# Property Price Tax History (`coder_luffy/property-price-tax-history`) Actor

Property price and tax history scraper that pulls records in bulk by property ID, listing URL, or address.

- **URL**: https://apify.com/coder\_luffy/property-price-tax-history.md
- **Developed by:** [Luffy](https://apify.com/coder_luffy) (community)
- **Categories:** Real estate, Developer tools, Automation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, NaN bookmarks
- **User rating**: No ratings yet

## Pricing

from $11.00 / 1,000 results

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

Learn more: https://docs.apify.com/platform/actors/running/actors-in-store#pay-per-event

## What's an Apify Actor?

Actors are a software tools running on the Apify platform, for all kinds of web data extraction and automation use cases.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.
Actors are written with capital "A".

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.
The best way to integrate Actors is as follows.

In JavaScript/TypeScript projects, use official [JavaScript/TypeScript client](https://docs.apify.com/api/client/js.md):

```bash
npm install apify-client
```

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python.md):

```bash
pip install apify-client
```

In shell scripts, use [Apify CLI](https://docs.apify.com/cli/docs.md):

````bash
# MacOS / Linux
curl -fsSL https://apify.com/install-cli.sh | bash
# Windows
irm https://apify.com/install-cli.ps1 | iex
```bash

In AI frameworks, you might use the [Apify MCP server](https://docs.apify.com/platform/integrations/mcp.md).

If your project is in a different language, use the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).


# README

<p align="center">
  <img src="https://i.imgur.com/ZIdWOgx.png" alt="Property Price & Tax History" />
</p>

## Property Price & Tax History

Property Price & Tax History is an Apify actor that pulls price history and tax history records for residential and commercial properties. Give it a list of property IDs, listing URLs, or street addresses, and it returns structured data you can analyze, export, or feed into your own workflows.

If you work in real estate research, investment analysis, or market comparisons, knowing what a property sold for five years ago and what its tax bill looked like is basic due diligence. This actor handles the fetch layer so you're not clicking through listing pages one at a time.

### Use cases

- Investment due diligence: pull the full price and tax history for a target property before making an offer
- Market trend analysis: batch-fetch price history for hundreds of properties to find pricing patterns across a neighborhood over time
- Tax assessment research: compare annual assessed values against sale prices across a portfolio or geographic area
- Portfolio monitoring: run on a schedule to keep historical records current as new transactions get recorded
- Data pipeline work: feed structured output directly into spreadsheets, databases, or BI tools via Apify integrations
- Academic and journalistic research: collect property transaction data for housing market studies or investigative reporting

### What data does this actor extract?

For each property, the actor returns price history and tax history in a single structured record. Price history includes sale dates, sale prices, listing dates, and price change events. Tax history includes annual records with assessed value and tax amount. Each record also carries the original input value you provided so you can trace results back to your source list.

### Input

| Parameter | Type | Description |
|-----------|------|-------------|
| `zpidIds` | array of strings | Property IDs, one per line. Each ID is fetched as a separate property. |
| `listingUrls` | array of strings | Listing page URLs, one per line. Both URL formats are supported (see below). |
| `addressQueries` | array of strings | Full street addresses, one per line. |

You need at least one of `zpidIds`, `listingUrls`, or `addressQueries`. You can mix all three input types in a single run.

#### URL formats

The actor handles two listing URL formats:

**With property ID in the URL:**
````

https://www.xyz.com/homedetails/9192-W-Rafael-Dr-Arizona-City-AZ-85123/447510460\_zpid/

```
The property ID is extracted directly from the URL. No extra lookup needed.

**Without property ID in the URL:**
```

https://www.xyz.com/homedetails/9192-W-Rafael-Dr-Arizona-City-AZ-85123

````
The actor extracts the address slug from the path, looks up the property ID automatically, then fetches the history. Both formats produce identical output.

#### Example input

```json
{
    "zpidIds": ["88886689", "89551133"],
    "listingUrls": [
        "https://www.xyz.com/homedetails/9192-W-Rafael-Dr-Arizona-City-AZ-85123/447510460_zpid/"
    ],
    "addressQueries": ["16022 S NAVISKA Road, Arizona City, AZ 85123"]
}
````

![Property Price & Tax History](https://i.imgur.com/7vhs2FS.png)

### Output

Results land in an Apify dataset, one record per property. A typical record looks like this:

```json
{
    "searchQuery": "16022 S NAVISKA Road, Arizona City, AZ 85123",
    "zpid": "111048025",
    "priceHistory": [
        {
            "date": "2023-08-10",
            "price": 285000,
            "event": "Sold"
        },
        {
            "date": "2023-06-15",
            "price": 299000,
            "event": "Listed"
        },
        {
            "date": "2019-03-22",
            "price": 198000,
            "event": "Sold"
        }
    ],
    "taxHistory": [
        {
            "year": 2023,
            "taxPaid": 1840,
            "value": 215000
        },
        {
            "year": 2022,
            "taxPaid": 1710,
            "value": 198000
        }
    ],
    "fetchedAt": "2026-04-17T10:32:00Z"
}
```

#### Output fields

| Field | Type | Description |
|-------|------|-------------|
| `searchQuery` | string | The original input value used to look up this property (ID, URL, or address) |
| `zpid` | string | Property ID |
| `priceHistory` | array | Price events in reverse chronological order (date, price, event type) |
| `taxHistory` | array | Annual tax records (year, tax paid, assessed value) |
| `error` | string | Present only if the fetch failed after all retry attempts |
| `fetchedAt` | string | ISO 8601 timestamp of when the record was retrieved |

If a property fetch fails after all retry attempts, the actor writes an error record with the `error` and `searchQuery` fields instead of crashing. The rest of your batch keeps running.

### How it works

1. The actor reads your input list. You can pass property IDs, listing URLs, or street addresses in any combination.
2. For URLs that contain a property ID, the ID is extracted directly with no extra request.
3. For URLs without a property ID, the address slug in the path is used to look up the property ID first.
4. For street addresses, the actor looks up the property ID before fetching history.
5. Once the property ID is known, the actor fetches price and tax history and pushes the result to your dataset.
6. If a request fails, the actor retries up to 5 times before moving on.

### FAQ

**What input formats does this actor support?**

Three: property IDs, listing URLs, and full street addresses. You can mix all three in a single run. The actor processes each entry independently and combines everything into one dataset.

**How many records does this actor return per property?**

Up to 10 price history records and 10 tax history records per property.

**Can I run this on a schedule?**

Yes. Connect it to the Apify scheduler to pull fresh data at whatever interval makes sense for your workflow.

# Actor input Schema

## `zpidIds` (type: `array`):

Zillow property IDs (ZPIDs), one per line. Each entry is fetched as a separate property.

## `listingUrls` (type: `array`):

Zillow listing URLs, one per line. Each URL is fetched as a separate property.

## `addressQueries` (type: `array`):

Full property addresses, one per line. Each address is looked up as a separate property.

## Actor input object example

```json
{
  "zpidIds": [
    "88886689",
    "89551133"
  ],
  "listingUrls": [
    "https://www.zillow.com/homedetails/9192-W-Rafael-Dr-Arizona-City-AZ-85123/447510460_zpid/"
  ],
  "addressQueries": [
    "16022 S NAVISKA Road, Arizona City, AZ 85123"
  ]
}
```

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "zpidIds": [
        "88886689",
        "89551133"
    ],
    "listingUrls": [
        "https://www.zillow.com/homedetails/9192-W-Rafael-Dr-Arizona-City-AZ-85123/447510460_zpid/"
    ],
    "addressQueries": [
        "16022 S NAVISKA Road, Arizona City, AZ 85123"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("coder_luffy/property-price-tax-history").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "zpidIds": [
        "88886689",
        "89551133",
    ],
    "listingUrls": ["https://www.zillow.com/homedetails/9192-W-Rafael-Dr-Arizona-City-AZ-85123/447510460_zpid/"],
    "addressQueries": ["16022 S NAVISKA Road, Arizona City, AZ 85123"],
}

# Run the Actor and wait for it to finish
run = client.actor("coder_luffy/property-price-tax-history").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print("💾 Check your data here: https://console.apify.com/storage/datasets/" + run["defaultDatasetId"])
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "zpidIds": [
    "88886689",
    "89551133"
  ],
  "listingUrls": [
    "https://www.zillow.com/homedetails/9192-W-Rafael-Dr-Arizona-City-AZ-85123/447510460_zpid/"
  ],
  "addressQueries": [
    "16022 S NAVISKA Road, Arizona City, AZ 85123"
  ]
}' |
apify call coder_luffy/property-price-tax-history --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=coder_luffy/property-price-tax-history",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Property Price Tax History",
        "description": "Property price and tax history scraper that pulls records in bulk by property ID, listing URL, or address.",
        "version": "0.0",
        "x-build-id": "UjqXCBikIwx5xtB6Z"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/coder_luffy~property-price-tax-history/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-coder_luffy-property-price-tax-history",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        },
        "/acts/coder_luffy~property-price-tax-history/runs": {
            "post": {
                "operationId": "runs-sync-coder_luffy-property-price-tax-history",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor and returns information about the initiated run in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/runsResponseSchema"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/acts/coder_luffy~property-price-tax-history/run-sync": {
            "post": {
                "operationId": "run-sync-coder_luffy-property-price-tax-history",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        }
    },
    "components": {
        "schemas": {
            "inputSchema": {
                "type": "object",
                "properties": {
                    "zpidIds": {
                        "title": "ZPID(s)",
                        "type": "array",
                        "description": "Zillow property IDs (ZPIDs), one per line. Each entry is fetched as a separate property.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "listingUrls": {
                        "title": "Listing URL(s)",
                        "type": "array",
                        "description": "Zillow listing URLs, one per line. Each URL is fetched as a separate property.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "addressQueries": {
                        "title": "Address(es)",
                        "type": "array",
                        "description": "Full property addresses, one per line. Each address is looked up as a separate property.",
                        "items": {
                            "type": "string"
                        }
                    }
                }
            },
            "runsResponseSchema": {
                "type": "object",
                "properties": {
                    "data": {
                        "type": "object",
                        "properties": {
                            "id": {
                                "type": "string"
                            },
                            "actId": {
                                "type": "string"
                            },
                            "userId": {
                                "type": "string"
                            },
                            "startedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "finishedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "status": {
                                "type": "string",
                                "example": "READY"
                            },
                            "meta": {
                                "type": "object",
                                "properties": {
                                    "origin": {
                                        "type": "string",
                                        "example": "API"
                                    },
                                    "userAgent": {
                                        "type": "string"
                                    }
                                }
                            },
                            "stats": {
                                "type": "object",
                                "properties": {
                                    "inputBodyLen": {
                                        "type": "integer",
                                        "example": 2000
                                    },
                                    "rebootCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "restartCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "resurrectCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "computeUnits": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "options": {
                                "type": "object",
                                "properties": {
                                    "build": {
                                        "type": "string",
                                        "example": "latest"
                                    },
                                    "timeoutSecs": {
                                        "type": "integer",
                                        "example": 300
                                    },
                                    "memoryMbytes": {
                                        "type": "integer",
                                        "example": 1024
                                    },
                                    "diskMbytes": {
                                        "type": "integer",
                                        "example": 2048
                                    }
                                }
                            },
                            "buildId": {
                                "type": "string"
                            },
                            "defaultKeyValueStoreId": {
                                "type": "string"
                            },
                            "defaultDatasetId": {
                                "type": "string"
                            },
                            "defaultRequestQueueId": {
                                "type": "string"
                            },
                            "buildNumber": {
                                "type": "string",
                                "example": "1.0.0"
                            },
                            "containerUrl": {
                                "type": "string"
                            },
                            "usage": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "integer",
                                        "example": 1
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "usageTotalUsd": {
                                "type": "number",
                                "example": 0.00005
                            },
                            "usageUsd": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "number",
                                        "example": 0.00005
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
