# RenovationFind Canada Contractors Scraper — Phones & Websites (`scrapersdelight/renovationfind-canada-scraper`) Actor

Canadian renovation contractors from renovationfind.com: the company's own phone and website, street address, RenovationFind certification, letter rating and the 7 verified checks (insurance, WCB, licence, BBB), categories and areas served. Filter by market or trade. $4.50 per 1,000 companies.

- **URL**: https://apify.com/scrapersdelight/renovationfind-canada-scraper.md
- **Developed by:** [Scrapers Delight](https://apify.com/scrapersdelight) (community)
- **Categories:** Lead generation, Business, Automation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$4.50 / 1,000 per company returneds

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

## RenovationFind Canada Contractors Scraper — Phones & Websites

Export Canadian **renovation and home-improvement companies** from the [RenovationFind](https://www.renovationfind.com) directory: roofers, basement developers, kitchen and bath renovators, HVAC, plumbers, painters, landscapers, window and siding companies. You get **each company's own phone number and website** exactly as its profile prints them, plus its address, its **RenovationFind certification status, letter rating and the 7 verified checks** (business insurance, workers' compensation, municipal licence, BBB, credit, legal, complaint review), categories, description and areas served.

**One row = one company.** A company listed twice is delivered and charged once.

**$4.50 per 1,000 companies** ($0.0045 per company). No start fee, no proxy cost. Filtered-out companies, duplicates, RenovationFind's own test accounts, removed profiles and pages the site could not serve are never charged.

### Who uses this

- Contractor-marketing agencies (SEO, PPC, websites, review management) building call lists by city and trade
- Canadian home-services SaaS and lead marketplaces sourcing contractors, especially in **Alberta and BC**
- Building-product manufacturer reps and distributors (windows, siding, roofing, cabinets) mapping installers
- Home-warranty, insurance and restoration networks recruiting vetted trades — `insuranceVerified` and `workersCompVerified` tell you who RenovationFind has already checked

### Where the directory is strong

RenovationFind is a Western-Canada-first directory. The site's own sitemaps list **6,116 companies** (2026-09-23), and **62%** of them are in Alberta, BC, Manitoba and Saskatchewan:

| Market (`markets` value) | Companies | | Market | Companies |
|---|---|---|---|---|
| `edmonton` (7 cities) | 1,032 | | `ottawa` | 291 |
| `calgary` (+ Airdrie, Chestermere) | 989 | | `toronto` (+ Mississauga) | 279 |
| `vancouver` (19 Lower Mainland cities) | 694 | | `montreal` | 221 |
| `winnipeg` (+ Selkirk) | 487 | | `hamilton` · `kitchener` · `london` · `barrie` · `waterloo` | 158 · 145 · 143 · 138 · 128 |
| `kelowna` · `victoria` | 169 · 154 | | `quebec-city` | 147 |
| `saskatoon` · `regina` | 145 · 139 | | `halifax` · `fredericton` · `moncton` · `saint-john` · `st-johns` | 136 · 136 · 129 · 130 · 125 |

By province: AB 2,021 · ON 1,282 · BC 1,017 · MB 487 · NB 395 · QC 368 · SK 284 · NS 136 · NL 125 (and 1 in an unlabelled market). It is **not** a national census of contractors: Toronto has 279 companies here. For Ontario-wide or Quebec-wide coverage pair it with a licence register (HCRA, RBQ) or HomeStars.

### What you get — measured on a full-directory run (run 1okPPStmE8w8IQicL, 2026-09-23)

Every company in every market: 5,976 rows delivered from 6,116 listed profile ids (see *Coverage*).

| Field | All 5,976 rows | Certified (2,945) | Not certified (3,031) | Notes |
|---|---|---|---|---|
| `phone` | **95.7%** | 96.2% | 95.3% | the company's own number as printed; `phoneE164` 95.4% (the rest are vanity numbers like "780-416-DECK (3325)", Alberta 7-digit 310- lines, typos — never completed) |
| `website` | **86.3%** | 87.0% | 85.6% | the company's own domain; RenovationFind mini-site links are returned separately as `renovationFindMinisiteUrl` (7.6%) |
| `streetAddress` / `postalCode` | 53.7% / 51.9% | 70.0% / 67.3% | 37.8% / 37.0% | |
| `city` / `province` | 44.3% / 44.2% | 51.0% / 50.8% | 37.8% / 37.8% | many profiles print street + postal code only; `marketProvince` is 100% |
| `renovationFindRating` | 48.2% | 97.8% | — | A+ 125 · A 1,232 · A- 1,524 |
| `verifiedChecks` + 7 check booleans | 49.3% | 100% | — | 7/7: 125 · 5–6: 192 · 4: 1,082 · 3: 1,483 · 0–2: 63 |
| `categories` | 91.9% | 90.4% | 93.3% | |
| `description` | 88.9% | 96.1% | 81.8% | |
| `facebookUrl` / `instagramUrl` | 38.6% / 14.1% | | | also twitter, youtube, linkedin, pinterest, houzz when linked |
| `servicesDescription` / `areasServed` | 19.4% / 9.5% | 19.2% / 19.3% | | |
| `logoUrl` | 80.4% | 90.7% | 70.3% | |
| `email` | 0.1% (4 rows) | | | see *Honest limits* |

Two smaller frames on the shipping build agree: Winnipeg (MB, 487 listed) phone 91.6%, website 85.0%, street 41.5%; Ottawa (ON, 289 listed) phone 86.2%, website 88.9%, street 47.4% (run yh3awi6HsVpmPRNfi).

**Coverage:** the sitemaps listed 6,116 profile ids; all 6,116 were read (0 not found, 0 unreadable, 0 retries). 5,976 were delivered. The other 140 were not charged: 126 re-listings of a company already delivered (same name and same phone or website, e.g. one design firm listed under 21 ids, one per market), 8 RenovationFind test/demo accounts plus its listing of itself, and 5 profiles carrying a closure notice.

**Two kinds of profile.** RenovationFind lists two kinds of company, and the row tells you which (`certified`):

- **Certified** (2,945 companies, 49%) — the company went through RenovationFind's screening. Its row carries the letter rating (`A+`, `A`, `A-`), the 7 checks one by one, `verifiedChecks` (0–7), a street address on most profiles, services, areas served and a photo count.
- **Not certified** (3,031, 51%) — an unclaimed listing. RenovationFind still prints the company's phone and website (these rows actually have the **higher** website fill), categories and description, but no rating and usually no address.

### Input

| Field | Default | What it does |
|---|---|---|
| `markets` | `["calgary"]` | A market key (`edmonton`, `calgary`, `vancouver`, `victoria`, `kelowna`, `winnipeg`, `saskatoon`, `regina`, `toronto`, `ottawa`, `hamilton`, `kitchener`, `london`, `barrie`, `waterloo`, `montreal`, `quebec-city`, `halifax`, `fredericton`, `moncton`, `saint-john`, `st-johns`), a city inside one (`burnaby`, `sherwood park`, `airdrie`, `mississauga`…), a province code (`AB`, `BC`, `MB`, `SK`, `ON`, `QC`, `NS`, `NB`, `NL`) or `all`. |
| `categoryPageUrls` | `[]` | RenovationFind city + category pages, e.g. `https://www.renovationfind.com/ab/edmonton/bathroom-renovations`. Exports every company the page lists (these pages list certified companies). Replaces `markets`. |
| `companyUrls` | `[]` | Specific `/companies/<name>-<id>` profiles to refresh. Replaces `markets`. |
| `certifiedOnly` | `false` | Only certified companies (never charged for the rest). |
| `minVerifiedChecks` | `0` | Only certified companies with at least N of the 7 checks verified. |
| `categoryKeywords` | `[]` | Only companies whose categories or name contain one of these words (`roof`, `plumb`, `basement`, `hvac`, `window`…). |
| `requirePhone` / `requireWebsite` | `false` | Only companies that print a phone / their own website. |
| `excludeClosed` | `true` | Skip profiles whose description carries a closure notice ("OUT OF BUSINESS", "permanently closed", "ceasing operations"). Off = delivered with `businessClosedNotice: true`. |
| `collapseDuplicateListings` | `true` | One row per company: a profile with the same name and the same phone or website as one already delivered is skipped and not charged. Off = every profile id. |
| `maxResults` | `75` | Stop after this many companies. `0` = no limit. |
| `concurrency` | `4` | The most pages fetched at once — see *How it works*. |
| `requestTimeoutSecs` | `60` | Hard deadline per page; slow pages are retried. |
| `proxyConfiguration` | off | Not needed — the site answers Apify directly. If a proxy you choose cannot be set up, the run continues without one. |

Example — every certified roofing company in Alberta:

```json
{
  "markets": ["AB"],
  "categoryKeywords": ["roof"],
  "certifiedOnly": true,
  "maxResults": 0
}
```

Filters are applied after a profile is read (the directory has no server-side filter for them), so a narrow filter over a big market reads more pages than it delivers — you are still only charged for delivered rows.

### Output — a real row (run 1okPPStmE8w8IQicL, 2026-09-23)

```json
{
  "companyId": 7106,
  "name": "Highcliffe Mechanical Ltd.",
  "phone": "587-317-4430",
  "phoneE164": "+15873174430",
  "phoneExtension": null,
  "phoneIsTollFree": false,
  "additionalPhones": [],
  "website": "https://highcliffemechanical.com/",
  "websiteDomain": "highcliffemechanical.com",
  "email": null,
  "emailSource": null,
  "streetAddress": "#5, 4216 10 Street NE",
  "city": "Calgary",
  "province": "AB",
  "postalCode": "T2E 6K3",
  "address": "#5, 4216 10 Street NE, Calgary, AB, T2E 6K3",
  "certified": true,
  "renovationFindRating": "A+",
  "verifiedChecks": 7,
  "creditCheckVerified": true,
  "legalCheckVerified": true,
  "complaintReviewVerified": true,
  "insuranceVerified": true,
  "workersCompVerified": true,
  "businessLicenseVerified": true,
  "bbbVerified": true,
  "categories": [
    "Air Conditioning",
    "Drains and Sewer Cleaning",
    "Furnace Repair",
    "Furnace Replacement & Installation",
    "Gas Line Installation",
    "Hot Water Heater Installation & Replacement",
    "HVAC Companies",
    "Hydronic Heating",
    "Plumbers",
    "Plumbing",
    "Plumbing Fixtures, Parts, Supplies",
    "Poly B Replacement",
    "Water Filtration & Purification"
  ],
  "businessClosedNotice": false,
  "description": "New installs, service, repairs, renovations, retro-fits, new builds and lease bays for residential and commercial plumbing, heating, gasfitting and air conditioning applications.",
  "servicesDescription": "Residential and commercial plumbing, heating, gas fitting and air conditioning",
  "areasServed": "Calgary and surrounding, such as Airdrie, Cochrane, Chestermere, Bragg Creek, Okotoks, High River & Strathmore",
  "facebookUrl": "https://www.facebook.com/HighcliffeMech",
  "instagramUrl": null,
  "twitterUrl": null,
  "youtubeUrl": null,
  "linkedinUrl": null,
  "pinterestUrl": null,
  "houzzUrl": null,
  "photoCount": 21,
  "logoUrl": null,
  "market": "calgary",
  "marketName": "Calgary region",
  "marketProvince": "AB",
  "profileUrl": "https://www.renovationfind.com/companies/highcliffe-mechanical-ltd-7106",
  "renovationFindMinisiteUrl": null,
  "scrapedAt": "2026-09-23T09:39:47.805Z"
}
```

#### Field reference

- `companyId`, `profileUrl` — RenovationFind's own id and canonical profile. Dedupe key.
- `phone` — the company's number **as printed** in its profile's Contact Info (never RenovationFind's own 1-800-576-8998, which is on every page). `phoneE164` — `+1` + the 10 digits, only when exactly one complete North-American number can be read off the printed text by reformatting; `phoneExtension`; `phoneIsTollFree`; `additionalPhones` — a second number when the company typed two into one entry ("403-708-0810, 403 889-9941").
- `website`, `websiteDomain` — the company's own site from the profile's "Website" link. When that link points to RenovationFind's hosted mini-site it is returned as `renovationFindMinisiteUrl` instead; when it points to a Facebook page it is returned as `facebookUrl`.
- `emailFromDescription` — RenovationFind has no e-mail field; a few companies type an address into their own description, and it is taken from there only.
- `streetAddress`, `city`, `province` (2-letter code), `postalCode` (`A1A 1A1`), `address` — from the profile's structured data and address block.
- `certified`, `renovationFindRating`, `verifiedChecks` and the seven check booleans `creditCheckVerified`, `legalCheckVerified`, `complaintReviewVerified`, `insuranceVerified`, `workersCompVerified`, `businessLicenseVerified`, `bbbVerified` — `true` = check mark, `false` = cross, `null` on not-certified profiles (never screened).
- `categories`, `description`, `servicesDescription` (the company's own "Services Provided" text), `areasServed`, `photoCount`, `logoUrl`.
- `facebookUrl`, `instagramUrl`, `twitterUrl`, `youtubeUrl`, `linkedinUrl`, `pinterestUrl`, `houzzUrl`.
- `market`, `marketName`, `marketProvince` — the RenovationFind market whose sitemap lists the company (the only location signal on many not-certified profiles).

### How it works — and the traps it handles

- **Enumeration from the site's own sitemaps.** Each market has a company sitemap; the actor reads the ones you ask for, dedupes on the numeric company id, and **fails the run rather than continue** if a market's sitemap cannot be read in full — a partial list would look like a small market. `RUN_SUMMARY.enumeration` gives sitemap entries vs unique companies for your run.
- **The origin server is weak.** Measured: at 8 parallel requests the site's response time rose from 0.3 s to 12–64 s for every visitor. The actor starts at 2 parallel requests, adds one after each run of normal responses, and halves whenever a page takes over 20 s — never above your `concurrency`. Not-certified profiles in the Vancouver market take ~8 s each even on an idle server; the whole directory takes about 35 minutes.
- **The market sitemaps are generated on request** (Vancouver 66 s, Edmonton 38 s, Calgary 22 s to first byte), so they get a 3-minute deadline of their own.
- **A removed company is not a 404** — the site redirects `/companies/<anything>-<unknown id>` to `/404`. Those are reported as "not found" and never charged.
- **RenovationFind's own test accounts are live profiles** ("Tutorial", "Sample", "Keith & Test", "Ansh test vendor", "Your Company Name Here"…). They are dropped, listed in `RUN_SUMMARY.notCharged.testListings`, and never charged.
- **Platform contacts never ship as a company's.** RenovationFind's own phone line, its mini-site links and its contact-form placeholders (`john@example.com`, `john@smithrenovations.ca`) are on every page; the actor reads only the profile's Contact Info block and **fails the run** if any of them ever reaches a row (0 across 5,976 rows).
- **No call tracking.** The printed number is the company's own: across the 5,976 delivered rows no number is printed by more than 4 differently-named companies, and those 4 are branches of one security firm (Liberty Security Systems Edmonton / Calgary / Kelowna / Halifax). A number printed by 5+ different companies would be withheld as a switchboard.
- **Safe across platform migrations.** Apify moves long runs between servers and restarts them from the top. The actor saves its progress after every batch, and a restarted run skips every company it already read, so nothing is delivered or charged twice (tested by rebooting a run at company 160: 400 delivered, 400 unique, 400 charged).
- **HTTP 200 with a Cloudflare challenge or a truncated page** is a failed request and is retried, never an empty company. If more than 20% of profiles fail after retries the run stops and says so.

### Pricing

Pay per event: **$0.0045 per company delivered** ($4.50 per 1,000). A run with the default input (`maxResults` 75) costs at most $0.34; the whole directory (~6,116 companies) about $27. If you set a maximum charge for the run, the actor stops delivering exactly at your budget.

### Honest limits

- **E-mail is almost never available.** RenovationFind profiles have no e-mail field; contact goes through its quote form. `emailFromDescription` is filled on 0.1% of rows. Most rows have a website: run those through a website contact extractor if you need e-mails.
- **Address on about half the rows.** Certified profiles carry structured addresses (70% street); most not-certified profiles print none, and for those `market` / `marketProvince` is the location.
- **Not a national census** — see *Where the directory is strong*. Ontario and Quebec coverage is thin.
- **`certified` is the page's own template**, not a guarantee: 47 certified profiles show 0 of 7 checks verified (new members), and 64 carry no letter rating. Filter with `minVerifiedChecks` if you need screened companies only.
- **Profiles go stale.** Some unclaimed listings are old; a number or website may no longer work. RenovationFind does not publish a last-updated date.

### Source

Data is read from public pages of renovationfind.com: the sitemap index (`/sitemap.xml`), each market's `sitemap-city-companies.xml`, city/category pages and `/companies/<name>-<id>` profiles. The `/company/` mini-site link is returned as a URL, never opened.

# Actor input Schema

## `markets` (type: `array`):

Which RenovationFind markets to export. A market (edmonton, calgary, vancouver, victoria, kelowna, winnipeg, saskatoon, regina, toronto, ottawa, hamilton, kitchener, london, barrie, waterloo, montreal, quebec-city, halifax, fredericton, moncton, saint-john, st-johns), a city inside one ("burnaby" = vancouver, "sherwood park" = edmonton), a province code (AB, BC, MB, SK, ON, QC, NS, NB, NL) or "all" for the whole directory (~6,100 companies). Ignored when you give category pages or company URLs.

## `categoryPageUrls` (type: `array`):

RenovationFind city/category pages, e.g. https://www.renovationfind.com/ab/edmonton/bathroom-renovations or on/toronto/flooring. Every company the page lists is exported (these pages list certified companies). Replaces `markets` for the run.

## `companyUrls` (type: `array`):

Specific profiles to refresh, e.g. https://www.renovationfind.com/companies/integrity-construction-solutions-6195. Replaces `markets` for the run.

## `certifiedOnly` (type: `boolean`):

Keep only companies that passed RenovationFind's screening (letter rating + verified checks + street address). About half the directory; the rest are unclaimed listings that still publish a phone and website. Skipped companies are never charged.

## `minVerifiedChecks` (type: `integer`):

Keep only certified companies with at least this many of RenovationFind's 7 checks verified (credit, legal, complaint review, business insurance, workers' compensation, municipal licence, BBB). 0 = no filter. Skipped companies are never charged.

## `categoryKeywords` (type: `array`):

Keep only companies whose categories (or name) contain one of these words, e.g. "roof", "plumb", "basement", "hvac", "window". Case-insensitive. Skipped companies are never charged.

## `requirePhone` (type: `boolean`):

Skip companies that publish no phone on their profile. Skipped companies are never charged.

## `requireWebsite` (type: `boolean`):

Skip companies whose only web presence is a RenovationFind mini-site or a social page. Skipped companies are never charged.

## `excludeClosed` (type: `boolean`):

Skip profiles whose description carries a closure notice ("OUT OF BUSINESS", "permanently closed", "ceasing operations", "no longer in operation"). Turn off to receive them with businessClosedNotice = true. Skipped companies are never charged.

## `collapseDuplicateListings` (type: `boolean`):

RenovationFind creates a separate profile per market for chains and multi-city firms (one design firm has 21). With this on, a profile with the same name and the same phone or website as one already delivered is skipped and not charged. Turn off to receive every profile id.

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

Stop after delivering this many companies (cost guard). Set 0 for no limit — every company in the chosen markets.

## `concurrency` (type: `integer`):

The most profile pages fetched at once. RenovationFind's server slows down for everyone under load, so the actor adapts: it halves its parallelism when pages start taking over 15 seconds (median of the last 8) and adds one back after a run of normal ones, never above this number.

## `requestTimeoutSecs` (type: `integer`):

Hard deadline for a single page request; a slow request is retried.

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

Not needed: renovationfind.com answers Apify's servers directly (the default, and the cheapest). If you do pick an Apify proxy, choose the RESIDENTIAL group. If a proxy cannot be set up the run continues without one.

## Actor input object example

```json
{
  "markets": [
    "calgary"
  ],
  "categoryPageUrls": [],
  "companyUrls": [],
  "certifiedOnly": false,
  "minVerifiedChecks": 0,
  "categoryKeywords": [],
  "requirePhone": false,
  "requireWebsite": false,
  "excludeClosed": true,
  "collapseDuplicateListings": true,
  "maxResults": 20,
  "concurrency": 4,
  "requestTimeoutSecs": 60,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

## `companies` (type: `string`):

The dataset of scraped renovationfind.com companies (one item per company).

## `runSummary` (type: `string`):

Measured totals: sitemap entries vs unique companies, per-field fill (all rows and certified rows), phone and link audits, what was not charged and why.

# 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 = {
    "markets": [
        "calgary"
    ],
    "maxResults": 20
};

// Run the Actor and wait for it to finish
const run = await client.actor("scrapersdelight/renovationfind-canada-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 = {
    "markets": ["calgary"],
    "maxResults": 20,
}

# Run the Actor and wait for it to finish
run = client.actor("scrapersdelight/renovationfind-canada-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 '{
  "markets": [
    "calgary"
  ],
  "maxResults": 20
}' |
apify call scrapersdelight/renovationfind-canada-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,scrapersdelight/renovationfind-canada-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/qgZ3tfI1FKtrChHOb/builds/sSbv1rCPsDj5QNA5l/openapi.json
