# Booksy Business Data Scraper (`datascraperes/booksy-scraper`) Actor

Extract Booksy business listings and detailed profiles across 16 countries plus New York. Discover active categories, paginate large result sets by regional facets, and export structured data such as ratings, reviews, services, prices, opening hours, locations and photos when available.

- **URL**: https://apify.com/datascraperes/booksy-scraper.md
- **Developed by:** [DataScraperES](https://apify.com/datascraperes) (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

from $0.75 / 1,000 business results

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?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.
Actors are written with capital "A".

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

**Booksy Business Data Scraper collects Booksy business listings or complete business profiles across all 16 supported countries, with an optional New York regional profile.** Select one or more profiles, optionally restrict categories, and receive one structured Dataset item per discovered business.

### What this Actor does

The Actor queries Booksy's public customer-facing listing and business-detail endpoints using the country-specific domain, language, category IDs, and current regional facets. It supports Argentina (`ar`), Australia (`au`), Brazil (`br`), Canada (`ca`), Chile (`cl`), Colombia (`co`), France (`fr`), Ireland (`ie`), Mexico (`mx`), the Netherlands (`nl`), Poland (`pl`), Portugal (`pt`), South Africa (`za`), Spain (`es`), the United Kingdom (`gb`), the United States (`us`), and the optional New York State regional profile (`ny`). For an uncapped high-volume category, the Actor reads the current country root from Booksy's listing metadata and fans out through live regional facets before paginating, avoiding the API's 10,000-result response cap where Booksy exposes usable regions.

In `listings` mode, each Dataset item contains the category context and the business object returned by Booksy's search endpoint. In `details` mode, the Actor first discovers businesses and then retrieves the corresponding profile records, which can include services, prices, opening hours, location data, reviews, and photos when Booksy returns them.

### Use cases

- Build a country- or category-specific directory of Booksy businesses.
- Export business profile data for market research and enrichment.
- Compare the availability of beauty, wellness, health, home, and professional services across supported Booksy markets.

### How to use

1. Open the Actor in Apify Console.
2. Choose one or more country or regional profiles, then select `listings` or `details` mode.
3. Click **Start** and open the Dataset when the run finishes.

### Input

`countryCodes` defaults to the 16 countries. Add `ny` explicitly when the New York regional profile is required. Use `categories` to pass exact current category slugs; an empty list discovers the current active category catalog from Booksy for every selected profile. `maxBusinessesPerCategory` is an optional safety limit applied after deduplication; bounded runs may use the first national page, while uncapped high-volume categories use regional fan-out. The input form is prefilled with one US hair-salon result for a quick first test; this does not change the broader API defaults. The default request spacing is 100 ms; raise `requestDelayMs` only when a more conservative crawl is required. The Actor uses a fixed, internally tuned concurrency and retry policy, writes partial error items when enabled, and automatically persists compact progress checkpoints so interrupted runs can resume.

```json
{
  "countryCodes": ["es", "fr", "br"],
  "mode": "listings",
  "categories": ["barberia", "barbier"],
  "maxBusinessesPerCategory": 1000,
  "requestDelayMs": 100,
  "resume": true
}
```

Category names are profile-specific, so a name that exists in one country may not exist in another. The Actor refreshes category IDs at run time because historical IDs can change. It deduplicates businesses by Booksy business ID across every region in each profile and category collection.

### Output

Results are written to the Actor Dataset in small batches, and the run's **Output** tab links directly to those results. Successful items include `status`, `recordKey`, `profile`, `country`, `categoryId`, `category`, `mode`, `businessId`, `sourceUrl`, `scrapedAt`, and `business`. Failed pages or detail requests can be represented by `status: "error"` items containing `error`, allowing downstream users to distinguish an empty result from a failed request. The `business` value is the complete object returned for that listing or detail request; its nested fields can vary by country and by Booksy record.

```json
{
  "status": "success",
  "profile": "us",
  "country": "USA",
  "categoryId": 1,
  "category": "hair-salon",
  "mode": "listing",
  "businessId": 672779,
  "recordKey": "us:1:672779",
  "sourceUrl": "https://us.booksy.com/core/v2/customer_api/businesses",
  "business": {
    "id": 672779,
    "name": "Xtreme Beauty Salon",
    "slug": "xtreme-beauty-salon",
    "subdomain": "xtremebeautysalon",
    "regions": [
      {
        "id": 11339,
        "name": "Hennepin County",
        "full_name": "Hennepin County, MN",
        "slug": "hennepin-county",
        "type": "county",
        "latitude": 45.014924,
        "longitude": -93.4872895291357
      },
      {
        "id": 10022,
        "name": "Minnesota",
        "full_name": "Minnesota",
        "slug": "minnesota",
        "type": "state",
        "latitude": 46.4418575,
        "longitude": -94.5024953923838
      },
      {
        "id": 134619,
        "name": "Minneapolis",
        "full_name": "Minneapolis, MN",
        "slug": "minneapolis",
        "type": "city",
        "latitude": 44.9707515,
        "longitude": -93.2681934955438
      },
      {
        "id": 7,
        "name": "USA",
        "full_name": "USA",
        "slug": "usa",
        "type": "country",
        "latitude": 39.828127,
        "longitude": -98.579404
      },
      {
        "id": 55749,
        "name": "55408",
        "full_name": "55408",
        "slug": "55408",
        "type": "zip",
        "latitude": 44.9365835,
        "longitude": -93.2991686445531
      }
    ],
    "location": {
      "coordinate": {
        "latitude": 44.94292,
        "longitude": -93.28272
      },
      "city": "Minneapolis",
      "address": "2815 Hennepin Ave, Minneapolis, 55408"
    },
    "distance": null,
    "reviews_count": 534,
    "reviews_stars": 5,
    "reviews_rank": 4.908239700374532,
    "images": {
      "cover": [
        {
          "image_id": 28552715,
          "business_id": 672779,
          "tags": [],
          "staffers": [],
          "description": null,
          "image": "https://d2zdpiztbgorvt.cloudfront.net/region1/us/672779/biz_photo/53d4a84aeb3f4b07b5260bd62bffaa-xtreme-beauty-salon-biz-photo-c889e546c62b4beba1656806f46c05-booksy.jpeg",
          "height": 334,
          "width": 594,
          "category": "biz_photo",
          "is_cover_photo": true,
          "inspiration_categories": [],
          "order": 1,
          "visible": true,
          "active": true,
          "created": "2024-12-18T14:53:48"
        }
      ],
      "inspiration": [
        {
          "image_id": 33361844,
          "business_id": 672779,
          "tags": [],
          "staffers": [],
          "description": "",
          "image": "https://d2zdpiztbgorvt.cloudfront.net/region1/us/672779/inspiration/b2a933e366ec4e1ea86af7e949b0e1-xtreme-beauty-salon-inspiration-b9e72ce7bac044c5b47264d03f3ab9-booksy.jpeg",
          "height": 3520,
          "width": 1980,
          "category": "inspiration",
          "is_cover_photo": false,
          "inspiration_categories": [
            1
          ],
          "order": 0,
          "visible": true,
          "active": true,
          "created": "2026-07-19T14:24:04"
        },
        {
          "image_id": 33361843,
          "business_id": 672779,
          "tags": [],
          "staffers": [],
          "description": "",
          "image": "https://d2zdpiztbgorvt.cloudfront.net/region1/us/672779/inspiration/af8e36bd666048ccbe7e9455d74578-xtreme-beauty-salon-inspiration-77e3db60ae2d4848b7355e57f08c5b-booksy.jpeg",
          "height": 2340,
          "width": 1755,
          "category": "inspiration",
          "is_cover_photo": false,
          "inspiration_categories": [
            1
          ],
          "order": 1,
          "visible": true,
          "active": true,
          "created": "2026-07-19T14:24:03"
        },
        {
          "image_id": 33361842,
          "business_id": 672779,
          "tags": [],
          "staffers": [],
          "description": "",
          "image": "https://d2zdpiztbgorvt.cloudfront.net/region1/us/672779/inspiration/495a9f73fb8743899c6dc63c095ce3-xtreme-beauty-salon-inspiration-1c7c1788268240779cd7dd12c28086-booksy.jpeg",
          "height": 3520,
          "width": 1980,
          "category": "inspiration",
          "is_cover_photo": false,
          "inspiration_categories": [
            1
          ],
          "order": 2,
          "visible": true,
          "active": true,
          "created": "2026-07-19T14:23:59"
        },
        {
          "image_id": 33361841,
          "business_id": 672779,
          "tags": [],
          "staffers": [],
          "description": "",
          "image": "https://d2zdpiztbgorvt.cloudfront.net/region1/us/672779/inspiration/bd27cacee312464796c1035c6b1f79-xtreme-beauty-salon-inspiration-d72ceeea2e5f483c9af7a257bc1f30-booksy.jpeg",
          "height": 3520,
          "width": 1980,
          "category": "inspiration",
          "is_cover_photo": false,
          "inspiration_categories": [
            1
          ],
          "order": 3,
          "visible": true,
          "active": true,
          "created": "2026-07-19T14:23:57"
        }
      ],
      "logo": [
        {
          "image_id": 22208362,
          "business_id": 672779,
          "tags": [],
          "staffers": [],
          "description": null,
          "image": "https://d2zdpiztbgorvt.cloudfront.net/region1/us/672779/logo/3026cd1b269b4ae5bfeee9ebd5b264-xtreme-beauty-salon-logo-02bc1d333df84f87a98db5d7429430-booksy.jpeg",
          "height": 156,
          "width": 424,
          "category": "logo",
          "is_cover_photo": false,
          "inspiration_categories": [],
          "order": 0,
          "visible": true,
          "active": true,
          "created": "2022-02-01T02:08:29"
        }
      ],
      "biz_photo_count": null,
      "biz_photo_per_page": 20
    },
    "primary_category": 1,
    "service_categories": [
      {
        "id": null,
        "name": "",
        "order": 0,
        "show_first": -1,
        "services": [
          {
            "id": 4309981,
            "name": "Quick weave",
            "active": true,
            "order": 0,
            "padding_type": null,
            "description": "",
            "description_type": "P",
            "note": "",
            "suggest_services": {
              "input": [
                "Quick weave",
                "Quick",
                "weave"
              ],
              "contexts": {
                "business_categories": [
                  "6",
                  "1",
                  "657",
                  "*"
                ],
                "is_b_listing": false,
                "location": "44.94292,-93.28272"
              }
            },
            "staffer_id": [
              598641
            ],
            "variants": [
              {
                "id": 12593318,
                "duration": 120,
                "price": 100.0,
                "type": "X",
                "deposit": 0.0,
                "deposit_tax": 0.0,
                "prepayment": 20.0,
                "prepayment_tax": 0.0,
                "promotion": null,
                "label": "",
                "combo_children": [],
                "staffer_id": [
                  598641
                ],
                "service_price": "$100.00",
                "omnibus_price": null
              }
            ],
            "treatment": {
              "id": 760,
              "name": "Quick Weave"
            },
            "treatment_id": 760,
            "treatment_parent_id": 657,
            "is_available_for_customer_booking": true,
            "photos": [],
            "is_online_service": false,
            "is_traveling_service": false,
            "addons_available": false,
            "combo_type": null,
            "price": 100.0,
            "type": "X",
            "partner_app_data": {},
            "note_text": ""
          },
          {
            "id": 4309976,
            "name": "Wash and Set",
            "active": true,
            "order": 1,
            "padding_type": null,
            "description": "",
            "description_type": "P",
            "note": "",
            "suggest_services": {
              "input": [
                "Wash and Set",
                "Wash",
                "and",
                "Set"
              ],
              "contexts": {
                "business_categories": [
                  "6",
                  "1",
                  "657",
                  "*"
                ],
                "is_b_listing": false,
                "location": "44.94292,-93.28272"
              }
            },
            "staffer_id": [
              598641
            ],
            "variants": [
              {
                "id": 12593317,
                "duration": 90,
                "price": 80.0,
                "type": "X",
                "deposit": 0.0,
                "deposit_tax": 0.0,
                "prepayment": 20.0,
                "prepayment_tax": 0.0,
                "promotion": null,
                "label": "",
                "combo_children": [],
                "staffer_id": [
                  598641
                ],
                "service_price": "$80.00",
                "omnibus_price": null
              }
            ],
            "treatment": {
              "id": 833,
              "name": "Hair Wash"
            },
            "treatment_id": 833,
            "treatment_parent_id": 1,
            "is_available_for_customer_booking": true,
            "photos": [],
            "is_online_service": false,
            "is_traveling_service": false,
            "addons_available": false,
            "combo_type": null,
            "price": 80.0,
            "type": "X",
            "partner_app_data": {},
            "note_text": ""
          },
          {
            "id": 4309974,
            "name": "Silk press",
            "active": true,
            "order": 2,
            "padding_type": null,
            "description": "",
            "description_type": "P",
            "note": "",
            "suggest_services": {
              "input": [
                "Silk press",
                "Silk",
                "press"
              ],
              "contexts": {
                "business_categories": [
                  "6",
                  "1",
                  "657",
                  "*"
                ],
                "is_b_listing": false,
                "location": "44.94292,-93.28272"
              }
            },
            "staffer_id": [
              598641
            ],
            "variants": [
              {
                "id": 12593316,
                "duration": 150,
                "price": 95.0,
                "type": "X",
                "deposit": 0.0,
                "deposit_tax": 0.0,
                "prepayment": 20.0,
                "prepayment_tax": 0.0,
                "promotion": null,
                "label": "",
                "combo_children": [],
                "staffer_id": [
                  598641
                ],
                "service_price": "$95.00",
                "omnibus_price": null
              }
            ],
            "treatment": {
              "id": 619,
              "name": "Silk Press"
            },
            "treatment_id": 619,
            "treatment_parent_id": 1,
            "is_available_for_customer_booking": true,
            "photos": [],
            "is_online_service": false,
            "is_traveling_service": false,
            "addons_available": false,
            "combo_type": null,
            "price": 95.0,
            "type": "X",
            "partner_app_data": {},
            "note_text": ""
          }
        ]
      }
    ],
    "treatment_service_categories": [],
    "promoted": true,
    "manual_boost_score": 0,
    "is_recommended": true,
    "max_discount_rate": 0,
    "low_availability": false,
    "is_renting_venue": false,
    "umbrella_venue_name": "luxe",
    "contractor_description": "",
    "url": "672779_xtreme-beauty-salon_hair-salon_134619_minneapolis",
    "best_of_booksy_badge": null,
    "accept_booksy_gift_cards": false,
    "accept_booksy_pay": false,
    "staff": [],
    "reviews": [],
    "meta": {
      "score": 7116.694,
      "id": "business:672779",
      "item_no": 0
    },
    "bookmarked": false,
    "score": 7116.694
  },
  "scrapedAt": "2026-09-06T18:51:44.093552+00:00"
}
```

This is the complete Dataset item from a real successful run.

### Pricing

The Actor charges one `business-result` event for each successfully delivered business row. Error records, empty responses, and failed detail requests are not charged. The price is applied per result; the 1,000-result equivalent is shown only for comparison.

| Apify tier | Price per result | Equivalent per 1,000 results |
| --- | ---: | ---: |
| FREE | $0.001000 | $1.00 |
| BRONZE | $0.000900 | $0.90 |
| SILVER | $0.000800 | $0.80 |
| GOLD | $0.000750 | $0.75 |
| PLATINUM | $0.000750 | $0.75 |
| DIAMOND | $0.000750 | $0.75 |

The final amount depends on the number of successful business rows delivered in the Dataset and the Apify account tier used for the run. Review the Actor's **Pricing** tab for the currently effective configuration.

### Related Actors

| Actor | Best for |
| --- | --- |
| [Google Maps Business Scraper | $1 per 1,000](https://apify.com/datascraperes/actor-google-maps) | Discovering complementary local businesses and comparing Booksy coverage with Google Maps listings. |
| [Google Maps Reviews Scraper | Ratings & Replies](https://apify.com/datascraperes/google-maps-reviews-scraper) | Adding public review text, ratings, dates, and owner replies to selected businesses discovered in Booksy. |

### Limits and data quality

Coverage follows the active country/category catalog returned by Booksy at run time. The Actor requests available listing and profile data, including treatment services, SEO metadata, venues, and business details when Booksy returns them. Booksy can change category IDs, pagination, response fields, availability, or access behavior, so an HTTP success response does not guarantee that every business in a market is present. Rate limits and transient failures are retried automatically under a fixed internal policy; a failed page or detail request may therefore produce partial results rather than stopping the whole run.

Large all-country detail runs can be substantial because each business requires an additional request. Use `countryCodes`, `categories`, and `maxBusinessesPerCategory` to bound a run, and use `listings` mode when full profile data is not needed. Uncapped categories at or above Booksy's national 10,000-result boundary are split using current roots and regional facets discovered from live listing data; if Booksy does not expose usable roots, the Actor writes a category error instead of silently claiming complete coverage. The Actor deduplicates across regions, stores compact progress checkpoints in Apify's Key-Value Store, automatically persists them during execution and shutdown, and reports emitted items, errors, region progress, and throughput in the run status. Results reflect the source response at run time and are not a permanent snapshot of Booksy.

### Frequently asked questions

#### Which countries are supported?

Argentina, Australia, Brazil, Canada, Chile, Colombia, France, Ireland, Mexico, the Netherlands, Poland, Portugal, South Africa, Spain, the United Kingdom, and the United States are included by default. The optional `ny` profile uses the United States domain and is scoped to the live New York regional root.

#### What is the difference between listings and details mode?

Listings mode emits the search records returned by each category. Details mode performs an additional profile request for every discovered business and emits the returned business object when that request succeeds.

#### Can I run all countries at once?

Yes. Omitting `countryCodes` uses all 16 countries; add `ny` explicitly when needed. A full details run may be very large. Apply a category or per-category limit when testing or estimating volume.

### Responsible use

Use the Actor only where your collection and downstream use comply with applicable law, privacy requirements, and Booksy's terms and policies. You are responsible for respecting access limits and for handling any personal or business data obtained through the source.

### Support

For a problem, open the Actor's **Issues** tab and include a reproducible input, the affected profile/category, and the Apify run ID. Do not include credentials or other secrets in an issue.

For public integration examples and sanitized sample data, see the [Booksy scraper examples and sample data repository](https://github.com/datacrawler-edu/booksy-scraper-python).

# Actor input Schema

## `countryCodes` (type: `array`):

Profiles to scrape. The default covers all 16 supported countries; use ny explicitly for the optional New York regional profile.

## `mode` (type: `string`):

Listings returns search records. Details first discovers listings and then fetches each business profile.

## `categories` (type: `array`):

Optional category names from the selected profiles. Leave empty to use all configured categories.

## `maxBusinessesPerCategory` (type: `integer`):

Optional safety limit per category and profile. When set, the Actor can use the first national result page; omit it to collect all available pages and automatically split categories at the live 10,000-result boundary.

## `requestDelayMs` (type: `integer`):

Minimum delay between Booksy requests in milliseconds.

## `regionSplitThreshold` (type: `integer`):

Regions at or above this result count are subdivided before scraping.

## `maxPagesPerRegion` (type: `integer`):

Safety ceiling for pagination in a single region.

## `datasetBatchSize` (type: `integer`):

Number of items buffered before pushing to the Dataset.

## `includeErrors` (type: `boolean`):

Writes an error item for failed pages or business details instead of hiding partial failures.

## `resume` (type: `boolean`):

Uses Actor Key-Value Store checkpoints to skip units completed before a restart.

## Actor input object example

```json
{
  "countryCodes": [
    "us"
  ],
  "mode": "listings",
  "categories": [
    "hair-salon"
  ],
  "maxBusinessesPerCategory": 1,
  "requestDelayMs": 100,
  "regionSplitThreshold": 9000,
  "maxPagesPerRegion": 1,
  "datasetBatchSize": 1,
  "includeErrors": true,
  "resume": true
}
```

# Actor output Schema

## `results` (type: `string`):

One Dataset item per discovered business, with optional error items when partial failures are enabled.

# 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 = {
    "countryCodes": [
        "us"
    ],
    "mode": "listings",
    "categories": [
        "hair-salon"
    ],
    "maxBusinessesPerCategory": 1,
    "requestDelayMs": 100,
    "regionSplitThreshold": 9000,
    "maxPagesPerRegion": 1,
    "datasetBatchSize": 1,
    "includeErrors": true,
    "resume": false
};

// Run the Actor and wait for it to finish
const run = await client.actor("datascraperes/booksy-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 = {
    "countryCodes": ["us"],
    "mode": "listings",
    "categories": ["hair-salon"],
    "maxBusinessesPerCategory": 1,
    "requestDelayMs": 100,
    "regionSplitThreshold": 9000,
    "maxPagesPerRegion": 1,
    "datasetBatchSize": 1,
    "includeErrors": True,
    "resume": False,
}

# Run the Actor and wait for it to finish
run = client.actor("datascraperes/booksy-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 '{
  "countryCodes": [
    "us"
  ],
  "mode": "listings",
  "categories": [
    "hair-salon"
  ],
  "maxBusinessesPerCategory": 1,
  "requestDelayMs": 100,
  "regionSplitThreshold": 9000,
  "maxPagesPerRegion": 1,
  "datasetBatchSize": 1,
  "includeErrors": true,
  "resume": false
}' |
apify call datascraperes/booksy-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,datascraperes/booksy-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/24ggqJWpuRSIHgPc4/builds/SHHysTOKt322eJmyJ/openapi.json
