# Snupit South Africa Business Directory Scraper: Service Leads (`getascraper/snupit-business-directory-scraper`) Actor

Collect Snupit South Africa service providers for lead generation. Export names, services, locations, ratings, badges, reviews, and visible contacts to datasets for CRM, Sheets, Make, and Zapier. Use profile URLs or bounded pages, then monitor new and changed providers with pay-per-event billing.

- **URL**: https://apify.com/getascraper/snupit-business-directory-scraper.md
- **Developed by:** [GetAScraper](https://apify.com/getascraper) (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 $2.93 / 1,000 provider records

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

## 🇿🇦 Snupit South Africa Business Directory Scraper: Service Leads

<table width="100%">
<tr>
<td style="padding:24px 28px;background:#EAF4FF;border:1px solid #B8D7F5;border-top:4px solid #1769AA;border-radius:12px">
<span style="font-size:23px;font-weight:800;color:#123B5D;line-height:1.3">Get verified South African service providers, ready for your CRM.</span><br>
<span style="font-size:15px;color:#31546E;line-height:1.6">Collect names, services, locations, ratings, badges, reviews, and public contact fields from Snupit, without an account and without writing a line of code.</span>
</td>
</tr>
</table>

<table width="100%">
<tr>
<td style="padding:14px 12px;width:25%;background:#FFFFFF;border:1px solid #B8D7F5;border-radius:10px 0 0 10px;vertical-align:top">
<span style="font-size:15px;font-weight:800;color:#1769AA">🏢 Rich provider records</span><br>
<span style="font-size:12px;color:#31546E">Name, services, location, tagline, description, and source link on every row.</span>
</td>
<td style="padding:14px 12px;width:25%;background:#FFFFFF;border:1px solid #B8D7F5;border-left:none;vertical-align:top">
<span style="font-size:15px;font-weight:800;color:#1769AA">✅ Quality signals</span><br>
<span style="font-size:12px;color:#31546E">Ratings, review counts, Pro Verified and Background Checked badges per profile.</span>
</td>
<td style="padding:14px 12px;width:25%;background:#FFFFFF;border:1px solid #B8D7F5;border-left:none;vertical-align:top">
<span style="font-size:15px;font-weight:800;color:#1769AA">📞 Visible contacts</span><br>
<span style="font-size:12px;color:#31546E">Public phone, email, and website fields only, exactly as Snupit shows them.</span>
</td>
<td style="padding:14px 12px;width:25%;background:#FFFFFF;border:1px solid #B8D7F5;border-left:none;border-radius:0 10px 10px 0;vertical-align:top">
<span style="font-size:15px;font-weight:800;color:#1769AA">🔄 Recurring monitor</span><br>
<span style="font-size:12px;color:#31546E">Snapshot every match, or track only new and changed providers on a schedule.</span>
</td>
</tr>
</table>

Point this Actor at any Snupit service category, South African city, or public profile URL. It returns structured provider data with quality signals and public contacts, ready to download as JSON, CSV, or Excel.

### 🔍 What does this actor do?

Snupit is a South African marketplace for local services. This Actor turns its public provider pages into structured business-directory data for sales research, local SEO, market mapping, and CRM enrichment.

Start from public Snupit profile URLs, service pages, location pages, or public sitemap files. The output keeps each record tied to its Snupit source page.

The Actor reads public fields only. It does not access accounts, quote forms, hidden contact details, reviewer phone fragments, or linked provider websites.

### 💡 Who is this for?

- **I run a B2B lead agency serving South African SMEs.** I need a verified list of local service providers by city and category so I can pre-qualify cold outreach targets before the first call.
- **I manage the CRM for a local marketing agency.** I need to enrich our prospect database with Snupit's public ratings, badge status, and contact fields so our sales team calls warm leads.
- **I am an independent SEO consultant in Johannesburg.** I need to identify high-rating service providers without a website so I can pitch my services before a competitor does.
- **I map the home-services landscape in South Africa.** I need structured provider data by category and province to understand market density and service coverage across the country.

### 🚀 How to use it

<table width="100%">
<tr>
<td style="padding:16px 14px;width:33%;background:#EAF4FF;border:1px solid #B8D7F5;border-radius:10px 0 0 10px;vertical-align:top">
<span style="font-size:12px;font-weight:800;color:#1769AA;letter-spacing:1px">STEP 1</span><br>
<span style="font-size:14px;font-weight:700;color:#123B5D">Choose your sources</span><br>
<span style="font-size:12px;color:#31546E">Keep the prefilled profile for a quick test, or add public Snupit URLs for your target city and service.</span>
</td>
<td style="padding:16px 14px;width:33%;background:#EAF4FF;border:1px solid #B8D7F5;border-left:none;vertical-align:top">
<span style="font-size:12px;font-weight:800;color:#1769AA;letter-spacing:1px">STEP 2</span><br>
<span style="font-size:14px;font-weight:700;color:#123B5D">Set depth and filters</span><br>
<span style="font-size:12px;color:#31546E">Enable profile following, reviews, photos, or verified-only filtering to shape your export.</span>
</td>
<td style="padding:16px 14px;width:33%;background:#EAF4FF;border:1px solid #B8D7F5;border-left:none;border-radius:0 10px 10px 0;vertical-align:top">
<span style="font-size:12px;font-weight:800;color:#1769AA;letter-spacing:1px">STEP 3</span><br>
<span style="font-size:14px;font-weight:700;color:#123B5D">Export your dataset</span><br>
<span style="font-size:12px;color:#31546E">Use the Providers, Contacts, or Changes view in your next workflow or CRM import.</span>
</td>
</tr>
</table>

#### Quick start

The default input includes one public profile so a new run confirms the output immediately. To use generated service and location targets, remove the prefilled URL from `startUrls` and keep `searchTerms` and `locations` filled in.

```json
{
    "startUrls": [
        {
            "url": "https://www.snupit.co.za/johannesburg/bramley/vsc-construction-and-projects/425180"
        }
    ],
    "scrapeDetails": false,
    "maxItems": 10,
    "requestDelayMs": 1000
}
```

For a direct profile export, add one or more public profile URLs and set `scrapeDetails` to `false` or `true`. Direct profile URLs are always opened.

For a broader discovery test, use an empty `startUrls` list:

```json
{
    "startUrls": [],
    "searchTerms": ["builders", "plumbers"],
    "locations": ["Johannesburg", "Cape Town"],
    "scrapeDetails": true,
    "maxItems": 50,
    "maxSearches": 4
}
```

Snupit service and location pages may contain descriptions and review counts without provider profile links. When a source page publishes no provider links, that target produces zero provider records. Use direct profile URLs for dependable records, and treat service-page discovery as source-dependent.

### 🧭 Input

| Field            | Type             | Required | Description                                                                                                      |
| ---------------- | ---------------- | -------- | ---------------------------------------------------------------------------------------------------------------- |
| `startUrls`      | array of URLs    | No       | Public Snupit profile, service, location, or sitemap URLs. Supplied URLs take precedence over generated targets. |
| `searchTerms`    | array of strings | No       | Snupit service or category terms used with each location when `startUrls` is empty.                              |
| `locations`      | array of strings | No       | South African city or town names combined with each service term.                                                |
| `verifiedOnly`   | boolean          | No       | Keep only profiles that visibly show Snupit's Pro Verified badge.                                                |
| `minRating`      | integer          | No       | Keep records with a visible rating at or above this value. Use `0` to disable the filter.                        |
| `sortBy`         | enum             | No       | Keep source order, or sort locally by rating, review count, or provider name.                                    |
| `scrapeDetails`  | boolean          | No       | Follow provider profile links published by discovery pages. Direct profile URLs are always read.                 |
| `includeReviews` | boolean          | No       | Add visible reviews as a JSON string, excluding masked reviewer phone fragments.                                 |
| `includePhotos`  | boolean          | No       | Add visible logo and gallery image URLs from the profile page.                                                   |
| `runMode`        | enum             | No       | `snapshot` publishes every matching record. `changes` publishes only new or changed records.                     |
| `monitorScope`   | string           | No       | Name the saved comparison scope used by change-monitoring runs.                                                  |
| `maxItems`       | integer          | No       | Maximum unique provider records to publish. Range: 1 to 250.                                                     |
| `maxPages`       | integer          | No       | Maximum linked pages inspected per target. Range: 1 to 25.                                                       |
| `maxSearches`    | integer          | No       | Maximum generated service and location combinations. Range: 1 to 50.                                             |
| `requestDelayMs` | integer          | No       | Minimum delay between source requests. Range: 500 to 5000 milliseconds.                                          |

### 📦 Data table

| Field               | Type    | Description                                                           |
| ------------------- | ------- | --------------------------------------------------------------------- |
| `companyName`       | string  | Public provider name.                                                 |
| `companyId`         | string  | Snupit provider identifier when present in the profile URL.           |
| `serviceCategories` | string  | Comma-separated services shown on the public profile.                 |
| `workFocus`         | string  | Comma-separated work-focus terms shown on the public profile.         |
| `searchCategory`    | string  | Service term taken from the source target URL.                        |
| `searchCity`        | string  | City taken from the source target URL.                                |
| `city`              | string  | Public city.                                                          |
| `suburb`            | string  | Public suburb or area.                                                |
| `province`          | string  | Public province or region.                                            |
| `street`            | string  | Public street or street-level address.                                |
| `address`           | string  | Public address as displayed by Snupit.                                |
| `postalCode`        | string  | Public postal code.                                                   |
| `tagline`           | string  | Public provider tagline.                                              |
| `description`       | string  | Public page description.                                              |
| `about`             | string  | Public About Us text.                                                 |
| `businessHours`     | string  | Public business-hours text.                                           |
| `verified`          | boolean | Whether the Pro Verified badge is visible.                            |
| `backgroundChecked` | boolean | Whether a Background Checked badge is visible.                        |
| `rating`            | number  | Visible provider rating.                                              |
| `reviewCount`       | number  | Visible provider review count.                                        |
| `yearsInBusiness`   | number  | Visible years-in-business value.                                      |
| `employeeCount`     | number  | Visible employee count.                                               |
| `latestReview`      | string  | The latest visible review as a JSON string.                           |
| `reviewsJson`       | string  | All visible reviews as a JSON string when enabled.                    |
| `phone`             | string  | Public phone value explicitly shown by the provider page.             |
| `email`             | string  | Public email explicitly shown by the provider page.                   |
| `website`           | string  | Public provider website explicitly linked inside the profile content. |
| `logoUrl`           | string  | Public provider logo URL.                                             |
| `imageUrlsJson`     | string  | Visible gallery image URLs as a JSON string when enabled.             |
| `profileUrl`        | string  | Canonical public Snupit profile URL.                                  |
| `sourceUrl`         | string  | URL that caused the profile to be collected.                          |
| `recordType`        | string  | Record type, currently `provider`.                                    |
| `scrapedAt`         | string  | UTC timestamp for this collection.                                    |
| `changeType`        | string  | `new` or `updated` in changes mode.                                   |
| `firstSeenAt`       | string  | First successful observation in the monitor scope.                    |
| `lastSeenAt`        | string  | Most recent successful observation in the monitor scope.              |

#### Example output

```json
{
    "companyName": "VSC Construction And Projects",
    "companyId": "425180",
    "serviceCategories": "Builders, Electricians, Fencing, Gardeners, Gate Motors, Home Improvements, Painters, Paving, Plastering",
    "city": "Johannesburg",
    "suburb": "Bramley",
    "province": "Gauteng",
    "address": "East Avenue, Bramley, Johannesburg - 2018",
    "verified": true,
    "rating": 5,
    "reviewCount": 4,
    "profileUrl": "https://www.snupit.co.za/johannesburg/bramley/vsc-construction-and-projects/425180",
    "sourceUrl": "https://www.snupit.co.za/johannesburg/bramley/vsc-construction-and-projects/425180",
    "recordType": "provider",
    "scrapedAt": "2026-09-22T18:10:39.046Z"
}
```

### 🗂️ Dataset views

Every run uses exactly three dataset views:

- **🔍 Providers:** Names, services, location, quality signals, and source links.
- **📞 Contacts:** Public phone, email, website, address, and profile links.
- **🔄 Changes:** New and updated records from monitoring runs.

The Actor also stores a small run summary and, in changes mode, source-backed comparison state. It never stores cookies, challenge pages, or private data.

### 📡 Change monitoring

Set `runMode` to `changes` and reuse the same `monitorScope` across scheduled runs. The Actor compares public source fields by provider ID or canonical profile URL.

- The first observation is marked `new`.
- A source-backed field change is marked `updated`.
- An unchanged provider is not published again.
- Snapshot mode always publishes every unique matching provider.

### 💰 Pricing

This Actor uses pay-per-event pricing. Empty runs cost nothing, and there is no subscription. Current event pricing is shown on the Apify Store page.

### ⭐ Enjoying Snupit South Africa Business Directory Scraper: Service Leads?

<table width="100%" style="display:table;width:100%">
<tr>
<td style="padding:20px 24px 14px;background:#EAF4FF;border:1px solid #B8D7F5;border-left:5px solid #1769AA;border-radius:10px 10px 0 0">
<span style="font-size:20px;letter-spacing:4px;color:#1769AA">⭐ ⭐ ⭐ ⭐ ⭐</span><br>
<strong style="font-size:17px;color:#123B5D">Got a useful Snupit provider export?</strong><br>
<span style="font-size:14px;color:#31546E">A short rating helps other lead teams find this Actor and guides what gets built next.</span>
</td>
</tr>
<tr>
<td style="padding:0;background:#1769AA;border:1px solid #B8D7F5;border-top:none;border-radius:0 0 10px 10px;text-align:center">
<a href="https://apify.com/getascraper/snupit-business-directory-scraper/reviews" style="display:block;padding:13px 16px;color:#FFFFFF;text-decoration:none;font-weight:800;font-size:15px;letter-spacing:0.3px">★&nbsp;&nbsp;Rate this Actor on Apify</a>
</td>
</tr>
</table>

### 🌟 Tips

- **Use direct profile URLs for reliable results.** Service and location discovery pages sometimes publish no profile links. A direct profile URL always returns one record.
- **Filter by verified status first.** Set `verifiedOnly` to keep Pro Verified providers. These profiles tend to be more complete and more responsive.
- **Layer `minRating` with `verifiedOnly`.** A rating of 4 or 5 combined with verified status surfaces the highest-quality leads in a category.
- **Schedule in changes mode for ongoing lead flow.** Set `runMode` to `changes`, fix a `monitorScope`, and schedule weekly runs. The Changes view shows only new or updated providers.

### ❓ FAQ

#### Does this Actor need a Snupit account?

No. It reads public Snupit pages. Account-only fields and quote workflows are outside the scope.

#### Why did a service search return no providers?

Snupit may publish a service page with descriptions, counts, and reviews but no provider profile links. Add public profile URLs to `startUrls`, or enable `scrapeDetails` when your chosen source publishes profile links.

#### Can it find private phone numbers or hidden emails?

No. The output includes only contact values explicitly visible on the public profile page. Masked reviewer contact fragments are excluded.

#### How do I run a recurring lead monitor?

Use `runMode: "changes"` and keep the same `monitorScope`. Schedule the Actor in Apify, then read the Changes view for new and updated public profiles.

### ⚠️ Limits and public-data boundaries

- Snupit can change its page layout, available provider links, or public fields.
- Service and location pages may contain no provider profile links in the returned page.
- The Actor does not submit quote requests or use login-only pages.
- The Actor does not follow linked provider websites.
- Missing fields are omitted. No placeholder values are invented.
- Requests are serialized and bounded. A declined or challenge-like page is skipped without bypass attempts.
- Use only public data in line with Snupit's terms and applicable privacy rules.

### 🔗 Other actors

- [Bizi.si Slovenia Scraper: Slovenska podjetja for Business Leads](https://apify.com/getascraper/bizi-si-business-scraper) ↗: Collect public Slovenian company records and contacts.
- [Grotal India Business Scraper for Leads: City and Category Data](https://apify.com/getascraper/grotal-business-directory-scraper) ↗: Build Indian business lists by city and category.
- [BUSINESS.bg scraper: Bulgarian company leads, фирмени контакти](https://apify.com/getascraper/business-bg-company-leads-scraper) ↗: Collect Bulgarian company leads and public contact fields.
- [Fonecta scraper for Finnish leads: yrityshaku data in JSON](https://apify.com/getascraper/fonecta-business-leads-scraper) ↗: Search Finnish business-directory data for lead lists.
- [Expertise.com MSP lead scraper: providers by city with contacts](https://apify.com/getascraper/expertise-msp-leads-scraper) ↗: Find managed IT service providers by location.

# Changelog

This Actor's version history is a separate document: https://apify.com/getascraper/snupit-business-directory-scraper/changelog.md

# Actor input Schema

## `startUrls` (type: `array`):

Optional public Snupit profile, service, location, or sitemap URLs. When supplied, these URLs take precedence over generated search URLs. The prefilled profile is a public example that makes the default run return a real provider.

## `searchTerms` (type: `array`):

Service names or Snupit category terms used to build public city/service URLs when Public Snupit URLs is empty, for example builders, plumbers, cleaning-services, or company-registrations.

## `locations` (type: `array`):

South African city or town names combined with every service term. Use the spelling Snupit uses in its public URL, such as Johannesburg, Cape Town, Durban, or Pretoria.

## `verifiedOnly` (type: `boolean`):

Keep only profiles that visibly show Snupit's Pro Verified badge. This filter applies to provider records with profile data.

## `minRating` (type: `integer`):

Keep profiles with a visible rating at or above this value. Use 0 to keep providers with any rating or no rating yet.

## `sortBy` (type: `string`):

Order the records after collection. Source order keeps Snupit's order, while rating, review count, and name sort the records locally.

## `scrapeDetails` (type: `boolean`):

When a service, location, or sitemap page publishes provider profile links, open those profiles for the full public record. Direct profile URLs are always read.

## `includeReviews` (type: `boolean`):

Include the visible review list as a JSON string in each profile record. Reviewer phone fragments are excluded.

## `includePhotos` (type: `boolean`):

Include the visible logo and gallery image URLs from the public profile page.

## `runMode` (type: `string`):

Snapshot emits every unique matching provider. Changes emits only providers first seen or changed since the previous successful run in the same monitor scope.

## `monitorScope` (type: `string`):

A readable name for the saved change-monitoring state. Reuse the same value across scheduled runs that should be compared.

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

Maximum unique provider records to publish across all supplied or generated targets.

## `maxPages` (type: `integer`):

Maximum linked service, location, sitemap, or pagination pages inspected for each starting target.

## `maxSearches` (type: `integer`):

Maximum service and location combinations generated when Public Snupit URLs is empty.

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

Minimum delay between direct Snupit requests. Increase it for gentler scheduled collection.

## Actor input object example

```json
{
  "startUrls": [
    {
      "url": "https://www.snupit.co.za/johannesburg/bramley/vsc-construction-and-projects/425180"
    }
  ],
  "searchTerms": [
    "builders"
  ],
  "locations": [
    "Johannesburg"
  ],
  "verifiedOnly": false,
  "minRating": 0,
  "sortBy": "source",
  "scrapeDetails": false,
  "includeReviews": false,
  "includePhotos": false,
  "runMode": "snapshot",
  "monitorScope": "default",
  "maxItems": 10,
  "maxPages": 3,
  "maxSearches": 5,
  "requestDelayMs": 1000
}
```

# Actor output Schema

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

No description

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

No description

## `monitorState` (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 = {
    "startUrls": [
        {
            "url": "https://www.snupit.co.za/johannesburg/bramley/vsc-construction-and-projects/425180"
        }
    ],
    "searchTerms": [
        "builders"
    ],
    "locations": [
        "Johannesburg"
    ],
    "verifiedOnly": false,
    "minRating": 0,
    "sortBy": "source",
    "scrapeDetails": false,
    "includeReviews": false,
    "includePhotos": false,
    "runMode": "snapshot",
    "monitorScope": "default",
    "maxItems": 10,
    "maxPages": 3,
    "maxSearches": 5,
    "requestDelayMs": 1000
};

// Run the Actor and wait for it to finish
const run = await client.actor("getascraper/snupit-business-directory-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 = {
    "startUrls": [{ "url": "https://www.snupit.co.za/johannesburg/bramley/vsc-construction-and-projects/425180" }],
    "searchTerms": ["builders"],
    "locations": ["Johannesburg"],
    "verifiedOnly": False,
    "minRating": 0,
    "sortBy": "source",
    "scrapeDetails": False,
    "includeReviews": False,
    "includePhotos": False,
    "runMode": "snapshot",
    "monitorScope": "default",
    "maxItems": 10,
    "maxPages": 3,
    "maxSearches": 5,
    "requestDelayMs": 1000,
}

# Run the Actor and wait for it to finish
run = client.actor("getascraper/snupit-business-directory-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 '{
  "startUrls": [
    {
      "url": "https://www.snupit.co.za/johannesburg/bramley/vsc-construction-and-projects/425180"
    }
  ],
  "searchTerms": [
    "builders"
  ],
  "locations": [
    "Johannesburg"
  ],
  "verifiedOnly": false,
  "minRating": 0,
  "sortBy": "source",
  "scrapeDetails": false,
  "includeReviews": false,
  "includePhotos": false,
  "runMode": "snapshot",
  "monitorScope": "default",
  "maxItems": 10,
  "maxPages": 3,
  "maxSearches": 5,
  "requestDelayMs": 1000
}' |
apify call getascraper/snupit-business-directory-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,getascraper/snupit-business-directory-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/8CDKOdnnXkDew1ax0/builds/mxEqLC9ApxTfgj8u6/openapi.json
