# Dallas County Property Records Scraper (`automation-lab/dallas-county-property-assessment-scraper`) Actor

Search DCAD by owner, address, account, or business and export Dallas County property ownership, assessed values, exemptions, characteristics, and history.

- **URL**: https://apify.com/automation-lab/dallas-county-property-assessment-scraper.md
- **Developed by:** [Stas Persiianenko](https://apify.com/automation-lab) (community)
- **Categories:** Real estate
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

Pay per event

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 web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
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.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — 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

## Dallas County Property Records Scraper

Search public Dallas Central Appraisal District (DCAD) records and turn them into structured, source-linked data. The Actor searches by owner, street address, exact account number, or business name and extracts ownership, assessed values, exemptions, building characteristics, estimated taxes, and annual value history.

It is designed for recurring property research and portfolio monitoring where manually copying records from a dallascad property search is too slow or inconsistent.

### What can you do with this Actor?

- Find Dallas County property records by owner or business name.
- Resolve an address to its 17-character DCAD account number.
- Retrieve one known residential, commercial, or business-personal-property account.
- Export current certified improvement, land, and market values.
- Compare annual assessed-value history for repeat research.
- Feed source URLs and retrieval timestamps into due-diligence workflows.

The Actor reads the public appraisal district website. It does not submit protests, access accounts, provide title evidence, or replace an official tax bill.

### Who is it for?

**Real-estate analysts** can assemble comparable appraisal records and value histories.

**Investors and acquisition teams** can screen owners and parcels before deeper title, lien, or physical due diligence.

**Tax and appraisal professionals** can normalize public DCAD account details for review.

**Data engineers** can schedule repeat searches and send typed records to a warehouse, spreadsheet, webhook, or BI tool.

### Why use it instead of copying DCAD pages?

DCAD separates search results, account details, and history across several pages. This Actor follows those pages, deduplicates accounts, normalizes money fields to numbers, and preserves the source URL.

A single dataset row can include:

- parcel/account identity;
- current owner and public mailing address;
- property and business names;
- certified values and estimated taxes;
- legal description and deed transfer date shown by DCAD;
- residential building characteristics where available;
- annual market-value history.

### Supported Dallas CAD search modes

| Mode | Required input | Best for |
| --- | --- | --- |
| `account` | `accountNumber` | One exact 17-character DCAD account |
| `owner` | `ownerName` | Parcels associated with an owner-name prefix |
| `address` | `streetName`; optional number/direction/city | Properties on a Dallas County street |
| `business` | `businessName` | Business personal property records |
| Detail URLs | `startUrls` | Reprocessing known DCAD account-detail pages |

Owner and business searches follow DCAD's prefix and `%` wildcard behavior. Keep broad searches bounded with `maxItems`.

### Input parameters

| Field | Type | Default | Description |
| --- | --- | --- | --- |
| `searchType` | string | `account` | `account`, `owner`, `address`, or `business` |
| `accountNumber` | string | — | Exact 17-character account identifier |
| `ownerName` | string | — | Owner name prefix, 2–25 characters |
| `businessName` | string | — | Business name prefix, 2–34 characters |
| `addressNumber` | string | — | Optional numeric street number |
| `streetDirection` | string | empty | Optional N, S, E, W, NE, NW, SE, or SW |
| `streetName` | string | — | Street name as used by DCAD; omit the number |
| `cityCode` | string | empty | Optional DCAD numeric city code |
| `startUrls` | array | empty | DCAD `AcctDetailRes`, `AcctDetailCom`, or `AcctDetailBPP` URLs |
| `maxItems` | integer | `25` | Maximum unique accounts, from 1 to 500 |
| `includeHistory` | boolean | `true` | Include annual certified value history |

When `startUrls` is present, search fields are ignored. Unsupported domains and non-detail DCAD URLs fail closed.

### Get started

1. Open the Actor input page.
2. Choose a search mode.
3. Enter the matching owner, address, account, or business field.
4. Set a practical `maxItems` limit.
5. Keep **Include assessed-value history** enabled when year-over-year values matter.
6. Click **Start**.
7. Open the Dataset tab to preview, download, or integrate the records.

Exact account example:

```json
{
  "searchType": "account",
  "accountNumber": "007554000K0020000",
  "maxItems": 1,
  "includeHistory": true
}
```

Owner portfolio example:

```json
{
  "searchType": "owner",
  "ownerName": "TARGET CORP",
  "maxItems": 25,
  "includeHistory": true
}
```

### Output fields

| Field | Meaning |
| --- | --- |
| `accountNumber` | Stable DCAD appraisal account identifier |
| `propertyType` | `RESIDENTIAL`, `COMMERCIAL`, or `BPP` |
| `propertyAddress`, `city` | Public situs address and search-result city |
| `ownerName`, `ownerMailingAddress` | Current public tax-roll ownership fields |
| `businessName` | DBA name for BPP accounts, when shown |
| `legalDescription` | Combined public legal-description lines |
| `deedTransferDate` | Date displayed by DCAD, not independently verified |
| `appraisalYear` | Current certified appraisal year |
| `improvementValue`, `landValue`, `marketValue` | Numeric certified values in USD |
| `totalEstimatedTaxes` | DCAD courtesy estimate, not a bill |
| `exemptions` | Public exemption labels/details |
| `building` | Available building and land characteristics |
| `valueHistory` | Annual improvement, land, market, and capped values |
| `mapUrl`, `sourceUrl` | Public DCAD evidence links |
| `scrapedAt` | UTC retrieval timestamp |

Fields are `null` when DCAD displays N/A or does not provide that field for the account type.

### Example output

```json
{
  "accountNumber": "007554000K0020000",
  "propertyType": "COMMERCIAL",
  "propertyAddress": "39739 LBJ FWY",
  "city": "DALLAS",
  "ownerName": "TARGET CORP",
  "marketValue": 7591090,
  "landValue": 2614390,
  "improvementValue": 4976700,
  "appraisalYear": 2026,
  "totalEstimatedTaxes": 169031.56,
  "exemptions": [],
  "valueHistory": [
    {
      "year": 2026,
      "improvementValue": 4976700,
      "landValue": 2614390,
      "marketValue": 7591090,
      "homesteadCappedValue": null
    }
  ],
  "sourceUrl": "https://www.dallascad.org/AcctDetailCom.aspx?ID=007554000K0020000",
  "scrapedAt": "2026-08-03T02:07:38.066Z"
}
```

Values above are a point-in-time public example and may change when DCAD certifies or updates records.

### How much does it cost to extract Dallas County property records?

The Actor uses pay-per-event pricing:

- **$0.005** once per run;
- one `item` event per successfully saved property record;
- per-record price depends on your Apify plan tier.

The BRONZE item price is **$0.00384 per property record**. Other active tiers range from **$0.004416** on FREE to **$0.0010752** on DIAMOND.

Example BRONZE totals:

| Records | Start | Items | Total |
| ---: | ---: | ---: | ---: |
| 1 | $0.005 | $0.00384 | $0.00884 |
| 10 | $0.005 | $0.03840 | $0.04340 |
| 100 | $0.005 | $0.38400 | $0.38900 |

No item event is charged for an empty, rejected, duplicate, or failed record. Platform compute usage may also apply according to your Apify plan.

### Schedule recurring property research

Use an Apify Schedule to rerun a stable owner, street, or account input. Send each completed dataset to your own storage, then compare records by `accountNumber` and `appraisalYear`.

The Actor returns snapshots; it does not maintain a hidden historical database or claim which field changed. Your workflow should retain prior datasets when change detection is required.

### Export to spreadsheets and data pipelines

The default dataset supports JSON, CSV, Excel, XML, and RSS exports. Common patterns include:

- append owner-search results to Google Sheets;
- join `accountNumber` to an internal parcel table;
- load annual `valueHistory` arrays into a warehouse;
- trigger a webhook after scheduled research;
- use Make or Zapier to route new dataset rows.

Treat `accountNumber` as the source identity and `scrapedAt` as snapshot metadata.

### Run with the Apify API

Replace `YOUR_TOKEN` with an Apify API token.

#### cURL

```bash
curl -X POST \
  "https://api.apify.com/v2/acts/automation-lab~dallas-county-property-assessment-scraper/runs?token=YOUR_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"searchType":"owner","ownerName":"TARGET CORP","maxItems":10}'
```

#### JavaScript

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

const client = new ApifyClient({ token: process.env.APIFY_TOKEN });
const { defaultDatasetId } = await client
  .actor('automation-lab/dallas-county-property-assessment-scraper')
  .call({ searchType: 'account', accountNumber: '007554000K0020000', maxItems: 1 });
const { items } = await client.dataset(defaultDatasetId).listItems();
console.log(items);
```

#### Python

```python
from apify_client import ApifyClient

client = ApifyClient('YOUR_TOKEN')
run = client.actor('automation-lab/dallas-county-property-assessment-scraper').call(
    run_input={'searchType': 'business', 'businessName': 'TARGET', 'maxItems': 10}
)
items = client.dataset(run['defaultDatasetId']).list_items().items
print(items)
```

### Use with Apify MCP

Add this Actor to Claude Code:

```bash
claude mcp add --transport http apify \
  "https://mcp.apify.com?tools=automation-lab/dallas-county-property-assessment-scraper"
```

#### Claude Desktop, Cursor, and VS Code setup

Use this equivalent JSON configuration in Claude Desktop, Cursor, or VS Code:

```json
{
  "mcpServers": {
    "apify": {
      "url": "https://mcp.apify.com?tools=automation-lab/dallas-county-property-assessment-scraper"
    }
  }
}
```

Example prompts:

- “Find up to 10 Dallas County appraisal records owned by TARGET CORP.”
- “Fetch DCAD account 007554000K0020000 with annual value history.”
- “Export the returned Dallas County records as a CSV-ready table.”

### Limits and failure behavior

- DCAD search pages return up to 10 results per page; the Actor follows pages until `maxItems`.
- The Actor uses direct public HTTP and does not require a proxy or login.
- Transient network, 429, and server failures are retried with bounded backoff.
- Unexpected HTML or exhausted retries fail the run rather than returning a misleading empty success.
- A valid search with no matches succeeds with zero dataset rows.
- Detail URL mode validates the DCAD hostname, HTTPS, page type, and account shape.
- Broad owner, business, and street queries can match many accounts; use a responsible limit.

### Data interpretation

DCAD describes the site as informational. Values, exemptions, estimated taxes, owners, and transfer dates can be revised or corrected. Estimated taxes are not official bills. Owner and legal-description data are not a title report.

For decisions involving ownership, liens, taxes due, protest deadlines, or legal rights, verify against the responsible county clerk, tax office, appraisal district, and qualified professionals.

### Legality and responsible use

Public accessibility does not remove your obligations. Use records for lawful property research, respect applicable privacy and anti-discrimination rules, avoid harassment, and apply appropriate retention and access controls.

Do not use this Actor to make automated eligibility, housing, credit, insurance, employment, or other high-impact decisions without the required legal basis and human review.

### Troubleshooting

#### My address search returns no records

Use the street name as DCAD stores it and omit the street number from `streetName`. For example, provide `addressNumber: "39739"` and `streetName: "LBJ"`, not `streetName: "39739 LBJ FWY"`. Try omitting the optional number or city code to broaden the source search.

#### My owner or business result set is too broad

Enter more of the source name, then lower `maxItems`. DCAD supports `%` as a wildcard, so avoid leading wildcards unless you intentionally need a broad match.

#### Why are some values null?

DCAD displays N/A for some exempt properties and omits fields that do not apply to BPP, residential, or commercial records. The Actor preserves those distinctions as null instead of inventing zero.

#### Does the Actor monitor changes automatically?

No. Schedule repeated runs and retain prior datasets. Compare rows by `accountNumber`; use `scrapedAt` to identify each snapshot.

### FAQ

#### Does this cover all of Texas?

No. It targets Dallas Central Appraisal District public records for Dallas County, Texas.

#### Can I search the Dallas CAD map?

The Actor returns the public parcel `mapUrl` for each resolved account. It does not scrape arbitrary map bounds or geometries.

#### Does it include tax payment status or amount due?

No. It returns DCAD appraisal values and the courtesy estimated-tax total. It does not claim current tax-office payment or delinquency status.

#### Are history values separate billable rows?

No. History is nested in the same property record and has no separate charge event.

#### Can I supply known account pages?

Yes. Add public DCAD residential, commercial, or BPP account-detail URLs to `startUrls`.

### Related Actors

For another county-specific public appraisal workflow, see the [Cook County Assessor Parcel Scraper](https://apify.com/automation-lab/cook-county-assessor-parcel-scraper). County systems use different identifiers and schemas, so use the Actor for the jurisdiction you need.

# Actor input Schema

## `searchType` (type: `string`):

Select the DCAD search route. Not required when Start URLs are supplied.

## `accountNumber` (type: `string`):

Exact 17-character appraisal account number used for an account search.

## `ownerName` (type: `string`):

At least the first two letters of a property owner's name. DCAD percent wildcards are supported.

## `businessName` (type: `string`):

At least the first two letters of a business name. DCAD percent wildcards are supported.

## `addressNumber` (type: `string`):

Optional street number for an address search, such as 39739.

## `streetDirection` (type: `string`):

Optional directional prefix used by DCAD.

## `streetName` (type: `string`):

Street name without the street number, such as LBJ FWY or PLEASANT RUN RD.

## `cityCode` (type: `string`):

Optional numeric city code from the DCAD address search. Leave blank to search all Dallas County cities.

## `startUrls` (type: `array`):

Optional public AcctDetailRes, AcctDetailCom, or AcctDetailBPP URLs. When supplied, search fields are ignored.

## `maxItems` (type: `integer`):

Stop after this many unique DCAD accounts. Search result pages contain up to 10 accounts each.

## `includeHistory` (type: `boolean`):

Fetch the account history page and include annual improvement, land, market, and homestead-capped values.

## Actor input object example

```json
{
  "searchType": "account",
  "accountNumber": "007554000K0020000",
  "streetDirection": "",
  "maxItems": 1,
  "includeHistory": true
}
```

# Actor output Schema

## `overview` (type: `string`):

Structured Dallas County appraisal accounts with ownership, assessed values, characteristics, exemptions, history, and DCAD source links.

# 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 = {
    "searchType": "account",
    "accountNumber": "007554000K0020000",
    "maxItems": 1,
    "includeHistory": true
};

// Run the Actor and wait for it to finish
const run = await client.actor("automation-lab/dallas-county-property-assessment-scraper").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 = {
    "searchType": "account",
    "accountNumber": "007554000K0020000",
    "maxItems": 1,
    "includeHistory": True,
}

# Run the Actor and wait for it to finish
run = client.actor("automation-lab/dallas-county-property-assessment-scraper").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 '{
  "searchType": "account",
  "accountNumber": "007554000K0020000",
  "maxItems": 1,
  "includeHistory": true
}' |
apify call automation-lab/dallas-county-property-assessment-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=automation-lab/dallas-county-property-assessment-scraper",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/rzwkUaH3RXOSEVbpM/builds/wR92l95be7PblA9ju/openapi.json
