# UK Funeral Director Directory Scraper (FuneralGuide) (`crawlerbros/funeralguide-uk-directory-scraper`) Actor

Scrape funeralguide.co.uk - the UK's largest funeral director directory. Search by town, city or postcode, or fetch specific funeral home pages directly. Get address, phone, geo-coordinates, ratings, reviews, prices, services, professional associations and opening hours.

- **URL**: https://apify.com/crawlerbros/funeralguide-uk-directory-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 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

## UK Funeral Director Directory Scraper (FuneralGuide)

Scrape [funeralguide.co.uk](https://www.funeralguide.co.uk) — the UK's largest directory of funeral directors. Search by town, city, county or postcode, or fetch specific funeral home pages directly by URL. Get full address, geo-coordinates, phone number, ratings & reviews, "from" pricing, services offered, professional accreditations (NAFD / SAIF), and opening hours for every listing.

### What this actor does

- **Two modes:** `search` (by town / city / county / postcode) and `byUrl` (specific funeral director page URLs)
- **3 sort orders:** most popular / highest rated, cheapest, nearest
- **Full profile enrichment:** address, geo-coordinates, phone, rating, latest verified review + recent review history, "from" price, services offered, professional association memberships, opening hours, about text, photos
- **Minimum-rating filter** and **FuneralGuide-members-only filter**
- **Optional nearby crematoriums/cemeteries** — separate `committalVenue` records with estimated fees, alongside the funeral-director listings
- **Empty fields are omitted** — every record only contains data the source actually published

### Output per funeral director

- `businessName`, `sourceUrl`
- `streetAddress`, `addressLocality`, `addressRegion`, `postalCode`, `country`, `fullAddress`
- `latitude`, `longitude`
- `phone`
- `websiteUrl` — the funeral home's own website (resolved from FuneralGuide's redirect link)
- `rating` (1–5), `reviewCount`, `ratingBest`, `ratingWorst`
- `latestReviewAuthor`, `latestReviewText`, `latestReviewRating`, `latestReviewDate`
- `recentReviews[]` — `{authorName, rating, dateText, text}` for the most recent verified reviews (up to 20)
- `lastReviewedText` — e.g. `Reviewed 1 week ago` (search-results freshness indicator)
- `isMember` — `true` if the funeral director holds a paid FuneralGuide membership listing (badge shown on the search-results page); not available on `byUrl` profile-page fetches
- `priceFrom`, `priceFromCurrency`, `priceRangeText` — estimated cost of a standard simple funeral
- `servicesOffered[]` — e.g. Home visit, Chapel of rest, Horse-drawn hearse, Pre-paid funeral plan
- `professionalAssociations[]` — `{name, shortName, url, logoUrl}` (e.g. NAFD, SAIF)
- `openingHours[]` — `{day, hours}`
- `description`, `aboutText`
- `imageUrls[]`
- `distanceMiles` — only present for `mode=search` results (distance from the searched location)
- `recordType: "funeralDirector"`, `scrapedAt`

Note: `mode=search` with `fetchFullDetails=false` returns a lighter summary record (name, address, rating, review count, description, latest review snippet, estimated price, distance, one photo) built straight from the search-results page, without visiting each funeral director's own profile page.

### Output per nearby venue (`recordType: "committalVenue"`, when `includeNearbyVenues=true`)

- `venueName` — crematorium or cemetery name
- `venueType` — `crematorium` or `cemetery`
- `areaText`, `postalCode` — approximate location
- `priceFrom`, `priceFromCurrency` — FuneralGuide's estimated committal fee at that venue
- `searchLocation` — the `location` input value these venues were found near
- `recordType: "committalVenue"`, `scrapedAt`

These are FuneralGuide's own "nearby crematoriums & cemeteries" sidebar listings for the searched location — a different content type from funeral directors, with no individual profile page of their own, so they don't count against `maxItems`.

### Input

| Field | Type | Default | Description |
|---|---|---|---|
| `mode` | select | `search` | `search` / `byUrl` |
| `location` | string | `London` | Town, city, county or postcode (mode=search) |
| `sortBy` | select | `relevance` | `relevance` / `price` / `distance` |
| `minRating` | select | `0` | Minimum star rating (0 = no minimum, 1–5) |
| `memberOnly` | boolean | `false` | Only keep FuneralGuide-paid-member listings (mode=search) |
| `includeNearbyVenues` | boolean | `false` | Also emit nearby crematorium/cemetery records (mode=search) |
| `startUrls` | array | – | Funeral director page URLs (mode=byUrl) |
| `fetchFullDetails` | boolean | `true` | Visit each funeral director's own page for phone, geo-coordinates, services, associations & opening hours |
| `maxItems` | int | `20` | Hard cap (1–500) |

#### Example: search a city, highest-rated first

```json
{
  "mode": "search",
  "location": "Manchester",
  "sortBy": "relevance",
  "maxItems": 30
}
```

#### Example: cheapest funeral directors near a postcode

```json
{
  "mode": "search",
  "location": "SO45 1DD",
  "sortBy": "price",
  "minRating": 4,
  "maxItems": 20
}
```

#### Example: fetch specific funeral director pages

```json
{
  "mode": "byUrl",
  "startUrls": [
    "https://www.funeralguide.co.uk/funeral-directors/hampshire/southampton/new-forest-funerals",
    "https://www.funeralguide.co.uk/funeral-directors/hampshire/southampton/j-lawrence-sons-undertakers-ltd"
  ]
}
```

### Use cases

