# Seattle Building Permit Leads (`deepztack/seattle-building-permit-leads`) Actor

Extract buyer-ready Seattle building permit lead signals from the official city open-data API.

- **URL**: https://apify.com/deepztack/seattle-building-permit-leads.md
- **Developed by:** [deepztack](https://apify.com/deepztack) (community)
- **Categories:** Business, Real estate, Marketing
- **Stats:** 2 total users, 0 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/platform/actors/running/actors-in-store#pay-per-usage

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

## Seattle Building Permit Leads

Extract fresh Seattle building permit records from the official City of Seattle open-data API and turn them into clean lead signals for construction, roofing, HVAC, solar, remodeling, and local market research workflows.

### What this Actor does

This Actor queries Seattle's official Socrata dataset for building permits and returns normalized records with:

- permit number and type,
- issued/applied/expiry/completion dates,
- project description,
- estimated project cost,
- address and geolocation,
- contractor company name when available,
- source link,
- simple lead category and lead score.

Official source:

- `https://data.seattle.gov/resource/76t5-zqzr.json`

### Who it is for

- roofing, HVAC, solar, and remodeling sales teams,
- construction-market researchers,
- local real-estate and development analysts,
- teams that want official public permit data in clean CSV/JSON form.

### Input

```json
{
  "startDate": "2026-01-01",
  "endDate": "2026-07-03",
  "permitTypes": ["Building", "Mechanical", "Electrical"],
  "keywords": ["solar", "reroof", "re-roof", "hvac", "furnace", "heat pump"],
  "excludedKeywords": ["telecommunication", "communication utility", "antenna", "wireless", "verizon"],
  "minEstimatedCost": 0,
  "maxItems": 100
}
````

All filters are optional except `maxItems`.

### Output example

```json
{
  "permitNumber": "6999999-CN",
  "permitClass": "Building",
  "permitType": "Building",
  "permitTypeDescription": "Alteration",
  "description": "Install rooftop solar panels and electrical equipment",
  "status": "Issued",
  "appliedDate": "2026-06-01",
  "issuedDate": "2026-06-12",
  "expiresDate": "2027-06-12",
  "completedDate": null,
  "estimatedProjectCost": 24500.0,
  "address": "700 5TH AVE",
  "city": "Seattle",
  "state": "WA",
  "zip": "98104",
  "contractorCompanyName": "SUNNY ROOFS LLC",
  "leadCategory": "solar",
  "leadScore": "hot",
  "sourceUrl": "https://cosaccela.seattle.gov/portal/permit/6999999-CN",
  "latitude": 47.6062,
  "longitude": -122.3321,
  "scrapedAt": "2026-07-03T12:00:00+00:00"
}
```

### Lead categories

- `solar`: solar, photovoltaic, PV.
- `roofing`: reroof, re-roof, roof replacement, roof repair, new/existing roof work. Rooftop telecom antenna and communication-utility permits are intentionally excluded by the default input unless you remove those exclusions.
- `hvac`: HVAC, furnace, heat pump, air conditioning, mechanical.
- `remodel`: remodel, alteration, renovation, addition.
- `general`: other permit descriptions.
- `unknown`: missing description.

### Lead score

- `hot`: solar/roofing/HVAC, or estimated project cost at least `$10,000`.
- `warm`: useful address plus contractor or project-cost signal.
- `cold`: missing or low-signal records.

### Responsible use

This Actor uses public permit data from the City of Seattle. Use the output responsibly and comply with applicable laws, source terms, and outreach rules. The Actor intentionally avoids owner/person fields and focuses on permit/project signals and contractor company names when available.

### Limitations

- This is not affiliated with or endorsed by the City of Seattle.
- Lead categories and scores are simple heuristics, not guarantees of buying intent.
- Dataset fields depend on the official source data and may be blank for some records.
- Monitoring/delta mode is not included in v0.1; schedule support can be added after usage signal.

### Development

Run tests:

```bash
python3 -m pytest tests/test_seattle_permits.py -q
```

Run locally with Apify CLI:

```bash
npx apify-cli run
```

### Changelog

- v0.1.0 — Initial Seattle permit lead extraction from official Socrata API.

# Actor input Schema

## `startDate` (type: `string`):

Only include permits issued on or after this date (YYYY-MM-DD).

## `endDate` (type: `string`):

Only include permits issued on or before this date (YYYY-MM-DD). Leave blank for latest records.

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

Optional Seattle permit type filters matching the official permittypemapped field.

## `keywords` (type: `array`):

Optional keywords searched in the permit description, for example solar, roof, hvac, remodel.

## `excludedKeywords` (type: `array`):

Optional keywords to exclude from the permit description. Useful for removing noisy rooftop telecom permits.

## `minEstimatedCost` (type: `integer`):

Only include permits with estimated project cost at or above this amount. Use 0 to disable.

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

Maximum number of permit records to return. Capped at 10000 by the Actor.

## Actor input object example

```json
{
  "startDate": "2026-01-01",
  "permitTypes": [
    "Building",
    "Mechanical",
    "Electrical"
  ],
  "keywords": [
    "solar",
    "reroof",
    "re-roof",
    "hvac",
    "furnace",
    "heat pump"
  ],
  "excludedKeywords": [
    "telecommunication",
    "communication utility",
    "antenna",
    "wireless",
    "verizon"
  ],
  "maxItems": 100
}
```

# 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 = {
    "startDate": "2026-01-01",
    "permitTypes": [
        "Building",
        "Mechanical",
        "Electrical"
    ],
    "keywords": [
        "solar",
        "reroof",
        "re-roof",
        "hvac",
        "furnace",
        "heat pump"
    ],
    "excludedKeywords": [
        "telecommunication",
        "communication utility",
        "antenna",
        "wireless",
        "verizon"
    ],
    "minEstimatedCost": 0,
    "maxItems": 100
};

// Run the Actor and wait for it to finish
const run = await client.actor("deepztack/seattle-building-permit-leads").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 = {
    "startDate": "2026-01-01",
    "permitTypes": [
        "Building",
        "Mechanical",
        "Electrical",
    ],
    "keywords": [
        "solar",
        "reroof",
        "re-roof",
        "hvac",
        "furnace",
        "heat pump",
    ],
    "excludedKeywords": [
        "telecommunication",
        "communication utility",
        "antenna",
        "wireless",
        "verizon",
    ],
    "minEstimatedCost": 0,
    "maxItems": 100,
}

# Run the Actor and wait for it to finish
run = client.actor("deepztack/seattle-building-permit-leads").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 '{
  "startDate": "2026-01-01",
  "permitTypes": [
    "Building",
    "Mechanical",
    "Electrical"
  ],
  "keywords": [
    "solar",
    "reroof",
    "re-roof",
    "hvac",
    "furnace",
    "heat pump"
  ],
  "excludedKeywords": [
    "telecommunication",
    "communication utility",
    "antenna",
    "wireless",
    "verizon"
  ],
  "minEstimatedCost": 0,
  "maxItems": 100
}' |
apify call deepztack/seattle-building-permit-leads --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=deepztack/seattle-building-permit-leads",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Seattle Building Permit Leads",
        "description": "Extract buyer-ready Seattle building permit lead signals from the official city open-data API.",
        "version": "0.1",
        "x-build-id": "yX8nXOgpcLLjkTV6d"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/deepztack~seattle-building-permit-leads/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-deepztack-seattle-building-permit-leads",
                "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/deepztack~seattle-building-permit-leads/runs": {
            "post": {
                "operationId": "runs-sync-deepztack-seattle-building-permit-leads",
                "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/deepztack~seattle-building-permit-leads/run-sync": {
            "post": {
                "operationId": "run-sync-deepztack-seattle-building-permit-leads",
                "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",
                "required": [
                    "maxItems"
                ],
                "properties": {
                    "startDate": {
                        "title": "Start date",
                        "type": "string",
                        "description": "Only include permits issued on or after this date (YYYY-MM-DD)."
                    },
                    "endDate": {
                        "title": "End date",
                        "type": "string",
                        "description": "Only include permits issued on or before this date (YYYY-MM-DD). Leave blank for latest records."
                    },
                    "permitTypes": {
                        "title": "Permit types",
                        "type": "array",
                        "description": "Optional Seattle permit type filters matching the official permittypemapped field.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "keywords": {
                        "title": "Keywords",
                        "type": "array",
                        "description": "Optional keywords searched in the permit description, for example solar, roof, hvac, remodel.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "excludedKeywords": {
                        "title": "Excluded keywords",
                        "type": "array",
                        "description": "Optional keywords to exclude from the permit description. Useful for removing noisy rooftop telecom permits.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "minEstimatedCost": {
                        "title": "Minimum estimated project cost",
                        "minimum": 0,
                        "type": "integer",
                        "description": "Only include permits with estimated project cost at or above this amount. Use 0 to disable."
                    },
                    "maxItems": {
                        "title": "Maximum records",
                        "minimum": 1,
                        "maximum": 10000,
                        "type": "integer",
                        "description": "Maximum number of permit records to return. Capped at 10000 by the Actor."
                    }
                }
            },
            "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
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
