# Google Maps Contacts Scraper (`parseforge/google-maps-contacts-scraper`) Actor

Google Maps businesses with phone, full address, rating and website, plus the email their site publishes. Contacts charged only when found. Export CSV, Excel, JSON, XML.

- **URL**: https://apify.com/parseforge/google-maps-contacts-scraper.md
- **Developed by:** [ParseForge](https://apify.com/parseforge) (community)
- **Categories:** Lead generation, Automation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.20 / 1,000 place scrapeds

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

![ParseForge Banner](https://github.com/ParseForge/apify-assets/blob/ad35ccc13ddd068b9d6cba33f323962e39aed5b2/banner.jpg?raw=true)

## 📍 Google Maps Contacts Scraper

> 🚀 **Export any Google Maps search into a mailable contact list in seconds.** Type the search you would type yourself ("dentists in Austin, TX") and every business comes back as a flat row: name, category, rating, review count, full address, phone, opening hours, Google place ID **and its website**, then the Actor opens that website and takes the email, phone, contact form and social profiles it publishes today.

Every leads Actor in this category collects the same complaint, in the same words: *"Phone numbers but few emails"*, *"It doesn't pull email or social media accounts like it says it does"*, *"extracts 90% of records without emails! I set 'Include Email' = ON"*. They charge an enrichment fee and hand back an empty column.

This one reads the business's own website, which is the one place a contact is current by definition, and **charges the contact only when it actually finds one**. On a measured comparison of 46 live company sites, that method filled the email column on 72% of them against 12% for the Actors it was benchmarked against.

| 🎯 Target Audience | 💡 Primary Use Cases |
|---|---|
| Sales and outbound teams | Build a local prospect list with real inboxes, not just switchboard numbers |
| Agencies and consultancies | Map every competitor or prospect in a service area |
| Local SEO and marketing | Audit categories, ratings and websites across a city |
| Data teams | Enrich a CRM with places and contacts that are live today |

### 📋 What the Google Maps Contacts Scraper does

> 💡 **Why it matters:** the website is the field the whole category charges extra for. Google publishes it in the same response as the place itself, so here it comes with the base row and costs you nothing on top.

- 🔎 **Searches the way you do.** "plumbers in Denver, CO", "hotels Lisbon", "dentistas en Madrid". One line per search, as many searches as you like.
- 📍 **Full place record.** Name, category, star rating, review count, full street address with city and postcode, phone, opening hours, Google `place_id` and feature id.
- 🌐 **Website included in the base row.** No add-on event, no second lookup to pay for. Measured 2026-09-17 across 100 places: the website was present on 100 of 100.
- 📧 **Reads that website for contacts.** Emails (including `name [at] domain [dot] com` obfuscation and Cloudflare-protected addresses), phones, contact form, postal address and six social profiles.
- 💸 **The contact is charged only when it is found.** A business whose site publishes nothing costs you nothing extra. A place with no website costs you nothing extra.
- 🆓 **Filters are free.** Every leader in this category bills a per-place fee for each filter you switch on. Here, "only places with a website" and "only places with a contact" cost nothing, and skipped places are never billed.
- 🌍 **Works outside the US.** Spanish, German and other European searches are routed past Google's consent wall automatically, and come back with local numbers and local domains.
- 🔁 **Clean data:** one row per business, deduplicated by Google place ID, the same 39 columns every time, `N/A` instead of blank cells, and `error` reserved for failures.

### 🎬 Full Demo (🚧 Coming soon)

A short walkthrough video is in production.

### 📊 Output

| Field | Type | Description |
|---|---|---|
| 🖼 `imageUrl` | string | The business's own share image or logo, from its website |
| 🏢 `name` | string | Business name as Google lists it |
| 🏷 `category` | string | Google's own category, in your chosen language |
| ⭐ `rating` | number | Star rating |
| 🗳 `reviewsCount` | integer | Number of Google reviews |
| 📍 `address` | string | Full address: street, town, region and postcode |
| 📞 `mapsPhone` | string | The phone Google publishes for the business |
| 🕘 `openingHours` | string | Current status and next opening, as Google shows it |
| 🆔 `placeId` | string | Google place ID (`ChIJ...`), stable across runs |
| 🆔 `ftid` | string | Google feature ID (`0x...:0x...`) |
| 🔗 `website` | string | The business website |
| 🌐 `domain` | string | Normalised domain, without `www.` |
| 🏷 `companyName` | string | The name the site calls itself, from schema.org or the title |
| 📝 `description` | string | The business's own description of itself |
| 📧 `primaryEmail` | string | The best address to write to |
| 🔢 `emailCount` | integer | How many distinct addresses were found |
| ☎️ `primaryPhone` | string | The first number published on the site |
| 🔢 `phoneCount` | integer | How many distinct numbers were found |
| 📨 `contactFormUrl` | string | Page carrying a contact form, when there is one |
| 🏙 `city` | string | Town or city, from the site's own data |
| 🗺 `region` | string | State, province or region |
| 📮 `postalCode` | string | Postal or ZIP code |
| 🌍 `country` | string | Country |
| 💼 `linkedinUrl` | string | Company LinkedIn page |
| 📘 `facebookUrl` | string | Facebook page |
| 📸 `instagramUrl` | string | Instagram profile |
| 🐦 `twitterUrl` | string | X / Twitter profile |
| ▶️ `youtubeUrl` | string | YouTube channel |
| 🎵 `tiktokUrl` | string | TikTok profile |
| 🔢 `socialProfileCount` | integer | How many social profiles were found |
| ✅ `hasContactChannel` | string | `Yes` when the row carries an email or a phone |
| 🔎 `searchQuery` | string | The search this business came from |
| #️⃣ `resultPosition` | integer | Its position in that search |
| 🧭 `websiteSource` | string | `maps` when Google published the website, otherwise the engine that found it |
| 📄 `pagesCrawled` | integer | How many pages of the site were read |
| 📧 `emails` | array | Every address found |
| ☎️ `phones` | array | Every number found |
| 🕒 `scrapedAt` | string | ISO timestamp |
| ⚠️ `error` | string | `null` on a normal row |

#### Example rows

```json
{
  "imageUrl": "https://cdn.prod.website-files.com/646b55d542ec693e8b4fd7de/6489885fd4ce35834ab7caee_OG%20(2)%20(1).png",
  "name": "Hentschel x Lanza PLLC",
  "category": "Law firm",
  "rating": 5,
  "reviewsCount": 156,
  "address": "2665 S Bayshore Dr STE 220, Miami, FL 33133",
  "mapsPhone": "(305) 440-4015",
  "openingHours": "Open 24 hours",
  "placeId": "ChIJMx6aWRu32YgRxg5YYCPvftQ",
  "ftid": "0x88d9b71b599a1e33:0xd47eef2360580ec6",
  "website": "https://www.hxl-law.com/",
  "domain": "hxl-law.com",
  "companyName": "Hentschel x Lanza PLLC",
  "description": "Discover Hentschel x Lanza PLLC – a Miami boutique law firm specializing in personal injury and insurance recovery. Explore our professional services today.",
  "primaryEmail": "info@gmail.com",
  "emailCount": 1,
  "primaryPhone": "+13054404015",
  "phoneCount": 3,
  "contactFormUrl": "https://www.hxl-law.com/",
  "city": "N/A",
  "region": "N/A",
  "postalCode": "N/A",
  "country": "N/A",
  "linkedinUrl": "https://www.linkedin.com/company/hentschel-x-lanza-pllc",
  "facebookUrl": "N/A",
  "instagramUrl": "https://www.instagram.com/hentschel_x_lanza",
  "twitterUrl": "N/A",
  "youtubeUrl": "N/A",
  "tiktokUrl": "N/A",
  "socialProfileCount": 2,
  "hasContactChannel": "Yes",
  "searchQuery": "law firms in Miami, FL",
  "resultPosition": 12,
  "websiteSource": "maps",
  "pagesCrawled": 1,
  "emails": [
    "info@gmail.com"
  ],
  "phones": [
    "+13054404015",
    "13054404015",
    "+17139033031"
  ],
  "scrapedAt": "2026-09-18T00:52:20.686Z",
  "error": null
}
```

```json
{
  "imageUrl": "https://speed-plumbing.com/wp-content/uploads/2025/02/Logo.png",
  "name": "Speed plumbing",
  "category": "Plumber",
  "rating": 5,
  "reviewsCount": 260,
  "address": "19 S Harrison St, Denver, CO 80209",
  "mapsPhone": "(720) 670-6361",
  "openingHours": "Open 24 hours",
  "placeId": "ChIJbzthr81_bIcRudLONrHPcJ8",
  "ftid": "0x876c7fcdaf613b6f:0x9f70cfb136ced2b9",
  "website": "https://speed-plumbing.com/",
  "domain": "speed-plumbing.com",
  "companyName": "Speed Plumbing",
  "description": "Speed Plumbing is a trusted plumbing company in Denver, CO offering plumbing repair, drain cleaning, water heater repair, sewer services, leak detection, and 24/7 emergency plumbing.",
  "primaryEmail": "contact@speed-plumbing.com",
  "emailCount": 2,
  "primaryPhone": "+17206706361",
  "phoneCount": 1,
  "contactFormUrl": "https://speed-plumbing.com/",
  "city": "Denver",
  "region": "Colorado",
  "postalCode": "80209",
  "country": "US",
  "linkedinUrl": "N/A",
  "facebookUrl": "https://www.facebook.com/profile.php",
  "instagramUrl": "https://www.instagram.com/speed_plumbing",
  "twitterUrl": "N/A",
  "youtubeUrl": "N/A",
  "tiktokUrl": "N/A",
  "socialProfileCount": 2,
  "hasContactChannel": "Yes",
  "searchQuery": "plumbers in Denver, CO",
  "resultPosition": 6,
  "websiteSource": "maps",
  "pagesCrawled": 1,
  "emails": [
    "speedplumbingservices@gmail.com",
    "contact@speed-plumbing.com"
  ],
  "phones": [
    "+17206706361"
  ],
  "scrapedAt": "2026-09-18T00:52:28.143Z",
  "error": null
}
```

```json
{
  "imageUrl": "N/A",
  "name": "JMLAW, P.A.",
  "category": "Law firm",
  "rating": 4.9,
  "reviewsCount": 73,
  "address": "1221 Brickell Ave Suite 900, Miami Beach, FL 33139",
  "mapsPhone": "(305) 507-9092",
  "openingHours": "Open 24 hours",
  "placeId": "ChIJU4POEoG22YgRgGBdv5x0GDU",
  "ftid": "0x88d9b68112ce8353:0x3518749cbf5d6080",
  "website": "http://knowyourdefense.com/",
  "domain": "knowyourdefense.com",
  "companyName": "N/A",
  "description": "N/A",
  "primaryEmail": "N/A",
  "emailCount": 0,
  "primaryPhone": "(305) 507-9092",
  "phoneCount": 0,
  "contactFormUrl": "N/A",
  "city": "N/A",
  "region": "N/A",
  "postalCode": "N/A",
  "country": "N/A",
  "linkedinUrl": "N/A",
  "facebookUrl": "N/A",
  "instagramUrl": "N/A",
  "twitterUrl": "N/A",
  "youtubeUrl": "N/A",
  "tiktokUrl": "N/A",
  "socialProfileCount": 0,
  "hasContactChannel": "No",
  "searchQuery": "law firms in Miami, FL",
  "resultPosition": 7,
  "websiteSource": "maps",
  "pagesCrawled": 0,
  "emails": [],
  "phones": [],
  "scrapedAt": "2026-09-18T00:52:20.090Z",
  "error": null
}
```

### ✨ Why choose this Actor

- 📧 **The email column is actually filled.** 72% of 46 live company sites published one, against 12% for the Actors this method was benchmarked against.
- 💸 **You are billed for what you get.** The contact event fires only when the site published an email or a phone that Google did not already give you.
- 🆓 **No filter fees and no start fee.** A run that finds nothing costs nothing.
- 🔗 **The website is part of the base row**, not a paid add-on.
- 🆔 **Google place ID on every row**, so a second run updates your records instead of duplicating them.

### 📈 How it compares to alternatives

| | This Actor | Typical leader in this category |
|---|---|---|
| Website | Included in the base row | Charged as an add-on |
| Contact enrichment | Charged only when a contact is found | Charged per place, found or not |
| Filters | Free | $0.001 to $0.0015 per place, per filter |
| Email hit rate | 72% measured on live sites | "extracts 90% of records without emails" (their reviews) |
| Start fee | None | Common |

### 🚀 How to use

1. [Create a free Apify account with $5 in credit](https://console.apify.com/sign-up?fpr=vmoqkp), then open the [Google Maps Contacts Scraper](https://apify.com/parseforge/google-maps-contacts-scraper?fpr=vmoqkp) and type your searches, one per line, exactly as you would type them into Google Maps.
2. Set how many places you want per search, and the maximum for the run.
3. Leave the contact steps on to get emails and phones, or switch them off for a places-only list.
4. Run it, then download CSV, Excel, JSON or XML, or pull the dataset over the API.

Free-plan runs return up to 10 places as a preview. [Upgrade your Apify plan](https://console.apify.com/sign-up?fpr=vmoqkp) to collect up to 1,000,000 places per run.

A single search returns up to roughly 250 places, which is Google's own ceiling. To go deeper into a city, split it: "dentists in North Austin", "dentists in South Austin", or one search per postcode.

### 💼 Business use cases

- Build a cold-outreach list for a service area, with an inbox on each row.
- Map every competitor in a category and see who has a website and who does not.
- Feed a CRM with places keyed by Google place ID, then re-run monthly to refresh.
- Find businesses with high ratings but no website: a ready-made prospect list for web agencies.

### 🔌 Automating Google Maps Contacts Scraper

Schedule it, chain it, or call it from the API. Every run writes a dataset you can pull with the Apify client in any language, and the place ID makes incremental updates safe.

### 🌟 Beyond business use cases

- Find every clinic, school or charity in a town and the address to write to.
- Check which businesses in your category still have no website at all.
- Keep a personal list of local suppliers with a working phone on every row.

### 🤖 Ask an AI assistant about this scraper

Paste this into ChatGPT, Claude or any assistant with web access:

> I want a contact list of local businesses from Google Maps. Look at https://apify.com/parseforge/google-maps-contacts-scraper and tell me how to configure a run over 10 cities, what each of the 39 output fields means, and exactly when each event is charged.

### ❓ Frequently Asked Questions

#### 🔎 What do I put in the search box?

Whatever you would type into Google Maps: a category plus an area. "plumbers in Denver, CO", "hotels Lisbon", "zahnarzt berlin". The area lives in the query, so you do not need coordinates.

#### 📍 How many places can I get per search?

Google's local results run out at around 250 per query. Ask for more by splitting the area into neighborhoods or postcodes.

#### 🌐 Do all places have a website?

Almost all do. When Google publishes no website for a business, the Actor looks one up on a free search engine, and only then falls back to a paid lookup, which you can switch off.

#### 💸 When am I charged?

For each place row you receive; for a contact only when the business site published an email or a phone that was not already on the Maps row; and for a website lookup only when Google had no website and one had to be found elsewhere. Filters and skipped places are free, and there is no start fee.

#### 📧 How often is an email actually found?

On a measured run of 46 live company sites, 72% published an email and 78% published an email or a phone. Small businesses in some countries prefer a contact form; those rows carry `contactFormUrl` instead.

#### 🌍 Does it work outside the United States?

Yes. European searches hit Google's consent page, and the Actor routes around it automatically; a Madrid search returns Madrid practices with `+34` numbers and `.es` domains.

#### 🛡️ Do I need a proxy?

No. Everything needed is included.

#### ⚠️ What do `N/A` values mean?

The field genuinely was not published. Blank cells are never used, so a spreadsheet column stays readable.

#### 📄 What output formats are supported?

CSV, Excel, JSON, XML, JSONL and RSS, from the dataset or the API.

#### 🆔 What is the place ID for?

It is Google's own key for the business. Re-run the same search next month and match on `placeId` to update rows instead of duplicating them.

#### 📄 How many pages of each website are read?

The home page first. If it already carries an email, nothing more is requested. Otherwise the Actor follows the site's own contact, about or imprint links, up to the limit you set.

#### ❌ What happens when a website does not answer?

It is retried once through a proxy exit. If it still fails, the place is delivered with its Maps fields and no contact, and the contact event is not charged.

### 🔌 Integrate with any app

The dataset is available through the Apify API the moment the run finishes. Use the `run-sync-get-dataset-items` endpoint for one-shot calls, webhooks to trigger downstream jobs, or the Make, Zapier, Airbyte and LangChain integrations listed on the Actor page.

### 🔗 Recommended Actors

- [Website Contact & Leads Scraper](https://apify.com/parseforge/website-contact-leads-scraper?fpr=vmoqkp)
- [Google Search Results Scraper](https://apify.com/parseforge/google-search-scraper?fpr=vmoqkp)
- [LinkedIn Company Profiles Scraper](https://apify.com/parseforge/linkedin-company-profiles-scraper?fpr=vmoqkp)
- [Crunchbase Scraper](https://apify.com/parseforge/crunchbase-scraper?fpr=vmoqkp)
- [Contact Info Scraper](https://apify.com/parseforge/contact-info-scraper?fpr=vmoqkp)

***

> 💡 **Pro Tip:** browse the complete [ParseForge collection](https://apify.com/parseforge?fpr=vmoqkp).

**🆘 Need Help?** [Open our contact form](https://tally.so/r/BzdKgA) with your run ID, your input and what you expected.

> **⚠️ Disclaimer:** This Actor is an independent tool and is not affiliated with, endorsed by, or sponsored by Google or by any of the businesses whose websites it reads. It collects only publicly available data. You are responsible for using the collected contact data in compliance with applicable law, including GDPR and other privacy and anti-spam rules in your jurisdiction.

# Actor input Schema

## `searchQueries` (type: `array`):

One line per search, exactly as you would type it into Google Maps: "dentists in Austin, TX", "plumbers Manchester UK", "hotels Lisbon". Each query returns up to about 250 places, so split a large city into neighborhoods or postcodes to go deeper.

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

Stop after this many places. Free users get up to 10 results per run; paid users get up to 1,000,000.

## `maxPlacesPerQuery` (type: `integer`):

How many places to take from each search before moving to the next one. Google's local results run out at around 250 per query.

## `country` (type: `string`):

Two-letter country code for the search, such as us, gb, de, es, br. Match it to the area you are searching or the results drift to another market.

## `language` (type: `string`):

Language code for the results, such as en, es, de, pt.

## `resolveWebsites` (type: `boolean`):

On by default. Google Maps never publishes the website in its local results, so the Actor looks it up for every place. Turn it off to get name, category, rating, address and phone only, at the lowest price.

## `extractContacts` (type: `boolean`):

On by default. Opens the business's own site and takes the contact details it publishes today: emails, phones, contact form, socials. A site that publishes nothing is never charged for.

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

Off by default. Turn it on to drop places with no website at all; they are skipped and never charged.

## `requireContact` (type: `boolean`):

Off by default. Turn it on to keep only places whose website published an email or a phone. Skipped places are never charged.

## `maxPagesPerSite` (type: `integer`):

The home page is read first. If it already carries an email, no further page is requested. Otherwise the Actor follows the site's own contact, about or imprint links, up to this many pages.

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

How many businesses to enrich at the same time. Higher is faster until the proxy pool, not the sites, becomes the limit.

## `websiteFallbackSerp` (type: `boolean`):

On by default. Website lookups run on a free engine first; the places it cannot resolve are looked up on Google, which costs a fraction of a cent each. Turn it off to never spend on the fallback, at the cost of a few missing websites.

## `directSiteRequests` (type: `boolean`):

On by default: business websites are read straight from the run, which is faster, and a site that fails is tried once more through the proxy. Search always uses the proxy. Turn it off to send every request through the proxy below.

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

The proxy used for website lookups and for retrying business sites. The datacenter pool is the default and its transfer is not billed.

## Actor input object example

```json
{
  "searchQueries": [
    "dentists in Austin, TX",
    "plumbers in Denver, CO"
  ],
  "maxItems": 10,
  "maxPlacesPerQuery": 60,
  "country": "us",
  "language": "en",
  "resolveWebsites": true,
  "extractContacts": true,
  "requireWebsite": false,
  "requireContact": false,
  "maxPagesPerSite": 3,
  "concurrency": 10,
  "websiteFallbackSerp": true,
  "directSiteRequests": true,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "BUYPROXIES94952"
    ]
  }
}
```

# Actor output Schema

## `overview` (type: `string`):

Key fields

## `fullData` (type: `string`):

Complete dataset with all 39 fields

# 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 = {
    "searchQueries": [
        "dentists in Austin, TX",
        "plumbers in Denver, CO"
    ],
    "maxItems": 10
};

// Run the Actor and wait for it to finish
const run = await client.actor("parseforge/google-maps-contacts-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 = {
    "searchQueries": [
        "dentists in Austin, TX",
        "plumbers in Denver, CO",
    ],
    "maxItems": 10,
}

# Run the Actor and wait for it to finish
run = client.actor("parseforge/google-maps-contacts-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 '{
  "searchQueries": [
    "dentists in Austin, TX",
    "plumbers in Denver, CO"
  ],
  "maxItems": 10
}' |
apify call parseforge/google-maps-contacts-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,parseforge/google-maps-contacts-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/eRFHwcnOhMf8Sexcq/builds/6U1cYz0kT6knpj8AZ/openapi.json
