# Texas Building Permits (Austin) (`leadforge-data/texas-building-permits`) Actor

Issued building permits from the City of Austin, Texas public open data, with contractor company, valuation and project details. Owner/applicant personal names, phones and street addresses are off by default.

- **URL**: https://apify.com/leadforge-data/texas-building-permits.md
- **Developed by:** [LeadForge Data](https://apify.com/leadforge-data) (community)
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

Pay per usage

This Actor is paid per platform usage. The Actor is free to use, and you only pay for the Apify platform usage, which gets cheaper the higher subscription plan you have.

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

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
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.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## 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.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## Texas Building Permits (Austin)

Returns issued building, electrical, mechanical, plumbing and driveway permits from the City of Austin, Texas public open data (Socrata dataset 3syk-w9eu), with permit type/class, issue date, reported valuation, contractor company and trade, applicant organization, city, ZIP and project description.

> **Coverage: Austin only.** Other Texas cities are not supported yet (see Limitations).

### When to use

- You need recently issued Austin permits to find active contractors, subcontracting or supply opportunities, or to track construction activity.
- You want permits filtered by issue date, permit type (BP/EP/MP/PP/DS) or minimum valuation.
- You run on a schedule and want only permits not returned before (`newOnly: true`).

### When not to use

- You need permits for Dallas, Houston, San Antonio, Fort Worth or any city other than Austin.
- You need contractor license numbers — Austin's dataset does not publish them (`contractorLicenseNumber` is always null).
- You need property owner or homeowner information — this actor does not output owners; personal names and street addresses are off by default.
- You need pending applications or inspections — only issued permits are returned.
- You need a consumer report or eligibility decision (see FCRA notice below).

### Example input

```json
{ "cities": ["austin"], "dateFrom": "2026-10-01", "dateTo": "2026-10-25", "permitTypes": ["BP"], "minValuation": 100000, "maxItems": 50 }
```

### Example output (one record per permit)

```json
{
  "city": "Austin",
  "permitNumber": "2026-139369 BP",
  "permitType": "BP",
  "permitTypeDescription": "Building Permit",
  "permitClass": "Residential",
  "workClass": "Repair",
  "description": "Express: Re-roof (located in WUI)",
  "issueDate": "2026-10-25",
  "status": "Active",
  "valuation": 1,
  "contractorCompanyName": "Kanga Roof LLC",
  "contractorTrade": "General Contractor",
  "contractorLicenseNumber": null,
  "contractorContactName": null,
  "contractorPhone": null,
  "applicantOrganization": "Kanga Roof LLC",
  "applicantName": null,
  "projectAddress": null,
  "projectCity": "AUSTIN",
  "zip": "78726",
  "isResidential": true,
  "isNewSinceLastRun": null,
  "sourceUrl": "https://abc.austintexas.gov/web/permit/public-search-other?t_detail=1&t_selected_folderrsn=13793679",
  "source": "https://data.austintexas.gov/d/3syk-w9eu"
}
```

### Input parameters

| Parameter | Type | Default | Allowed values / units | Meaning |
|---|---|---|---|---|
| `cities` | array of strings | `["austin"]` | `"austin"` (others cause an error) | Cities to collect |
| `dateFrom` | string | 30 days ago | `YYYY-MM-DD` | Issue-date range start (inclusive) |
| `dateTo` | string | today | `YYYY-MM-DD` | Issue-date range end (inclusive) |
| `sinceDate` | string | none | `YYYY-MM-DD` | Overrides `dateFrom` |
| `permitTypes` | array of strings | empty = all | `BP` building, `EP` electrical, `MP` mechanical, `PP` plumbing, `DS` driveway/sidewalk | Permit types |
| `minValuation` | integer | none | US dollars, ≥0 | Minimum reported total job valuation |
| `maxItems` | integer | `200` | 1–100000 records | Output cap; newest issue date first |
| `newOnly` | boolean | `false` | `true` / `false` | Skip permits returned by previous `newOnly` runs |
| `lookbackDays` | integer | `7` | 0–365 days | Only with `newOnly`: window starts this many days before the previous run |
| `includeStreetAddress` | boolean | `false` | `true` / `false` | Opt-in project street address (often residential) |
| `includeContactNames` | boolean | `false` | `true` / `false` | Opt-in contractor contact and applicant person names |
| `includePhone` | boolean | `false` | `true` / `false` | Opt-in contractor phone |
| `appToken` | string (secret) | none | Socrata app token | Optional; only reduces throttling |

### Output fields

| Field | Type | Meaning |
|---|---|---|
| `city` | string | Source city (`Austin`) |
| `permitNumber` | string | City permit number |
| `permitType` / `permitTypeDescription` | string | e.g. `BP` / `Building Permit` |
| `permitClass` / `workClass` | string | e.g. `Residential` or `Commercial` / `New`, `Remodel`, `Repair` |
| `description` | string | Project description as entered by the city |
| `issueDate` | string `YYYY-MM-DD` | Permit issue date |
| `status` | string | Current permit status (e.g. Active, Final, Expired) |
| `valuation` | number or null | Reported total job valuation, USD (self-reported; may be 0 or 1 as a placeholder) |
| `contractorCompanyName` / `contractorTrade` | string or null | Contractor company (may be a sole proprietor) and trade |
| `contractorLicenseNumber` | null | Not published by Austin |
| `contractorContactName`, `applicantName` | string or null | Null unless `includeContactNames` |
| `contractorPhone` | string or null | Null unless `includePhone` |
| `applicantOrganization` | string or null | Applicant company |
| `projectAddress` | string or null | Null unless `includeStreetAddress` |
| `projectCity`, `zip` | string | Project location |
| `isResidential` | boolean | `true` when the city classes the permit as Residential |
| `isNewSinceLastRun` | boolean or null | `true` in `newOnly` mode, otherwise null |
| `sourceUrl` / `source` | string | City permit page / source dataset |

### Limitations — please read

- **Austin only.** Dallas publishes permits on Socrata but its dataset shows no license/terms, so it is not included; San Antonio and Fort Worth do not use Socrata APIs and were not evaluated for this version.
- **No completeness or accuracy guarantee.** Data comes from public records exactly as the city publishes them and may be delayed, incomplete, corrected later or contain errors. Verify important records with the city.
- Valuations are applicant-reported estimates, not contract values; many small permits show 0 or 1.
- About 5–10% of permits have no contractor company (e.g. owner-builder or not yet assigned).
- `contractorCompanyName` and `applicantOrganization` are published as entered and are sometimes an individual's personal name (e.g. a sole proprietor), even though personal-name fields are off by default.
- No contractor license numbers and no property owner names are available from this source.
- `newOnly` keeps its state in the named key-value store `texas-building-permits-state` in your own Apify account; delete it to reset.
- **`newOnly` lookback gap:** each `newOnly` run only re-checks permits issued from `lookbackDays` before the previous run. Permits the city publishes more than `lookbackDays` after their issue date are missed; raise `lookbackDays` if this matters.
- Each run checks the row count with Socrata `count(*)`; if the fetched rows do not match (e.g. data changed mid-run), or the API errors or its columns change, the run fails with an error instead of returning partial or empty results. Requests are paced at ≥1 s per page.

### Pricing

Currently free to use (Apify platform usage applies per Apify's terms). Any future pricing change will be announced in advance per Apify Store rules.

### Source

Source: City of Austin, Texas — data.austintexas.gov, dataset "Issued Construction Permits" (3syk-w9eu), published as Public Domain. This actor only reads the public Socrata API and does not log in to anything. This actor is not affiliated with or endorsed by the City of Austin.

### Data & compliance notice

**Data & compliance notice.** All data is compiled from public government records (City of Austin open data) and is provided "as is" without warranty of accuracy or completeness. Some records may identify individual sole proprietors. You are solely responsible for how you use this data, including compliance with CAN-SPAM, the TCPA and the National Do Not Call Registry, state telemarketing laws, and privacy laws such as the CCPA/CPRA. Do not use this data for unsolicited robocalls/texts, harassment, or any purpose prohibited by law or by the source agency. This actor is not affiliated with or endorsed by any government agency.

Not for use as a consumer report or for credit, employment, insurance, or housing eligibility decisions under the FCRA.

# Actor input Schema

## `cities` (type: `array`):

Array of strings. Allowed values: "austin" (City of Austin, data.austintexas.gov dataset 3syk-w9eu). Other cities are not supported and cause an error. Default: \["austin"].

## `dateFrom` (type: `string`):

String, date in YYYY-MM-DD format. Start of the permit issue-date range (inclusive). Default: 30 days before today. Ignored when sinceDate is set, and replaced by the incremental window in newOnly mode after the first run.

## `dateTo` (type: `string`):

String, date in YYYY-MM-DD format. End of the issue-date range (inclusive). Default: today.

## `sinceDate` (type: `string`):

String, date in YYYY-MM-DD format. Optional, no default. Shortcut that overrides dateFrom.

## `permitTypes` (type: `array`):

Array of 2-letter permit type codes. Austin values: "BP" building, "EP" electrical, "MP" mechanical, "PP" plumbing, "DS" driveway/sidewalk. Default: empty = all types.

## `minValuation` (type: `integer`):

Integer, US dollars, minimum 0. Optional, no default. Returns only permits whose reported total job valuation is at least this value. Permits with no valuation are excluded when set.

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

Integer, number of output records. Range 1 to 100000. Default: 200. Records are output newest issue date first.

## `newOnly` (type: `boolean`):

Boolean. Default: false. When true, skips permits already returned by previous newOnly runs (state per city in the named key-value store 'texas-building-permits-state' in the caller's account). After the first run the window starts lookbackDays before the previous run. If maxItems is reached the window is not advanced.

## `lookbackDays` (type: `integer`):

Integer, days, 0 to 365. Default: 7. Used only with newOnly: re-checks this many days before the previous run to catch late-published permits; already-returned permits are skipped.

## `includeStreetAddress` (type: `boolean`):

Boolean. Default: false. When true, outputs the project street address in projectAddress; otherwise null. Many permits are for private homes, so this is often a residential address. City and ZIP are always output. The caller is responsible for privacy-law compliance.

## `includeContactNames` (type: `boolean`):

Boolean. Default: false. When true, outputs contractor contact person name and applicant person name; otherwise null. Contractor company and applicant organization are always output.

## `includePhone` (type: `boolean`):

Boolean. Default: false. When true, outputs the contractor phone in contractorPhone; otherwise null. Sole proprietors' numbers may be personal. The caller is responsible for TCPA/DNC/CCPA compliance.

## `appToken` (type: `string`):

String, secret. Optional, no default. A free Socrata app token for the city portal; only reduces throttling and does not change results.

## Actor input object example

```json
{
  "cities": [
    "austin"
  ],
  "maxItems": 200,
  "newOnly": false,
  "lookbackDays": 7,
  "includeStreetAddress": false,
  "includeContactNames": false,
  "includePhone": false
}
```

# Actor output Schema

## `results` (type: `string`):

No description

# 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 = {
    "cities": [
        "austin"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("leadforge-data/texas-building-permits").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 = { "cities": ["austin"] }

# Run the Actor and wait for it to finish
run = client.actor("leadforge-data/texas-building-permits").call(run_input=run_input)

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

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

```

## CLI example

```bash
echo '{
  "cities": [
    "austin"
  ]
}' |
apify call leadforge-data/texas-building-permits --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,leadforge-data/texas-building-permits"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/7Z3PBb1YMaYpLnPrD/builds/GulodcV5eKGuad078/openapi.json
