# US Building Permits Scraper: Construction Leads (`maliksaid/us-building-permits`) Actor

Building permits scraper for 25 US city and county open-data portals, including New York City, Los Angeles, Chicago, Miami and Austin. Building permit data with type, trade, valuation, address and contractor. Contractor leads for roofing, solar and HVAC. Monitor mode returns new permits.

- **URL**: https://apify.com/maliksaid/us-building-permits.md
- **Developed by:** [Malik Said](https://apify.com/maliksaid) (community)
- **Categories:** Lead generation, Real estate
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.60 / 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.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

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

## US Building Permits Scraper: Construction Leads

This US building permits scraper returns newly issued building permits from 25 US city and county sources in one table. The data comes from each city's official open-data portal. Each permit is a construction lead with the permit type, a normalised trade category, project value, address and contractor.

Contractors, suppliers, solar and roofing sales teams, and property researchers use it to find new construction work. Schedule it daily with monitor mode on, and each run returns only new permits.

### US building permits: cities covered

Counts are permits issued from 14 to 20 October 2026, counted on 21 October 2026.

| City | Source dataset | Permits in 7 days |
|---|---|---|
| New York City, NY | DOB NOW: Build, Approved Permits | 2,581 |
| Los Angeles, CA | LADBS Building Permits Issued from 2020 to Present | 850 |
| Austin, TX | Issued Construction Permits | 847 |
| Boston, MA | Approved Building Permits | 672 |
| Chicago, IL | Building Permits | 573 |
| New Orleans, LA | Permits | 295 |
| San Francisco, CA | DBI Building Permits | 230 |
| Cincinnati, OH | Cincinnati Building Permits | 144 |
| Baton Rouge, LA | EBR Building Permits | 97 |
| Seattle, WA | SDCI Building Permits | 84 |

Cities and counties added on 21 October 2026. Counts are permits issued from 14 to 21 October 2026.

| City or county | Source dataset | Permits in 7 days |
|---|---|---|
| Miami, FL | City of Miami Building Permits Since 2014 | 604 |
| Orlando, FL | Permit Applications (issued permits only) | 528 |
| Louisville, KY | Louisville Metro Active Construction Permits | 285 |
| Norfolk, VA | Permits | 253 |
| Nashville, TN | Building Permits Issued | 248 |
| Everett, WA | Trakit Permits | 215 |
| Detroit, MI | BSEED Building Permits | 173 |
| Montgomery County, MD | Residential Permit and Commercial Permits (two sources) | 151 |
| Marin County, CA | Building Permit (unincorporated county) | 107 |
| Mesa, AZ | Building Permits | 69 |
| Pierce County, WA | Permits - Pierce County (unincorporated county) | 55 |
| Corona, CA | CorStat - Building Permits | 37 |
| College Station, TX | Permits - Master Dataset | 24 |
| Memphis, TN | DPD Building Permits (updated about once a month) | 0 |

Cities added on 23 October 2026. Counts are permits issued from 16 to 22 October 2026.

| City | Source dataset | Permits in 7 days |
|---|---|---|
| Philadelphia, PA | Licenses and Inspections Building and Zoning Permits | 996 |
| Raleigh, NC | Building Permits | 66 |
| Washington, DC | Building Permits - Last 30 Days (newest permit 15 October; the feed runs about a week behind) | 0 |

Washington, DC publishes the last 30 days only, and its feed runs about a week behind. Use **Days back** 14 or more for DC.

Memphis publishes about once a month, so a 7-day window is often empty. Use **Days back** 45 for Memphis. Louisville publishes active permits only, so closed permits drop out of its source.

New York City electrical and elevator permits sit in separate city datasets. This Actor does not read them yet.

### Building permit data you get

| Field | Meaning |
|---|---|
| `city`, `cityName`, `state` | City code, city name and state |
| `permitNumber` | Permit number as the city publishes it |
| `issuedDate` | Issue date, YYYY-MM-DD |
| `daysSinceIssued` | Whole days from the issue date to the run date. Sort by it to call the freshest permits first |
| `appliedDate` | Application or filing date, where published |
| `permitType` | Permit type as the city names it |
| `workClass` | Work class, trade or sub-type, where published |
| `useCategory` | Property use or residential/commercial class, where published |
| `description` | Work description from the permit |
| `valuation` | Declared project value in USD, where published |
| `address`, `zipCode` | Work site address and ZIP code |
| `latitude`, `longitude` | Coordinates, where published |
| `contractorName` | Contractor or permittee business, where published |
| `status` | Permit status as the city names it |
| `tradeCategories` | Normalised trades: roofing, solar, hvac, electrical, plumbing, new-construction, addition-remodel, demolition, pool, fence, sign, fire-protection or other |
| `sourceUrl` | Link to the permit on the city's permit site, or to the record in the city's API |
| `datasetUrl` | Link to the city's dataset |
| `id` | Stable ID used by monitor mode |
| `scrapedAt` | When the Actor collected the record |

Sample record from a test run on 21 October 2026:

```json
{
    "id": "seattle:7109400-CN",
    "city": "seattle",
    "cityName": "Seattle",
    "state": "WA",
    "permitNumber": "7109400-CN",
    "issuedDate": "2026-10-16",
    "daysSinceIssued": 5,
    "appliedDate": "2026-09-01",
    "permitType": "Building",
    "workClass": "Addition/Alteration",
    "useCategory": "Non-Residential",
    "description": "Construct alterations to existing minor telecommunication array (AT&T) on roof of multifamily building (ADRIATIC) per plan.",
    "valuation": 30000,
    "address": "3200 NW 65TH ST",
    "zipCode": "98117",
    "latitude": 47.67599988,
    "longitude": -122.39862497,
    "contractorName": null,
    "status": "Issued",
    "tradeCategories": ["addition-remodel"],
    "sourceUrl": "https://services.seattle.gov/portal/customize/LinkToRecord.aspx?altId=7109400-CN",
    "datasetUrl": "https://data.seattle.gov/d/76t5-zqzr",
    "scrapedAt": "2026-10-21T08:39:32.916Z"
}
```

#### Trade categories

The Actor sets `tradeCategories` itself, so one filter works in every city. It reads the permit type, work class and description and looks for trade words. For example, "re-roof" gives `roofing`, "heat pump" gives `hvac` and "service upgrade" gives `electrical`. One permit can have several categories. A permit with no trade word gets `other`. The category is a keyword match. Check the description before you act on a lead.

#### Empty fields

Each city publishes different columns. The Actor leaves a field empty when the city does not publish it. It never guesses a value.

- `contractorName`: Los Angeles, San Francisco, Boston, Nashville, Detroit, Memphis, Norfolk, Corona, College Station, Montgomery County, Pierce County, Philadelphia and Washington, DC do not publish a contractor, or the Actor does not read it because it can hold a person's name. Seattle and Louisville fill it for few permits.
- `valuation`: Philadelphia and Washington, DC do not publish one. Austin fills it mainly for building permits. Trade permits often have no value. Pierce County fills it for few permits.
- `appliedDate`: New York City and Boston do not publish one.
- `zipCode`: Chicago, New Orleans, Miami, Orlando, Mesa, Norfolk and Pierce County do not publish one. The Actor reads a ZIP code from the end of the address when the city puts it there.
- `description`: Norfolk, Orlando and Louisville do not publish a work description.
- `latitude` and `longitude`: Orlando leaves recent permits without coordinates.
- `workClass`: San Francisco, New Orleans and Baton Rouge do not publish one.
- `status`: Baton Rouge, Marin County, Everett, Nashville, Detroit and Memphis do not publish one.
- `latitude` and `longitude`: Cincinnati and Austin leave many permits without coordinates.

### Building permits scraper: how to use it

1. Pick the cities.
2. Set **Days back**, or set **Issued from** and **Issued to**.
3. Optional: pick **Trade categories**, such as Roofing, Solar or HVAC. Or type words under **Permit types or trades**, such as `electrical` or `demolition`.
4. Optional: add **Keywords** to search the work description, such as `roof`, `pool` or `adu`.
5. Optional: set **Minimum valuation** and **Maximum valuation** to keep jobs of the size you want.
6. Optional: add **ZIP codes** to keep your service area only.
7. Turn on **Monitor mode** and schedule the Actor daily to receive only new permits.

### Building permits input options

| Option | Default | Meaning |
|---|---|---|
| Cities | The first ten | Cities and counties to read. Clear the list to read all 28 |
| Days back | 7 | Read permits issued in the last N days |
| Issued from / Issued to | Empty | Exact date range. Overrides Days back |
| Permit types or trades | None | Match against permit type and work class |
| Trade categories | None | Keep permits in at least one chosen category |
| Keywords | None | Match against description, type, work class and contractor |
| Minimum valuation (USD) | 0 | Drop permits below this value. Permits without a value are dropped when this is above 0 |
| Maximum valuation (USD) | 0 (none) | Drop permits above this value. Permits without a value are dropped when this is above 0 |
| ZIP codes | None | Keep permits whose ZIP code starts with one of these values. Permits without a ZIP code are dropped |
| Monitor mode | Off | Return only permits not returned before |
| Monitor name (`monitorName`) | `default` | Name of the monitor memory. Use one key per watch list. The old field name `stateKey` still works |
| Maximum permits | 100 | Stop after this many permits. Set 0 for no limit |
| Maximum pages per city | 0 (all) | Each page holds up to 1,000 permits |
| Your own Socrata permit datasets | None | Read any Socrata permit dataset on a .gov, .org or .us portal. See below |

#### Your own Socrata permit datasets

Your town may publish permits on a Socrata portal that this Actor does not list. Add it under **Your own Socrata permit datasets**. Find the dataset ID (four letters, a dash, four letters) in the dataset's address, and the names of its columns on its page. Example:

```json
{
    "customSources": [
        {
            "name": "Austin check",
            "state": "TX",
            "domain": "data.austintexas.gov",
            "dataset": "3syk-w9eu",
            "dateField": "issue_date",
            "fields": {
                "permitNumber": "permit_number",
                "permitType": "permit_type_desc",
                "description": "description",
                "valuation": "total_job_valuation",
                "address": "original_address1",
                "zipCode": "original_zip"
            }
        }
    ]
}
```

Rows from this dataset get `city` "custom-austin-check". Columns whose names contain owner, applicant, phone, email, contact or tenant are refused, so the Actor never reads personal contact data. A wrong entry is skipped with a warning in the log.

Words in the two filter lists match the start of a word. For example, `roof` matches "roofing" and "re-roof".

**Maximum permits** is shared evenly across the selected cities. With ten cities and a limit of 100, each city gives up to 10 permits. A city with fewer matching permits leaves its share unused. Set 0 to get every matching permit.

### Building permits pricing

The Actor uses pay-per-event pricing:

| Event | Free plan | GOLD plan and higher |
|---|---|---|
| Run start | $0.02 | $0.02 |
| Permit | $0.002 ($2.00 per 1,000) | $0.0016 ($1.60 per 1,000) |

| Permits in one run | Free plan | GOLD plan and higher |
|---|---|---|
| 100 | $0.22 | $0.18 |
| 1,000 | $2.02 | $1.62 |

Costs include the run start fee.

Permits skipped by your filters or by monitor mode cost nothing. Check the Pricing tab for the current price.

### Building permits example: input and output

This input reads the last 7 days of permits from Chicago, Boston and Seattle and stops at 12 permits:

```json
{
    "cities": ["chicago", "boston", "seattle"],
    "daysBack": 7,
    "maxItems": 12
}
```

One record from that run on 21 October 2026:

```json
{
    "id": "boston:G1910419",
    "city": "boston",
    "cityName": "Boston",
    "state": "MA",
    "permitNumber": "G1910419",
    "issuedDate": "2026-10-20",
    "daysSinceIssued": 1,
    "appliedDate": null,
    "permitType": "Gas Permit",
    "workClass": "Gas",
    "useCategory": "1-3FAM",
    "description": "Relocating gas meter from inside to exterior… adding a new on demand tankless water heater and gas line for a stove",
    "valuation": 8000,
    "address": "960 Bennington ST, East Boston",
    "zipCode": "02128",
    "latitude": 42.38626999967974,
    "longitude": -71.0087000013072,
    "contractorName": null,
    "status": "Open",
    "sourceUrl": "https://data.boston.gov/api/3/action/datastore_search?resource_id=6ddcd912-32a0-43df-9908-63574f8c7e77&filters=%7B%22permitnumber%22%3A%22G1910419%22%7D",
    "datasetUrl": "https://data.boston.gov/dataset/approved-building-permits",
    "scrapedAt": "2026-10-21T08:55:41.049Z"
}
```

### Building permits FAQ

#### Which US cities does it cover?

New York City, Los Angeles, Chicago, San Francisco, Austin, Seattle, Boston, New Orleans, Cincinnati, Baton Rouge, Miami, Nashville, Detroit, Louisville, Memphis, Orlando, Mesa, Norfolk, Everett, Corona and College Station. It also covers Marin County (CA), Montgomery County (MD) and Pierce County (WA), Philadelphia, Raleigh and Washington, DC. You can also add any Socrata permit dataset yourself. The tables above show the source dataset for each one.

#### Can I use it for roofing, solar or HVAC leads?

Yes. Pick Roofing, Solar or HVAC under **Trade categories**. Add **ZIP codes** for your service area. Set **Minimum valuation** to keep larger jobs only.

#### How do I get only new permits each day?

Turn on **Monitor mode** and schedule the Actor daily. The Actor remembers the permits it returned before and skips them. Skipped permits are free.

#### Does it return owner names or phone numbers?

No. The Actor reads permit facts only. It returns the contractor or permittee business when the city publishes it.

#### How fresh is the data?

Each city updates its open-data portal on its own schedule. The Actor reads the portal at run time, so each run gets the latest published permits.

#### Can an AI agent use it?

Yes. Agents can find and run it through the Apify MCP server or the Apify API. All cities share one output schema.

### Building permits data sources and use

- All data comes from official city and county open-data APIs that need no login. They run on Socrata, CKAN, ArcGIS or Carto.
- The Actor reads up to five portals at a time and sends at most one request per 1.1 seconds to each portal.
- The Actor does not request owner names, applicant names, contact persons, project names, phone numbers or e-mail addresses.
- `contractorName` holds the contractor or permittee as the city publishes it. Some small contractors trade under a personal name.
- Philadelphia data: City of Philadelphia open data, used under its terms of use. Addresses are back in the data since October 2026.
- Washington, DC data: District of Columbia open data, licensed under CC BY 4.0.
- Maricopa County, San Antonio and Pittsburgh are not included. Their terms or robots.txt do not allow this use. Fort Worth and San Diego County are not included: Fort Worth's open table has no issue date, and San Diego County's newest record is from 2023.
- Miami data: City of Miami, licensed under CC BY 4.0.

City of Chicago notice: This site provides applications using data that has been modified for use from its original source, www.cityofchicago.org, the official website of the City of Chicago. The City of Chicago makes no claims as to the content, accuracy, timeliness, or completeness of any of the data provided at this site. The data provided at this site is subject to change at any time. It is understood that the data provided at this site is being used at one's own risk.

### Related Actors

- [Gulf Tenders Radar](https://apify.com/maliksaid/gulf-tenders-radar): public tenders from Oman, Jordan and the UAE.
- [Technical SEO Audit](https://apify.com/maliksaid/technical-seo-audit): crawl a site and find broken links and SEO issues.
- [Drug Approvals Monitor](https://apify.com/maliksaid/drug-approvals-monitor): new drug approvals from the FDA, EMA and Health Canada.

### Support

Report a problem in the Issues tab. Include the run link.

# Actor input Schema

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

Cities and counties to read. Leave the field out to read the first ten (New York City to Baton Rouge). Clear the list to read all 28.

## `daysBack` (type: `integer`):

Read permits issued in the last N days. Ignored when Issued from is set.

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

Earliest issue date, YYYY-MM-DD. Overrides Days back.

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

Latest issue date, YYYY-MM-DD. Leave empty for today.

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

Keep permits whose type or work class contains one of these words, for example electrical, plumbing, demolition, solar. A word matches the start of a word, so roof matches roofing. Leave empty to keep every type.

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

Keep permits in at least one of these trade categories. The Actor sets the category from the permit type, work class and description, so it works the same way in every city. Leave empty to keep every trade.

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

Keep permits whose description, type, work class or contractor contains one of these words. Leave empty to keep every permit.

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

Keep permits with a declared project value of at least this amount. Permits without a value are dropped when this is above 0.

## `maxValuation` (type: `integer`):

Keep permits with a declared project value of at most this amount. Permits without a value are dropped when this is above 0. Set 0 for no maximum.

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

Keep permits whose ZIP code starts with one of these values, for example 94110 or 941. Permits without a ZIP code are dropped when this list is set. Leave empty to keep every ZIP code.

## `monitorMode` (type: `boolean`):

Return only permits that earlier monitor-mode runs with the same monitor name did not return. Schedule the Actor daily with this on to get a feed of new permits.

## `monitorName` (type: `string`):

Name of the memory that monitor mode uses. Use a different name for each separate watch list. Inputs that still send the old field `stateKey` keep working.

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

Stop after saving this many permits. The limit is shared evenly across the selected cities. Set 0 for no limit.

## `maxPagesPerCity` (type: `integer`):

Each page holds up to 1,000 permits. 0 means all pages.

## `customSources` (type: `array`):

Optional. Read a permit dataset from any Socrata open-data portal that ends in .gov, .org or .us. Each entry needs name, domain, dataset (the four-four ID), dateField (the issue date column) and fields.permitNumber. Optional fields map our names to the dataset's columns: permitType, description, valuation, address, zipCode, latitude, longitude, contractorName, status. Columns with owner, applicant, phone, email, contact or tenant in the name are refused. Rows get city "custom-<name>". When you add custom sources and leave Cities out, only the custom sources are read.

## `proxyConfiguration` (type: `object`):

Optional. The city open-data APIs do not need a proxy.

## Actor input object example

```json
{
  "cities": [
    "nyc",
    "chicago",
    "la",
    "sf",
    "austin",
    "seattle",
    "boston",
    "neworleans",
    "cincinnati",
    "batonrouge",
    "miami",
    "nashville",
    "detroit",
    "louisville",
    "memphis",
    "orlando",
    "mesa",
    "norfolk",
    "everett",
    "corona",
    "collegestation",
    "marincounty",
    "montgomerymd",
    "montgomerymdcommercial",
    "piercecounty",
    "philadelphia",
    "raleigh",
    "washingtondc"
  ],
  "daysBack": 7,
  "permitTypes": [],
  "tradeCategories": [],
  "keywords": [],
  "minValuation": 0,
  "maxValuation": 0,
  "zipCodes": [],
  "monitorMode": false,
  "monitorName": "default",
  "maxItems": 100,
  "maxPagesPerCity": 0,
  "customSources": [],
  "proxyConfiguration": {
    "useApifyProxy": 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": [
        "nyc",
        "chicago",
        "la",
        "sf",
        "austin",
        "seattle",
        "boston",
        "neworleans",
        "cincinnati",
        "batonrouge",
        "miami",
        "nashville",
        "detroit",
        "louisville",
        "memphis",
        "orlando",
        "mesa",
        "norfolk",
        "everett",
        "corona",
        "collegestation",
        "marincounty",
        "montgomerymd",
        "montgomerymdcommercial",
        "piercecounty",
        "philadelphia",
        "raleigh",
        "washingtondc"
    ],
    "daysBack": 7,
    "maxItems": 100
};

// Run the Actor and wait for it to finish
const run = await client.actor("maliksaid/us-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": [
        "nyc",
        "chicago",
        "la",
        "sf",
        "austin",
        "seattle",
        "boston",
        "neworleans",
        "cincinnati",
        "batonrouge",
        "miami",
        "nashville",
        "detroit",
        "louisville",
        "memphis",
        "orlando",
        "mesa",
        "norfolk",
        "everett",
        "corona",
        "collegestation",
        "marincounty",
        "montgomerymd",
        "montgomerymdcommercial",
        "piercecounty",
        "philadelphia",
        "raleigh",
        "washingtondc",
    ],
    "daysBack": 7,
    "maxItems": 100,
}

# Run the Actor and wait for it to finish
run = client.actor("maliksaid/us-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": [
    "nyc",
    "chicago",
    "la",
    "sf",
    "austin",
    "seattle",
    "boston",
    "neworleans",
    "cincinnati",
    "batonrouge",
    "miami",
    "nashville",
    "detroit",
    "louisville",
    "memphis",
    "orlando",
    "mesa",
    "norfolk",
    "everett",
    "corona",
    "collegestation",
    "marincounty",
    "montgomerymd",
    "montgomerymdcommercial",
    "piercecounty",
    "philadelphia",
    "raleigh",
    "washingtondc"
  ],
  "daysBack": 7,
  "maxItems": 100
}' |
apify call maliksaid/us-building-permits --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,maliksaid/us-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/dRzb61m7HuQvFR85o/builds/3Rebw12AhAaLVRmDz/openapi.json