- **Bereavement support services** — build a local funeral-director referral list for a hospice, charity or council
- **Market research** — compare funeral pricing and services across UK towns/cities
- **Lead generation** — find funeral directors lacking a professional accreditation or with low review counts
- **Price comparison tools** — surface "from" prices across a region
- **Local SEO / directory aggregation** — cross-reference listings against your own dataset

### FAQ

**What's FuneralGuide?** An independent UK directory (part of the Funeral Zone group) of funeral directors, crematoriums, cemeteries and hospices, with verified customer reviews. See [funeralguide.co.uk](https://www.funeralguide.co.uk).

**Can I search by postcode as well as town/city?** Yes — `location` accepts a full or partial UK postcode (e.g. `SO45 1DD`), a town/city name, or a county name.

**What does `priceFrom` represent?** FuneralGuide's estimated total cost of a standard simple funeral for that funeral director (professional fees + typical cremation/burial fee + celebrant estimate), as published on the funeral director's own profile page. Actual quotes may vary.

**Why do some records have no `rating` or reviews?** Newer or less-reviewed funeral directors don't yet have a published FuneralGuide rating. These fields are simply omitted rather than shown as zero.

**What is `websiteUrl`?** The funeral director's own website, resolved from FuneralGuide's "Visit website" redirect link. Not every listing has one on file.

**Does `distanceMiles` appear on `byUrl` results?** No — distance is only meaningful relative to a searched location, so it's only present for `mode=search` results.

**What does `isMember` mean, and why is it missing on `byUrl` results?** It reflects whether the funeral director holds a paid FuneralGuide membership, shown as a badge on the search-results page. That badge isn't shown on the funeral director's own profile page, so `isMember` (and the `memberOnly` filter) only applies to `mode=search`; `byUrl` results always pass the `memberOnly` filter through untouched.

**What's the difference between `latestReviewText` and `recentReviews`?** `latestReviewText`/`latestReviewAuthor`/`latestReviewRating` are the single most recent review (from the page's structured data). `recentReviews[]` is the fuller list (up to 20) shown in the "Verified Reviews" section of the profile page — only populated when `fetchFullDetails=true`.

**How fresh is the data?** FuneralGuide continuously updates listings, prices and reviews; the actor always reads the live page at run time.

**What are `committalVenue` records?** When `includeNearbyVenues=true`, the actor also emits FuneralGuide's own "nearby crematoriums & cemeteries" widget for the searched location as separate records — useful for estimating the venue-fee portion of a funeral's total cost alongside the funeral director's own service fee. They're a different content type from funeral directors (no individual profile page, no reviews), so they don't count against `maxItems` and are only fetched once per run (from the first search-results page).

# Actor input Schema

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

What to fetch.

## `location` (type: `string`):

A UK town, city, county or postcode to search near, e.g. `London`, `Manchester`, `SO45 1DD`.

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

Order search results are fetched in.

## `minRating` (type: `string`):

Only keep funeral directors with an average review rating at or above this value (1-5). Businesses with no reviews yet are excluded once this is set above 0.

## `memberOnly` (type: `boolean`):

Only keep funeral directors that hold a paid FuneralGuide membership listing (badge shown on the search-results page). Directors fetched via `startUrls` (mode=byUrl) always pass through, since membership status isn't shown on their own profile page.

## `includeNearbyVenues` (type: `boolean`):

Also emit separate records (recordType=`committalVenue`) for the crematoriums and cemeteries FuneralGuide lists as near the searched `location`, with their own estimated fee. These don't count against `maxItems` and aren't funeral-director listings.

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

Direct funeralguide.co.uk funeral-director page URLs to scrape, e.g. `https://www.funeralguide.co.uk/funeral-directors/hampshire/southampton/new-forest-funerals`.

## `fetchFullDetails` (type: `boolean`):

For mode=search: visit each funeral director's own profile page to also collect phone, geo-coordinates, opening hours, services offered and professional associations. Turn off for a faster run with only the search-result summary fields.

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

Hard cap on the number of funeral director records returned.

## Actor input object example

```json
{
  "mode": "search",
  "location": "London",
  "sortBy": "relevance",
  "minRating": "0",
  "memberOnly": false,
  "includeNearbyVenues": false,
  "startUrls": [],
  "fetchFullDetails": true,
  "maxItems": 20
}
```

# Actor output Schema

## `funeralDirectors` (type: `string`):

Dataset containing all scraped funeral director 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",
    "location": "London",
    "sortBy": "relevance",
    "minRating": "0",
    "memberOnly": false,
    "includeNearbyVenues": false,
    "startUrls": [],
    "fetchFullDetails": true,
    "maxItems": 20
};

// Run the Actor and wait for it to finish
const run = await client.actor("crawlerbros/funeralguide-uk-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 = {
    "mode": "search",
    "location": "London",
    "sortBy": "relevance",
    "minRating": "0",
    "memberOnly": False,
    "includeNearbyVenues": False,
    "startUrls": [],
    "fetchFullDetails": True,
    "maxItems": 20,
}

# Run the Actor and wait for it to finish
run = client.actor("crawlerbros/funeralguide-uk-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 '{
  "mode": "search",
  "location": "London",
  "sortBy": "relevance",
  "minRating": "0",
  "memberOnly": false,
  "includeNearbyVenues": false,
  "startUrls": [],
  "fetchFullDetails": true,
  "maxItems": 20
}' |
apify call crawlerbros/funeralguide-uk-directory-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,crawlerbros/funeralguide-uk-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/rDQ6daAhPNZZTzgfn/builds/J9aKsJMBAQiezXrp0/openapi.json
