# Snupit Scraper - South Africa Home Services Directory (`crawlerbros/snupit-scraper`) Actor

Scrape Snupit, South Africa's home-services and business quote directory. Search by category and city, or fetch full provider profiles by URL. Get names, addresses, categories, ratings, reviews, Pro Verified status, years in business, employee count, and photos.

- **URL**: https://apify.com/crawlerbros/snupit-scraper.md
- **Developed by:** [Crawler Bros](https://apify.com/crawlerbros) (community)
- **Categories:** Automation, Lead generation, Developer tools
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $3.00 / 1,000 results

This Actor is paid per event and usage. You are charged both the fixed price for specific events and for Apify platform usage.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

Learn more: https://docs.apify.com/platform/actors/running/actors-in-store#pay-per-event

## What's an Apify Actor?

Actors are a software tools running on the Apify platform, for all kinds of web data extraction and automation use cases.
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.

In JavaScript/TypeScript projects, use official [JavaScript/TypeScript client](https://docs.apify.com/api/client/js/docs.md):

```bash
npm install apify-client
```

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python/docs.md):

```bash
pip install apify-client
```

In shell scripts, use [Apify CLI](https://docs.apify.com/cli/docs.md):

````bash
# MacOS / Linux
curl -fsSL https://apify.com/install-cli.sh | bash
# Windows
irm https://apify.com/install-cli.ps1 | iex
```bash

In AI frameworks, you might use the [Apify MCP server](https://docs.apify.com/integrations/mcp.md).

If your project is in a different language, use 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

## Snupit Scraper - South Africa Home Services Directory

Scrape **Snupit** (snupit.co.za) — South Africa's leading "get quotes from local pros" directory for home-services and business providers. Search any service category in any South African city or town and get provider names, addresses, categories, ratings, reviews, Pro Verified status, years in business, employee count, and photos. Optionally fetch full provider profiles directly by URL. No login, no cookies, no API key required.

### What this actor does

- **Two modes:** `search` (category + city) and `detail` (direct provider profile URLs)
- **428 service categories** covering everything from Builders and Electricians to Web Design and Pet Grooming
- **120 South African cities and towns** — all of Snupit's covered locations, from major metros (Johannesburg, Cape Town, Durban, Pretoria, Port Elizabeth/Gqeberha, Bloemfontein) to smaller towns
- **Sort by** relevance, rating, review count, or name (A-Z)
- **Filter by** minimum star rating (1-5) or "Pro Verified" status only
- **Rich provider profiles** — Pro Verified badge, years in business, employee count, full customer review list, photo gallery, province and postal code
- **Empty fields are omitted** — you only ever see fields that were actually found for a provider

### Output per provider

- `name` — provider/business name
- `category` — service category (from breadcrumb on profile pages, from your search input on search results)
- `city`, `suburb`, `province`, `postalCode`, `street`, `address` — location details (province/postal code available when profile fetched)
- `description` — the provider's own description/tagline
- `rating`, `reviewCount` — average star rating (1-5) and total number of reviews (omitted for providers with no reviews yet)
- `verified` — `true` if the provider carries Snupit's "Pro Verified" badge (profile fetch only)
- `yearsInBusiness`, `employeeCount` — from the provider's profile "extras" (profile fetch only, when the provider has supplied this)
- `latestReview` — `{reviewerName, rating, text}` of the most recent review shown on the search results page (search mode)
- `reviews[]` — the full list of reviews shown on the provider's profile page, each `{title, rating, reviewerName, reviewDate, text, reviewVerified}` — `reviewVerified` is `true` only when Snupit tags that individual review as a verified customer (profile fetch only)
- `logoUrl` — provider's logo image
- `images[]` — provider's photo gallery (profile fetch only)
- `searchCity`, `searchCategory` — the search parameters used (search mode)
- `sourceUrl` — canonical Snupit profile URL for the provider
- `recordType: "provider"`, `scrapedAt`

### Input

| Field | Type | Default | Description |
|---|---|---|---|
| `mode` | string (select) | `search` | `search` (category + city) or `detail` (fetch by URL) |
| `category` | string (select) | `builders` | Pick from 428 categories, or `custom` to use `customCategory` (mode=search) |
| `customCategory` | string | – | Any free-text category slug, overrides `category` (mode=search) |
| `city` | string (select) | `johannesburg` | Pick from 120 South African cities/towns, or `custom` to use `customCity` (mode=search) |
| `customCity` | string | – | Any free-text city/town slug, overrides `city` (mode=search) |
| `sortBy` | string (select) | `relevance` | `relevance` / `rating` / `reviewCount` / `name` — applied client-side across the fetched batch |
| `minRating` | integer | `0` (no minimum) | Only return providers rated at least 1-5 stars |
| `verifiedOnly` | boolean | `false` | Only return "Pro Verified" providers (requires `fetchDetails`) |
| `fetchDetails` | boolean | `false` | Also visit each provider's profile page for richer data (slower) |
| `providerUrls` | array | – | Snupit profile URLs to fetch directly (mode=detail) |
| `maxItems` | int | `15` | Hard cap on returned records (1-500) |

#### Example: search builders in Johannesburg

```json
{
  "mode": "search",
  "category": "builders",
  "city": "johannesburg",
  "maxItems": 15
}
````

#### Example: highest-rated, Pro Verified plumbers in Cape Town, with full profiles

```json
{
  "mode": "search",
  "category": "plumbers",
  "city": "cape-town",
  "sortBy": "rating",
  "verifiedOnly": true,
  "fetchDetails": true,
  "maxItems": 15
}
```

#### Example: DSTV installers in Pretoria, 4+ stars

```json
{
  "mode": "search",
  "category": "dstv-installers",
  "city": "pretoria",
  "minRating": 4,
  "maxItems": 15
}
```

#### Example: fetch specific provider profiles

```json
{
  "mode": "detail",
  "providerUrls": [
    { "url": "https://www.snupit.co.za/johannesburg/bramley/vsc-construction-and-projects/425180" }
  ]
}
```

### Use cases

- **Local lead generation** — build a prospect list of South African home-service providers by trade and city for B2B outreach
- **Market research** — measure provider density and average ratings for a category across South African cities
- **Directory aggregation** — feed structured South African business data into your own local-search product
- **Competitor mapping** — see who else operates in a category and area, with ratings and review counts
- **Franchise & site-selection analysis** — evaluate service-provider coverage across South African cities and towns

### Limitations

- **At most 15 providers per city+category combination.** Snupit's own category+city listing page renders a fixed maximum of 15 providers with no further pagination (confirmed by testing: less common categories return however many providers genuinely exist, e.g. 3 for a niche category in a smaller city — this is real data, never padded). To collect more providers for a category, run separate searches across multiple cities, or use `mode=detail` with specific profile URLs.
- **No phone number, email, or website field.** Snupit is a lead-generation directory — it never publishes a provider's phone number, email, or website on its public pages. Contact only happens through Snupit's own "Request a Quote" form. This actor cannot surface data that Snupit itself does not publish.
- **`sortBy`, `minRating`, and `verifiedOnly` are applied client-side.** Snupit's listing pages don't accept a server-side sort or filter parameter, so these are applied across the batch of records this run actually fetched (at most 15 per city+category).
- **`verifiedOnly` and `yearsInBusiness`/`employeeCount` require `fetchDetails`.** The Pro Verified badge, years in business, and employee count only appear on a provider's full profile page, not on the search-results listing.

### FAQ

**What data source does this actor use?**
It reads the publicly available category+city listing pages and provider profile pages on Snupit (snupit.co.za), South Africa's home-services quote directory. No account or API key is needed.

**Is this affiliated with Snupit?**
No. This is an independent, third-party actor that reads publicly accessible pages.

**Why do some providers have no rating?**
Snupit only shows a rating once a provider has received at least one customer review. Providers with zero reviews simply omit the `rating` and `reviewCount` fields rather than showing 0.

**What does the "Pro Verified" badge mean?**
It's Snupit's own verification badge for providers who have completed Snupit's vetting process. It's exposed as `verified: true` on the record (profile fetch only) — providers without the badge simply omit this field.

**Can I search all categories in a city at once?**
Not in a single call — each run targets one category + city combination (or a list of direct profile URLs in `mode=detail`). Run multiple searches with different `category` values to cover more of a city.

**Does this actor need a proxy or login?**
No — Snupit's listing and profile pages are served without any anti-bot challenge, so this actor runs entirely on Apify's free plan with no proxy and no credentials.

**Why is `fetchDetails` off by default?**
Fetching each provider's full profile page requires one extra request per result, which is slower. Turn it on when you need the Pro Verified badge, years in business, employee count, the full review list, or photos.

# Actor input Schema

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

What to fetch: search a category + city, or fetch full provider profiles from direct Snupit URLs.

## `category` (type: `string`):

Home-service or business category to search for. Pick from the full list of Snupit categories, or choose 'Custom category' and type your own below (mode=search).

## `customCategory` (type: `string`):

Free-text category slug not in the list above, e.g. 'pool-maintenance' (mode=search). Takes priority over 'Service category' when set. Use Snupit's own slug format (lowercase, hyphen-separated) -- Snupit does not fuzzy-match arbitrary keywords.

## `city` (type: `string`):

South African city or town to search in. Pick from Snupit's list of covered cities, or choose 'Custom city' and type your own below (mode=search).

## `customCity` (type: `string`):

Free-text city/town slug not in the list above (mode=search). Takes priority over 'City / town' when set. Use Snupit's own slug format (lowercase, hyphen-separated).

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

How to order the returned results (mode=search). Snupit's own listing order is used by default; other options are applied client-side across the fetched batch.

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

Only return providers rated at least this many stars, e.g. 4 for 4.0+ (mode=search). 0 means no minimum. Providers with no rating yet are excluded once this is set above 0.

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

Only return providers that carry Snupit's 'Pro Verified' badge. Requires 'Fetch full provider profiles' to be enabled, since the badge only appears on profile pages (mode=search).

## `fetchDetails` (type: `boolean`):

For each search result, also visit its provider profile page to collect the Pro Verified badge, years in business, employee count, full review list, and photo gallery. Slower -- one extra request per result (mode=search).

## `providerUrls` (type: `array`):

Direct Snupit provider profile URLs to fetch, e.g. https://www.snupit.co.za/johannesburg/bramley/vsc-construction-and-projects/425180. Use the 'sourceUrl' field from search results.

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

Hard cap on the number of provider records to return. Note: Snupit shows at most 15 providers per city+category combination (mode=search), so higher values only matter for mode=detail with many URLs.

## Actor input object example

```json
{
  "mode": "search",
  "category": "builders",
  "city": "johannesburg",
  "sortBy": "relevance",
  "minRating": 0,
  "verifiedOnly": false,
  "fetchDetails": false,
  "providerUrls": [],
  "maxItems": 15
}
```

# Actor output Schema

## `providers` (type: `string`):

Dataset containing all scraped Snupit provider listings.

# 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 = {
    "mode": "search",
    "category": "builders",
    "city": "johannesburg",
    "sortBy": "relevance",
    "minRating": 0,
    "verifiedOnly": false,
    "fetchDetails": false,
    "providerUrls": [],
    "maxItems": 15
};

// Run the Actor and wait for it to finish
const run = await client.actor("crawlerbros/snupit-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 = {
    "mode": "search",
    "category": "builders",
    "city": "johannesburg",
    "sortBy": "relevance",
    "minRating": 0,
    "verifiedOnly": False,
    "fetchDetails": False,
    "providerUrls": [],
    "maxItems": 15,
}

# Run the Actor and wait for it to finish
run = client.actor("crawlerbros/snupit-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print("💾 Check your data here: https://console.apify.com/storage/datasets/" + run["defaultDatasetId"])
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "mode": "search",
  "category": "builders",
  "city": "johannesburg",
  "sortBy": "relevance",
  "minRating": 0,
  "verifiedOnly": false,
  "fetchDetails": false,
  "providerUrls": [],
  "maxItems": 15
}' |
apify call crawlerbros/snupit-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=crawlerbros/snupit-scraper",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Snupit Scraper - South Africa Home Services Directory",
        "description": "Scrape Snupit, South Africa's home-services and business quote directory. Search by category and city, or fetch full provider profiles by URL. Get names, addresses, categories, ratings, reviews, Pro Verified status, years in business, employee count, and photos.",
        "version": "1.0",
        "x-build-id": "jsh9JmaedWf3nFunj"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/crawlerbros~snupit-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-crawlerbros-snupit-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        },
        "/acts/crawlerbros~snupit-scraper/runs": {
            "post": {
                "operationId": "runs-sync-crawlerbros-snupit-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor and returns information about the initiated run in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/runsResponseSchema"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/acts/crawlerbros~snupit-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-crawlerbros-snupit-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        }
    },
    "components": {
        "schemas": {
            "inputSchema": {
                "type": "object",
                "required": [
                    "mode"
                ],
                "properties": {
                    "mode": {
                        "title": "Mode",
                        "enum": [
                            "search",
                            "detail"
                        ],
                        "type": "string",
                        "description": "What to fetch: search a category + city, or fetch full provider profiles from direct Snupit URLs.",
                        "default": "search"
                    },
                    "category": {
                        "title": "Service category",
                        "enum": [
                            "custom",
                            "3d-printing",
                            "access-control",
                            "accounting",
                            "accounting-software-support",
                            "accounting-tutors",
                            "advertising",
                            "afrikaans-tutors",
                            "after-care",
                            "agricultural-equipment",
                            "agricultural-services",
                            "air-conditioning",
                            "alarm-systems",
                            "aluminium-doors-and-windows",
                            "appliance-repairs",
                            "architects",
                            "armed-response",
                            "artificial-turf",
                            "asphalting",
                            "audi-repairs",
                            "audio-visual",
                            "audio-visual-equipment",
                            "audiologists",
                            "auditors",
                            "auto-electricians",
                            "auto-glass",
                            "automotive-spares",
                            "awnings",
                            "baby-sitters",
                            "background-checks",
                            "bakery-equipment",
                            "balustrades",
                            "bartenders",
                            "bathroom-renovations",
                            "batteries",
                            "bbbee",
                            "beauty-salons",
                            "biltong",
                            "blinds",
                            "blinds-cleaning",
                            "bmw-repairs",
                            "borehole-drillers",
                            "boxes",
                            "brakes-and-clutches",
                            "builders",
                            "building-demolishers",
                            "building-developers",
                            "building-materials",
                            "building-site-cleaning",
                            "burglar-bars",
                            "bus-services",
                            "bush-camping",
                            "business-consultants",
                            "cake-shops",
                            "canopies",
                            "car-accessories",
                            "car-aircon-regassing",
                            "car-alarms",
                            "car-branding",
                            "car-rental",
                            "car-sound-systems",
                            "car-tracking",
                            "car-upholsterers",
                            "car-washes",
                            "car-window-tinting",
                            "caregivers",
                            "carpenters",
                            "carpet-cleaning",
                            "carpeting",
                            "carports",
                            "caterers",
                            "catering-equipment",
                            "catering-equipment-hire",
                            "cctv",
                            "ceiling-installers",
                            "cellphone-repairs",
                            "chimney-cleaning",
                            "chiropractors",
                            "civil-engineering",
                            "civil-engineering-consultants",
                            "cladding",
                            "cleaning-materials",
                            "cleaning-services",
                            "clothing-manufacturers",
                            "cloud-storage",
                            "clowns",
                            "company-registrations",
                            "compressors",
                            "computer-aided-design",
                            "computer-courses",
                            "computer-repairs",
                            "computers",
                            "concrete-flooring",
                            "concrete-products",
                            "concrete-slabs",
                            "concreting",
                            "conveyancers",
                            "conveyors",
                            "copywriting",
                            "corporate-event-planners",
                            "corporate-gifts",
                            "corporate-identities",
                            "corporate-videos",
                            "corporate-wear",
                            "counsellors",
                            "couriers",
                            "creches",
                            "crime-scene-cleaning",
                            "curtain-cleaning",
                            "curtains",
                            "cv-joints",
                            "cv-writer",
                            "cyber-security",
                            "dance-lessons",
                            "data-recovery",
                            "day-care-centres",
                            "debt-collection",
                            "debt-counsellors",
                            "dentists",
                            "dermatologists",
                            "designer-mats",
                            "diesel-mechanics",
                            "dieticians",
                            "digital-marketing",
                            "dispute-resolution",
                            "divorce-lawyers",
                            "djs",
                            "document-management",
                            "doors",
                            "drainage",
                            "dressmakers",
                            "driving-schools",
                            "drywalls",
                            "dstv-installers",
                            "earthmoving-equipment",
                            "electric-fencing",
                            "electricians",
                            "email-marketing",
                            "embroidery",
                            "engine-overhauls",
                            "engineers",
                            "english-tutors",
                            "engraving",
                            "entertainment-companies",
                            "escalators-and-elevators",
                            "estate-agents",
                            "estates-and-trusts",
                            "event-decorations",
                            "event-planners",
                            "events-staff",
                            "excavations",
                            "face-painters",
                            "fencing",
                            "fibre-optics",
                            "financial-advisors",
                            "fire-fighting-training",
                            "fire-safety",
                            "firearm-training",
                            "fireplaces",
                            "fireproofing",
                            "first-aid",
                            "flag-poles",
                            "flooring",
                            "florists",
                            "forensic-investigators",
                            "forklift-hire",
                            "forklift-repairs",
                            "forklift-training",
                            "fridge-repairs",
                            "fuels",
                            "funeral-parlours",
                            "funeral-policies",
                            "furniture-designers",
                            "furniture-manufacturers",
                            "gabion-baskets",
                            "garage-door-motors",
                            "garage-doors",
                            "gardeners",
                            "gas-installers",
                            "gas-suppliers",
                            "gate-motors",
                            "gates",
                            "gearboxes",
                            "generator-hire",
                            "generators",
                            "geotechnical-engineers",
                            "glass-works",
                            "graduation-gowns",
                            "granite-services",
                            "graphic-designers",
                            "groomers",
                            "gutter-cleaning",
                            "gutter-supplies",
                            "guttering",
                            "gynaecologists",
                            "hair-stylists",
                            "handwriting-experts",
                            "handymen",
                            "health-and-safety-courses",
                            "heat-pumps",
                            "high-pressure-cleaning",
                            "holiday-accommodation",
                            "home-furniture",
                            "home-improvements",
                            "home-loans",
                            "human-resources",
                            "hypnotherapists",
                            "industrial-cleaning",
                            "insurance",
                            "interior-designing",
                            "internet-solutions",
                            "irrigation",
                            "it-companies",
                            "jumping-castle-hire",
                            "jungle-gyms",
                            "kids-party-entertainers",
                            "kids-party-planners",
                            "kitchen-renovations",
                            "labour-lawyers",
                            "laminate-flooring",
                            "land-surveyors",
                            "landscaping",
                            "language-tutors",
                            "lapas",
                            "laptop-repairs",
                            "laser-clinics",
                            "laser-cutting",
                            "laundry-services",
                            "lawyers",
                            "life-coaches",
                            "lifting-equipment",
                            "lighting",
                            "lightning-protection",
                            "loans",
                            "locksmiths",
                            "logistics",
                            "logo-design",
                            "magicians",
                            "make-up-artists",
                            "marble-and-granite-suppliers",
                            "marketing",
                            "marriage-counsellors",
                            "marriage-officers",
                            "massage-therapists",
                            "maths-tutors",
                            "mechanics",
                            "medical-aid",
                            "mentors",
                            "mercedes-benz-repairs",
                            "microwave-repairs",
                            "mobile-apps",
                            "movers",
                            "music-lessons",
                            "networking",
                            "newspaper-distribution",
                            "occupational-health-and-safety",
                            "office-cleaning",
                            "office-equipment",
                            "office-furniture",
                            "optometrists",
                            "outdoor-furniture",
                            "packaging-supplies",
                            "paint",
                            "painters",
                            "palisade-fencing",
                            "panel-beaters",
                            "partitioning",
                            "party-decorations",
                            "party-planners",
                            "patios",
                            "paving",
                            "payroll",
                            "personal-protection-equipment",
                            "personal-trainers",
                            "pest-control",
                            "pet-sitters",
                            "photographers",
                            "physics-tutors",
                            "physiotherapists",
                            "picture-framing",
                            "pizza-ovens",
                            "plant-hire",
                            "plastering",
                            "plastic-surgeons",
                            "plumbers",
                            "podiatrists",
                            "polygraph-testing",
                            "pony-rides",
                            "pool-cleaning",
                            "pos-systems",
                            "pre_schools",
                            "precast-fencing",
                            "prefabricated-houses",
                            "prepaid-electricity-meters",
                            "printer-cartridges",
                            "printing",
                            "private-investigators",
                            "project-management",
                            "property-developers",
                            "property-managers",
                            "property-valuations",
                            "psychiatrists",
                            "psychologists",
                            "publishing",
                            "pumps",
                            "quantity-surveying",
                            "radiators",
                            "recording-studios",
                            "recruitment-agencies",
                            "refrigeration",
                            "risk-management",
                            "road-marking",
                            "road-works",
                            "roadside-assistance",
                            "roller-doors",
                            "roofing",
                            "rubberising",
                            "rubble-removal",
                            "safes",
                            "sanitisation",
                            "school-furniture",
                            "school-transport",
                            "search-engine-optimisation",
                            "security",
                            "security-equipment",
                            "security-gates",
                            "security-training",
                            "septic-tanks",
                            "shadeports",
                            "shopfitters",
                            "shower-doors",
                            "shutters",
                            "shuttle-services",
                            "signs",
                            "skills-development",
                            "skin-clinics",
                            "skip-hire",
                            "skylighting",
                            "social-media-marketing",
                            "software",
                            "software-development",
                            "solar-geysers",
                            "solar-systems",
                            "sound-hire",
                            "soundproofing",
                            "spas",
                            "spas-and-jacuzzis",
                            "speed-fencing",
                            "sports-coaches",
                            "sports-court-contractors",
                            "stainless-steel-fabrication",
                            "staircases",
                            "stationery",
                            "steel-works",
                            "storage",
                            "stove-repairs",
                            "structural-engineers",
                            "structural-steel-fabrication",
                            "swimming-lessons",
                            "swimming-pool-builders",
                            "swimming-pool-supplies",
                            "table-and-chair-hire",
                            "table-and-chair-suppliers",
                            "tanks",
                            "tar-surfacing",
                            "taxis",
                            "team-building",
                            "telecommunication-equipment",
                            "telecommunications",
                            "tent-hire",
                            "tent-manufacturers",
                            "thatched-roofing",
                            "therapists",
                            "tiling",
                            "tipper-truck-hire",
                            "tlb-hire",
                            "toilet-hire",
                            "tombstones",
                            "tour-operators",
                            "tow-bars",
                            "towing",
                            "town-planners",
                            "tracing",
                            "trailers",
                            "transcription",
                            "translators",
                            "transportation",
                            "travel-agents",
                            "tree-felling",
                            "trenching",
                            "trophies-and-medals",
                            "truck-rental",
                            "tutors",
                            "tv-installers",
                            "tv-repairs",
                            "typing",
                            "underfloor-heating",
                            "upholsterers",
                            "upholstery-cleaning",
                            "ups-installers",
                            "vehicle-finance",
                            "ventilation",
                            "venues",
                            "video-editing",
                            "videographers",
                            "vw-repairs",
                            "wallpaper-suppliers",
                            "wallpapering",
                            "waste-management",
                            "water-meters",
                            "water-purification",
                            "water-suppliers",
                            "water-tanks",
                            "waterproofing",
                            "web-hosting",
                            "website-designers",
                            "wedding-decorations",
                            "wedding-photographers",
                            "wedding-planners",
                            "wedding-venues",
                            "welders",
                            "wendy-houses",
                            "window-cleaning",
                            "window-installers",
                            "window-tinting",
                            "windows",
                            "wire-mesh-fencing",
                            "wooden-decking",
                            "wooden-fencing"
                        ],
                        "type": "string",
                        "description": "Home-service or business category to search for. Pick from the full list of Snupit categories, or choose 'Custom category' and type your own below (mode=search).",
                        "default": "builders"
                    },
                    "customCategory": {
                        "title": "Custom category (overrides selection above)",
                        "type": "string",
                        "description": "Free-text category slug not in the list above, e.g. 'pool-maintenance' (mode=search). Takes priority over 'Service category' when set. Use Snupit's own slug format (lowercase, hyphen-separated) -- Snupit does not fuzzy-match arbitrary keywords."
                    },
                    "city": {
                        "title": "City / town",
                        "enum": [
                            "custom",
                            "akasia",
                            "alberton",
                            "amanzimtoti",
                            "ballito",
                            "bela_bela",
                            "belhar",
                            "bellville",
                            "benoni",
                            "bloemfontein",
                            "boksburg",
                            "brackenfell",
                            "brakpan",
                            "brits",
                            "bronkhorstspruit",
                            "cape-town",
                            "carletonville",
                            "centurion",
                            "chatsworth",
                            "durban",
                            "durban-north",
                            "durbanville",
                            "east-london",
                            "edenvale",
                            "empangeni",
                            "george",
                            "germiston",
                            "goodwood",
                            "gordons-bay",
                            "hammanskraal",
                            "hammarsdale",
                            "hartbeespoort",
                            "heidelberg",
                            "hermanus",
                            "hillcrest",
                            "howick",
                            "isipingo",
                            "jeffreys-bay",
                            "johannesburg",
                            "katlehong",
                            "kempton-park",
                            "khayelitsha",
                            "kimberley",
                            "king-williams-town",
                            "kleinmond",
                            "klerksdorp",
                            "kloof",
                            "knysna",
                            "kokstad",
                            "kraaifontein",
                            "kroonstad",
                            "krugersdorp",
                            "kuils-river",
                            "ladysmith",
                            "langebaan",
                            "lenasia",
                            "mabopane",
                            "mahikeng",
                            "malmesbury",
                            "mamelodi",
                            "margate",
                            "meyerton",
                            "middelburg-_-mp",
                            "midrand",
                            "mitchells-plain",
                            "mokopane",
                            "mount-edgecombe",
                            "mthatha",
                            "nelspruit",
                            "newcastle",
                            "newlands-east",
                            "nigel",
                            "olifantsfontein",
                            "oudtshoorn",
                            "paarl",
                            "parys",
                            "phoenix",
                            "pietermaritzburg",
                            "pinetown",
                            "plettenberg-bay",
                            "polokwane",
                            "port-elizabeth",
                            "port-shepstone",
                            "potchefstroom",
                            "pretoria",
                            "randburg",
                            "randfontein",
                            "rondebosch",
                            "roodeplaat",
                            "rustenburg",
                            "sandton",
                            "sasolburg",
                            "scottburgh",
                            "secunda",
                            "somerset-west",
                            "soshanguve",
                            "soweto",
                            "springs",
                            "stanger",
                            "stellenbosch",
                            "strand",
                            "table-view",
                            "tembisa",
                            "thohoyandou",
                            "tongaat",
                            "tzaneen",
                            "uitenhage",
                            "umhlanga",
                            "umlazi",
                            "vanderbijlpark",
                            "vereeniging",
                            "verulam",
                            "vosloorus",
                            "vredenburg",
                            "vryheid",
                            "welkom",
                            "wellington",
                            "westville",
                            "white-river",
                            "witbank",
                            "worcester"
                        ],
                        "type": "string",
                        "description": "South African city or town to search in. Pick from Snupit's list of covered cities, or choose 'Custom city' and type your own below (mode=search).",
                        "default": "johannesburg"
                    },
                    "customCity": {
                        "title": "Custom city (overrides selection above)",
                        "type": "string",
                        "description": "Free-text city/town slug not in the list above (mode=search). Takes priority over 'City / town' when set. Use Snupit's own slug format (lowercase, hyphen-separated)."
                    },
                    "sortBy": {
                        "title": "Sort order",
                        "enum": [
                            "relevance",
                            "rating",
                            "reviewCount",
                            "name"
                        ],
                        "type": "string",
                        "description": "How to order the returned results (mode=search). Snupit's own listing order is used by default; other options are applied client-side across the fetched batch.",
                        "default": "relevance"
                    },
                    "minRating": {
                        "title": "Minimum rating",
                        "minimum": 0,
                        "maximum": 5,
                        "type": "integer",
                        "description": "Only return providers rated at least this many stars, e.g. 4 for 4.0+ (mode=search). 0 means no minimum. Providers with no rating yet are excluded once this is set above 0.",
                        "default": 0
                    },
                    "verifiedOnly": {
                        "title": "Pro Verified only",
                        "type": "boolean",
                        "description": "Only return providers that carry Snupit's 'Pro Verified' badge. Requires 'Fetch full provider profiles' to be enabled, since the badge only appears on profile pages (mode=search).",
                        "default": false
                    },
                    "fetchDetails": {
                        "title": "Fetch full provider profiles",
                        "type": "boolean",
                        "description": "For each search result, also visit its provider profile page to collect the Pro Verified badge, years in business, employee count, full review list, and photo gallery. Slower -- one extra request per result (mode=search).",
                        "default": false
                    },
                    "providerUrls": {
                        "title": "Provider profile URLs (mode=detail)",
                        "type": "array",
                        "description": "Direct Snupit provider profile URLs to fetch, e.g. https://www.snupit.co.za/johannesburg/bramley/vsc-construction-and-projects/425180. Use the 'sourceUrl' field from search results.",
                        "items": {
                            "type": "object",
                            "properties": {
                                "url": {
                                    "title": "URL",
                                    "type": "string",
                                    "description": "Snupit provider profile URL."
                                }
                            }
                        },
                        "default": []
                    },
                    "maxItems": {
                        "title": "Max items",
                        "minimum": 1,
                        "maximum": 500,
                        "type": "integer",
                        "description": "Hard cap on the number of provider records to return. Note: Snupit shows at most 15 providers per city+category combination (mode=search), so higher values only matter for mode=detail with many URLs.",
                        "default": 15
                    }
                }
            },
            "runsResponseSchema": {
                "type": "object",
                "properties": {
                    "data": {
                        "type": "object",
                        "properties": {
                            "id": {
                                "type": "string"
                            },
                            "actId": {
                                "type": "string"
                            },
                            "userId": {
                                "type": "string"
                            },
                            "startedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "finishedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "status": {
                                "type": "string",
                                "example": "READY"
                            },
                            "meta": {
                                "type": "object",
                                "properties": {
                                    "origin": {
                                        "type": "string",
                                        "example": "API"
                                    },
                                    "userAgent": {
                                        "type": "string"
                                    }
                                }
                            },
                            "stats": {
                                "type": "object",
                                "properties": {
                                    "inputBodyLen": {
                                        "type": "integer",
                                        "example": 2000
                                    },
                                    "rebootCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "restartCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "resurrectCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "computeUnits": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "options": {
                                "type": "object",
                                "properties": {
                                    "build": {
                                        "type": "string",
                                        "example": "latest"
                                    },
                                    "timeoutSecs": {
                                        "type": "integer",
                                        "example": 300
                                    },
                                    "memoryMbytes": {
                                        "type": "integer",
                                        "example": 1024
                                    },
                                    "diskMbytes": {
                                        "type": "integer",
                                        "example": 2048
                                    }
                                }
                            },
                            "buildId": {
                                "type": "string"
                            },
                            "defaultKeyValueStoreId": {
                                "type": "string"
                            },
                            "defaultDatasetId": {
                                "type": "string"
                            },
                            "defaultRequestQueueId": {
                                "type": "string"
                            },
                            "buildNumber": {
                                "type": "string",
                                "example": "1.0.0"
                            },
                            "containerUrl": {
                                "type": "string"
                            },
                            "usage": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "integer",
                                        "example": 1
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "usageTotalUsd": {
                                "type": "number",
                                "example": 0.00005
                            },
                            "usageUsd": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "number",
                                        "example": 0.00005
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
