# Building Permits Scraper — Contractor & Construction Leads (`intelscrape/building-permit-scraper`) Actor

Multi-city building permits from city/county open-data APIs. cities\[] + keyword. Contractor names, addresses, work type. Pairs with Skip Trace / UCC / Code Violations.

- **URL**: https://apify.com/intelscrape/building-permit-scraper.md
- **Developed by:** [IntelScrape](https://apify.com/intelscrape) (community)
- **Categories:** Real estate, Lead generation
- **Features:** Limited permissions
- **Stats:** 113 total users, 2 monthly users, 100.0% runs succeeded, 4 bookmarks
- **User rating**: 1.00 out of 5 stars

## Pricing

from $5.00 / 1,000 permits

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

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

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

## Building Permit Scraper — Roofing, Solar & HVAC Leads

![Actor Banner](https://api.apify.com/v2/key-value-stores/PyvJzfQg02FD3RYhd/records/building-permit-banner.png)

> 🇨🇳 **中文简介 (Chinese — China & Singapore):**
> 想第一时间拿到美国城市新发建筑许可做屋顶/太阳能/暖通拓客？本 Actor 直连市政开放数据（Socrata / Accela / Tyler / ArcGIS），支持 `cities[]` 多城 + `keyword`（roof / solar / HVAC）过滤，返回许可类型、造价、地址以及门户公开的业主/承包商姓名。电话与邮箱为可选 enrichment（**默认开启**；仅成功命中时另计 +$0.05；不保证每条都有电话/邮箱。设 enrichContractors=false 可避免 enrichment 费用）。按交付许可计费，无需 API Key。现在运行，把 HOT 许可线索同步到表格或 AI 工作流。

> 🇸🇬 **Ringkasan Melayu (Singapore):**
> Mahukan permit bina baharu (atap, solar, HVAC) dari bandar AS? Actor ini tarik data terbuka bandar dengan `cities[]` + penapis `keyword`. Jenis permit, nilai, alamat dan nama pemilik/kontraktor bila diterbitkan. Telefon/e-mel ialah enrichment pilihan (**dinyalakan secara lalai**; +$0.05 hanya bila berjaya; tidak dijamin. Set enrichContractors=false untuk elak kos enrichment). Bayar per permit — tiada API key. Ideal untuk kontraktor dan lead pembinaan. Cuba di Apify.

#### 🤖 NEW: Connect This To Your AI! (MCP)

Want permit leads **and** owner-phone enrichment inside Claude, Cursor, or ChatGPT? Use the **[Skip Trace MCP Server](https://apify.com/intelscrape/skip--trace)** — Model Context Protocol access to **Building Permit Scraper** + **Skip Trace PRO** in one AI workflow. Ask your agent to multi-city scan permits, filter by `keyword`, then skip-trace owner phones hands-free.

#### 🏆 Featured Bots by IntelScrape

1. **[Building Permit Scraper](https://apify.com/intelscrape/building-permit-scraper)** — Roofing, Solar & HVAC Leads
2. **[Skip Trace PRO](https://apify.com/intelscrape/skip-trace-pro)** — Name, Address, Phone & Email People Lookup
3. **[Code Violations Scraper](https://apify.com/intelscrape/code-violations)** — City Code Enforcement Leads
4. **[TruePeopleSearch Scraper](https://apify.com/intelscrape/truepeoplesearch-scraper)** — Phone & Email Matches
5. **[TikTok Scraper](https://apify.com/intelscrape/tiktok-scraper)** — Emails & Influencer Leads
6. **[Google Maps No-Website Leads](https://apify.com/intelscrape/website-Leads)** — Local Businesses Without a Website
7. **[UCC Lien Scraper](https://apify.com/intelscrape/ucc-lien-scraper)** — Florida & New Jersey Filings
8. **[Skip Trace MCP Server](https://apify.com/intelscrape/skip--trace)** — Use Skip Trace inside Claude, Cursor, ChatGPT

***

⚡ **Use this Actor in n8n — no code**

1. Add the official **Apify** node in n8n.
2. Connect your Apify API token.
3. Run Actor ID: `IntelScrape/building-permit-scraper`.

***

![price](https://img.shields.io/badge/price-$5.00_/_1K-e83e8c) ![billing](https://img.shields.io/badge/billing-pay_per_permit-2ea44f) ![API key](https://img.shields.io/badge/API_key-not_required-blue) ![coverage](https://img.shields.io/badge/coverage-US_municipal_open_data-8a2be2) ![sources](https://img.shields.io/badge/sources-Socrata_·_Accela_·_Tyler_·_ArcGIS-blue)

**Contractor / solar / roofing lead buyers:** pull newly issued **building permits** from city/county open-data portals — not fragile homepage scrapers.\
Filter with **`cities[]`** (multi-city pack) + **`keyword`** (`roof`, `solar`, `HVAC`, `pool`, …). Owner + contractor **names** when the portal publishes them. Phone & email via **optional** enrichment (**ON by default**, +$0.05 only on successful hits — phones/emails are **not guaranteed**). Set `enrichContractors: false` to avoid enrichment spend. HOT/WARM/COLD lead score, incremental mode, dedupe.\
**≈ $5 / 1,000 permits. No API key required.**

> **Honest coverage & billing (read this):** Sources are municipal **open-data** APIs (Socrata / Accela / Tyler / ArcGIS) where available — **not** every US city. You are billed **$0.005 per delivered permit** plus **$0.05 actor start**. Optional `contractor-enrichment` (+$0.05) fires only when a phone/email/website is actually delivered (**phones are opt-in**, never guaranteed). Enrichment needs the owner backend token; if unavailable you still get public-record permit fields. Use `demoMode` for a fictional sample.

***

> 🧭 Built for **roofing contractors, solar installers, HVAC / remodel outreach, materials suppliers, lenders, and commercial construction sales.**

> ⭐ **Store rating is driven by daily power users.** Please [leave an honest review](https://apify.com/intelscrape/building-permit-scraper) if this saves you time — we do **not** claim a fake 5.0★.

> ⚖️ **Lawful business use only.** Returns information already published on government open-data portals. You are liable for how you use it.

> 📌 *Names, phones, and emails in this README are **fictional examples** for illustration.*

***

### 🔗 Permit → Owner → Contact: a 3-step lead pipeline (for roofing, solar, HVAC & real-estate sales teams)

Three IntelScrape Actors chain into one workflow: find who just pulled a permit, then find a way to reach them. Each step is its own pay-per-event run, so you only pay for the steps you use.

| Step | Actor | What it gives you |
| :--- | :--- | :--- |
| **Building Permit Scraper** (you are here) | 1. New permits by city, trade and value: address, contractor, owner name where the city publishes it |
| [Skip Trace PRO](https://apify.com/intelscrape/skip-trace-pro) | 2. Turn a name or address from step 1 into a person record (address history, relatives, phone/email where available) |
| [TruePeopleSearch Scraper](https://apify.com/intelscrape/truepeoplesearch-scraper) | 3. Second-source phone/email check for the same person, so you can compare two sources before you call |

**How to run it (no code):**

1. Run Building Permit Scraper with e.g. `{"city":"Austin","permitType":"Roofing","timePeriod":"Last 30 days","maxResults":25,"enrichContractors":false}` and export the dataset.
2. Feed the owner names and addresses into Skip Trace PRO, one `First Last, City ST` query per line.
3. Send any person who still has no phone or email to TruePeopleSearch Scraper.
4. Keep the rows that two sources agree on; those are your call list.

Apify integrations (n8n, Make, Zapier, Google Sheets) can pass the dataset from one step to the next with no code. Results depend on what each public source returns for a given person; rows with no phone or email are not guaranteed.

### 🕵️‍♂️ Why Choose Us vs. "Cheaper" Competitors?

| Feature | Building Permit Scraper | Thin HTML scrapers |
| :--- | :--- | :--- |
| **Sources** | Civic open-data APIs | Brittle city homepages |
| **Buyer filters** | `cities[]` + `keyword` (roof/solar/HVAC) | One city dump |
| **Billing** | Pay per delivered permit | Pay for empty / junk rows |
| **Contacts** | Optional enrichment (**ON by default**; phones/emails not guaranteed) | Oversell “always phones” |
| **Ops** | Incremental + HOT/WARM/COLD | One-shot dumps |

***

### Quick start (single city)

```json
{
  "city": "Austin",
  "state": "TX",
  "permitType": "Roofing",
  "minCost": 5000,
  "maxResults": 50,
  "timePeriod": "Last 30 days",
  "enrichContractors": true
}
```

**Demo (fictional, no live scrape):**

```json
{ "demoMode": true }
```

Legacy aliases still accepted: `targetLocation` (“Austin, TX”), `minProjectCost`, `max_results`.

### Multi-city pack + filters (`cities[]` + `keyword` + dates + `zipCodes`)

Scan several US cities in **one run** with optional free-text filtering — built for contractor / solar / roofing lead packs.

```json
{
  "cities": ["Chicago", "Austin", "Miami"],
  "keyword": "solar",
  "maxResults": 100,
  "timePeriod": "Last 30 days",
  "enrichContractors": true
}
```

| Input | What it does |
| :--- | :--- |
| **`cities[]`** | List of US city names (e.g. `["Chicago","Austin"]`). Each city is discovered separately. Caps via `maxCities` (default 25 for this list). Leave empty to use single `city`. |
| **`keyword`** | Optional case-insensitive filter applied after scrape on description / permit type / contractor / address (`roof`, `solar`, `HVAC`, `pool`, …). |
| **`dateFrom` / `dateTo`** | Optional `YYYY-MM-DD` bounds. When either is set, they override the Time period dropdown window. |
| **`zipCodes[]`** | Optional post-scrape ZIP allow-list (normalized to 5-digit). Empty = no ZIP filter. |

Single-city mode still works with `city` + `state` as before.

***

### Contractor rollup (new)

- **`enableContractorRollup`** (default ON) — groups delivered permits by contractor (top 25) + one `contractor-rollup-summary` row with Soft CTA → [Skip Trace PRO](https://apify.com/intelscrape/skip-trace-pro) / [UCC Lien Scraper](https://apify.com/intelscrape/ucc-lien-scraper) / [Code Violations](https://apify.com/intelscrape/code-violations). Optional `contractor-rollup` PPE when the Store event is live (charged once per summary).

### Enrichment honesty (read this)

- Live input schema: **`enrichContractors` defaults to `true` (ON by default)**.
- Phones / emails / websites are **best-effort and not guaranteed** on every permit row.
- You are billed **+$0.05** (`contractor-enrichment`) **only on successful hits**.
- Set **`enrichContractors: false`** to scrape permits without enrichment spend.

### Soft CTA — next steps after permits (SOFTCTA_LINKS_BUILDING_PERMIT_3_7_50)

Every permit row (and contractor rollup) includes a free `softCta` mesh — no extra PPE:

- [Google Maps Email Extractor](https://apify.com/intelscrape/google-maps-email-extractor) — nearby business emails
- [Google Maps No-Website Leads](https://apify.com/intelscrape/website-Leads) — contractors/owners without sites
- [Website Contact Scraper](https://apify.com/intelscrape/contact-info-scraper) — emails/phones from contractor sites
- [Code Violations](https://apify.com/intelscrape/code-violations) — distress signals in the same markets
- [UCC Lien Scraper](https://apify.com/intelscrape/ucc-lien-scraper) — financing / secured-party intel
- [Google Reviews Scraper](https://apify.com/intelscrape/google-reviews-scraper-the-best) — contractor / project reputation
- [Yelp Reviews Scraper](https://apify.com/intelscrape/yelp-reviews-scraper) — local review intel
- [TruePeopleSearch](https://apify.com/intelscrape/truepeoplesearch-scraper) / [Skip Trace PRO](https://apify.com/intelscrape/skip-trace-pro) — people enrichment (links only)

### What you get (per permit)

- Permit number, status, issue date, description
- Estimated project value (when published)
- Address / parcel fields when published
- Owner & contractor **name** when published
- `leadScore`: HOT / WARM / COLD
- `contractor_phone` / `contractor_email` / `contractor_website` only if enrichment succeeded
- `isDemo` + `notice` when `demoMode` is on

***

### Pricing (PPE — unchanged)

| Event | Price | When it fires |
| :--- | ---: | :--- |
| Actor start | **$0.05** | Once per run |
| Permit (`apify-default-dataset-item`) | **$0.005** | Each delivered permit |
| Contractor enrichment | **$0.05** | Only when phone/email/website delivered |

***

### Legal

Lawful B2B use of government open-data publications only. Not a consumer reporting agency.

#### Fresh leads & scoring

- `lastNDays` / `freshLeadsOnly` / `onlyNewResults`
- Numeric `leadScore` 0–100 + `leadReasons[]` + `leadGrade`
- `filtersApplied` stamp + optional `socrataAppToken`
- Soft CTA → Skip Trace PRO / Code Violations / UCC Lien

***

> ⭐ **Store review**
>
> Got useful permits from a live city run? A short Store review helps other contractors find this Actor — thanks.

# Actor input Schema

## `city` (type: `string`):

US city name (e.g. Chicago, Austin, Miami). Strongly recommended — improves city labeling and portal selection. Legacy alias: targetLocation ("Austin, TX").

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

Optional list of US city names to scrape in one run (e.g. \["Chicago", "Austin", "Miami"]). When non-empty, each city is discovered separately and extractTop100 / extractStateMatrix are ignored. Cap with maxCities (default 25 for this list). Leave empty to use single City above.

## `extractTop100` (type: `boolean`):

Bypass manual search and autonomously scan all 100 largest municipal databases sequentially using the Universal Discovery Core.

## `extractStateMatrix` (type: `boolean`):

Execute sequentially across all 50 US States autonomously extracting Socrata instances and injecting Walled-Garden targets. Extremely intensive.

## `state` (type: `string`):

Select a US State. Highly recommended for finding smaller cities.

## `permitType` (type: `string`):

What kind of permits are you looking for?

## `keyword` (type: `string`):

Optional free-text filter applied after scrape (case-insensitive). Matches permit description, permit type, contractor, or address — e.g. roof, solar, HVAC, pool. Rival-parity for keyword construction leads. Leave empty for no extra filter.

## `zipCodes` (type: `array`):

Optional list of ZIP codes to keep after scrape (e.g. \["60601","60602"]). Normalized to 5-digit when possible. Empty/absent = no ZIP filter.

## `timePeriod` (type: `string`):

How far back do you want to search?

## `lastNDays` (type: `integer`):

Convenience date window — e.g. 30 = permits issued in the last 30 days (rival lastNDays / daysBack). Overrides Time period. Explicit Date from / Date to win if set. freshLeadsOnly sets this to 30 when empty.

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

Optional start date (YYYY-MM-DD). When set, overrides the Time period dropdown window. Leave empty to use Time period.

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

Optional end date (YYYY-MM-DD). When set with Date from, overrides the Time period dropdown. Leave empty for open-ended.

## `minCost` (type: `integer`):

Only show permits with estimated cost above this amount.

## `maxCost` (type: `integer`):

Optional. Keep only permits with estimatedValue ≤ this amount (rival parity with minCost). Leave empty for no upper bound.

## `contractorContains` (type: `string`):

Optional case-insensitive substring match on contractor / applicant name after scrape (e.g. "Apex", "Roofing LLC"). Leave empty for no contractor filter.

## `tradeCategories` (type: `array`):

Optional multi trade filter. Keep permits matching ANY category (OR). Aliases map to taxonomy: Roofing, Solar, HVAC/Mechanical, Electrical, Plumbing, Demolition, New Construction, Renovation, Addition/ADU, Fire Protection, Commercial, Sign. When non-empty, preferred over single Permit type for keep-filter.

## `onlyNewConstruction` (type: `boolean`):

When true, keep only New Construction / new-build style permits (uses classifyPermitType + type keywords). Default false.

## `maxResults` (type: `integer`):

Maximum permits to return (min 1). Each delivered permit bills $0.005 (PPE). Start small (10–50) to validate city coverage before scaling.

## `addressFilter` (type: `string`):

Filter by street name (e.g., Broadway, Main St).

## `incrementalMode` (type: `boolean`):

If enabled, the scraper remembers past runs and only returns newly discovered permits.

## `freshLeadsOnly` (type: `boolean`):

When true, equivalent to lastNDays=30 if lastNDays not set, or tightens to 30 if lastNDays > 30 (inexhaustible_glass parity). Explicit dateFrom/dateTo still win.

## `minLeadScore` (type: `string`):

Optional post-scrape floor on categorical leadScore: HOT (only HOT), WARM (WARM+HOT), COLD (all). Output also includes leadScoreNumeric (0–100) and daysSinceIssue.

## `onlyNewResults` (type: `boolean`):

Alias for Incremental Mode — only return newly discovered permits since the last run (4l3c onlyNewResults parity). Prefer Incremental Mode checkbox; both enable the same behavior.

## `enrichContractors` (type: `boolean`):

ON by default. When ON, best-effort Google Maps lookup for contractor phone/email/website. Only succeeds when the owner backend token is configured. Each successful enrichment costs an extra $0.05 (contractor-enrichment event) on top of the $0.005 per permit. Permit rows are always public-record fields (address, value, contractor NAME when the portal provides it) — phones/emails are NOT guaranteed.

## `maxContactsToEnrich` (type: `integer`):

Max contractor enrichments per run when enrichment is ON. Each hit bills $0.05. Default 50 keeps costs predictable.

## `enableCensusGeocoding` (type: `boolean`):

If a city portal fails to provide latitude/longitude, automatically geocode the address using the US Census Bureau API.

## `enableContractorRollup` (type: `boolean`):

ON by default. Groups delivered permits by contractor (top 25 by count then valuation) and pushes contractor-rollup rows plus one contractor-rollup-summary. Soft CTA links Skip Trace PRO / UCC Lien / Code Violations. When the Store PPE event is live, one contractor-rollup charge applies to the summary (not per contractor row).

## `webhookUrl` (type: `string`):

Optional webhook URL to POST results to when the run completes.

## `csvUrl` (type: `string`):

Provide a link to a raw CSV file (e.g. Google Sheets Export) containing 'City' or 'Location' headers to process huge lists automatically.

## `maxCities` (type: `integer`):

When searching all cities: how many city portals to query.

## `maxPerCity` (type: `integer`):

Maximum records to fetch from each city portal.

## `stateKey` (type: `string`):

Optional. Names the saved state for incremental mode so you can run several independent schedules from one Actor. Leave blank unless you need more than one.

## `socrataAppToken` (type: `string`):

Optional free token from a city open-data portal — raises Socrata rate limits on large runs. Leave empty for normal use.

## `demoMode` (type: `boolean`):

Returns one clearly FICTIONAL sample permit so you can inspect the Output schema. No live municipal scrape. Not a real lead.

## Actor input object example

```json
{
  "city": "Chicago",
  "cities": [],
  "extractTop100": false,
  "extractStateMatrix": false,
  "state": "IL",
  "permitType": "All Types",
  "keyword": "",
  "zipCodes": [],
  "timePeriod": "Last 30 days",
  "lastNDays": 30,
  "dateFrom": "",
  "dateTo": "",
  "contractorContains": "",
  "tradeCategories": [],
  "onlyNewConstruction": false,
  "maxResults": 12,
  "incrementalMode": false,
  "freshLeadsOnly": false,
  "onlyNewResults": false,
  "enrichContractors": false,
  "maxContactsToEnrich": 50,
  "enableCensusGeocoding": true,
  "enableContractorRollup": false,
  "maxCities": 50,
  "maxPerCity": 500,
  "demoMode": false
}
```

# Actor output Schema

## `city` (type: `string`):

City name where the permit was issued

## `state` (type: `string`):

US state abbreviation

## `permitNumber` (type: `string`):

Official permit reference number

## `address` (type: `string`):

Property street address

## `permitType` (type: `string`):

Classified permit category (NEW_CONSTRUCTION, RENOVATION, DEMOLITION, etc.)

## `estimatedValueFormatted` (type: `string`):

Dollar-formatted project cost estimate

## `status` (type: `string`):

Current permit status

## `issueDate` (type: `string`):

Date the permit was issued

## `contractor` (type: `string`):

Contractor or applicant name

## `zipCode` (type: `string`):

Property zip code

## `source` (type: `string`):

Source portal identifier

## `description` (type: `string`):

Permit work 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 = {
    "city": "Chicago",
    "cities": [],
    "state": "IL",
    "keyword": "",
    "zipCodes": [],
    "lastNDays": 30,
    "dateFrom": "",
    "dateTo": "",
    "contractorContains": "",
    "tradeCategories": [],
    "maxResults": 12,
    "enrichContractors": false,
    "maxContactsToEnrich": 50,
    "enableContractorRollup": false,
    "demoMode": false
};

// Run the Actor and wait for it to finish
const run = await client.actor("intelscrape/building-permit-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 = {
    "city": "Chicago",
    "cities": [],
    "state": "IL",
    "keyword": "",
    "zipCodes": [],
    "lastNDays": 30,
    "dateFrom": "",
    "dateTo": "",
    "contractorContains": "",
    "tradeCategories": [],
    "maxResults": 12,
    "enrichContractors": False,
    "maxContactsToEnrich": 50,
    "enableContractorRollup": False,
    "demoMode": False,
}

# Run the Actor and wait for it to finish
run = client.actor("intelscrape/building-permit-scraper").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 '{
  "city": "Chicago",
  "cities": [],
  "state": "IL",
  "keyword": "",
  "zipCodes": [],
  "lastNDays": 30,
  "dateFrom": "",
  "dateTo": "",
  "contractorContains": "",
  "tradeCategories": [],
  "maxResults": 12,
  "enrichContractors": false,
  "maxContactsToEnrich": 50,
  "enableContractorRollup": false,
  "demoMode": false
}' |
apify call intelscrape/building-permit-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,intelscrape/building-permit-scraper"
        }
    }
}
```

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/CWLCtuNb3yah5PTno/builds/vk38mvyUN77ZAsRPr/openapi.json
