# Doing Good Leeds Scraper (`parsebird/doinggoodleeds-scraper`) Actor

Scrape paid jobs, volunteering, events, and training courses from doinggoodleeds.org.uk via WP-JSON. Four entity types, ~178 items total. Title, employer, location, salary, apply email/URL, full description HTML. Export as JSON, CSV, Excel.

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

## Pricing

from $1.99 / 1,000 result scrapeds

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

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.md):

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

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python.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/platform/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

### Doing Good Leeds Scraper — Charity Jobs, Volunteering, Events & Training Data

Scrape [Doing Good Leeds](https://doinggoodleeds.org.uk/) — Leeds' voluntary-sector hub run by Voluntary Action Leeds. Extract paid jobs, volunteering opportunities, community events, and training courses via the public WP-JSON REST API. Export as JSON, CSV, or Excel.

<table><tr>
<td style="border-left:4px solid #1C1917;padding:12px 16px;font-weight:600">
Four entity types in one actor — paid jobs, volunteering, events, and training courses (~178 items total). Get title, employer, specific location, salary, apply email, taxonomy tags, and full description per row, ready for analysis or integration.
</td>
</tr></table>

##### Copy to your AI assistant

Copy this block into ChatGPT, Claude, Cursor, or any LLM to start using this actor.

````

Apify Actor: parsebird/doinggoodleeds-scraper — scrapes doinggoodleeds.org.uk for charity jobs, volunteering, events, and training courses via WP-JSON. $1.99/1000 results. Call via ApifyClient: client.actor("parsebird/doinggoodleeds-scraper").call(run\_input={"entityTypes": \["job-listings"], "maxItems": 100}). Inputs: startUrls (array, optional — WP-JSON endpoints or detail URLs), entityTypes (array, default \["job-listings"], values: job-listings/volunteers/event/training-course), enrichTaxonomies (boolean, default true), postedWithinHours (integer, optional — freshness filter), maxItems (integer, default 1000). Output fields: type, cpt, jobId, slug, jobUrl, title, description, descriptionText, companyName, companyWebsite, location, salary, categories\[], employmentTypes\[], contractType, filled, status, postedDate, modifiedDate, applyEmail, scrapedAt. API docs: https://docs.apify.com/api/v2 Token: https://console.apify.com/settings/integrations

````

### What does Doing Good Leeds Scraper do?

**Doing Good Leeds Scraper** is an [Apify Actor](https://apify.com/actors) that extracts structured data from [doinggoodleeds.org.uk](https://doinggoodleeds.org.uk/) — the central hub for voluntary, community, and social enterprise sector listings in Leeds, operated by Voluntary Action Leeds (VAL).

The site uses WordPress with WP Job Manager and exposes four custom post type (CPT) collections through its WP-JSON REST API:

- 🏢 **Paid Jobs** (`job-listings`) — charity and nonprofit job vacancies in Leeds (~31 active)
- 🤝 **Volunteering** (`volunteers`) — volunteer opportunity profiles (~23 active)
- 📅 **Events** (`event`) — community events, workshops, and networking sessions (~34 active)
- 📚 **Training Courses** (`training-course`) — professional development and training (~90 active)

Think of it as a **Doing Good Leeds API alternative** — no official API exists for structured data export, but this scraper delivers clean, normalized data at scale.

**Key features:**

- 🎯 **Four entity types in one run** — pick any combination via the `entityTypes` selector
- ⚡ **WP-JSON REST API** — fast, lightweight HTTP requests with no browser overhead
- 🏷️ **Taxonomy enrichment** — embed category and employment type term names via `_embed`
- 📄 **Detail page scraping** — fetches each listing's detail page for accurate company name, description, location, and salary
- 📧 **Apply flow captured** — application email extracted from each listing
- ⏰ **Freshness filter** — `postedWithinHours` for daily monitoring runs that only want recent postings
- 🌐 **Flexible input** — accept WP-JSON endpoints, browser listing URLs, or single detail page URLs
- 📤 **Clean exports** — JSON, CSV, or Excel via [Apify integrations](https://apify.com/integrations)

### What data can you extract from Doing Good Leeds?

| Field | Description |
|-------|-------------|
| `type` | Entity type: `job`, `volunteer`, `event`, or `training` |
| `cpt` | WordPress custom post type slug |
| `jobId` | Unique WordPress post ID |
| `title` | Listing title |
| `description` | Full description in HTML |
| `descriptionText` | Plain-text version of the description |
| `companyName` | Employer or organisation name |
| `companyWebsite` | Company website URL (when listed) |
| `location` | Specific location (e.g., "Woodhouse Community Centre", "Leeds") |
| `salary` | Salary text (e.g., "£28,266 FTE", "£13.00 Per hour") |
| `categories` | Category and tag taxonomy terms |
| `employmentTypes` | Employment type terms (e.g., "Full Time", "Part Time") |
| `contractType` | Primary employment type |
| `postedDate` | ISO publication date |
| `modifiedDate` | ISO last-modified date |
| `applyEmail` | Application email address |
| `jobUrl` | Direct link to the listing on doinggoodleeds.org.uk |
| `wpJsonUrl` | WP-JSON API endpoint for this item |

### How to scrape Doing Good Leeds

1. **Go to [Doing Good Leeds Scraper](https://apify.com/parsebird/doinggoodleeds-scraper)** on Apify Store and click **Try for free**
2. **Choose entity types** — select one or more from Paid Jobs, Volunteering, Events, and Training Courses
3. **Set a result limit** — start with 100 for a quick test (the site has ~178 total items)
4. **Configure freshness** (optional) — set `postedWithinHours` to 24 for only the last day's listings
5. **Run the scraper** — click **Start** and wait for results
6. **Export your data** — download as JSON, CSV, or Excel, or access via the [Apify API](https://docs.apify.com/api/v2)

#### Using the API (Python)

```python
from apify_client import ApifyClient

client = ApifyClient("YOUR_API_TOKEN")

run = client.actor("parsebird/doinggoodleeds-scraper").call(
    run_input={
        "entityTypes": ["job-listings", "volunteers"],
        "maxItems": 100,
        "enrichTaxonomies": True,
    }
)

for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(f"{item['type']}: {item['title']} — {item['location']}")
````

#### Using the API (JavaScript)

```javascript
import { ApifyClient } from 'apify-client';

const client = new ApifyClient({ token: 'YOUR_API_TOKEN' });

const run = await client.actor('parsebird/doinggoodleeds-scraper').call({
    entityTypes: ['job-listings', 'event'],
    maxItems: 50,
    enrichTaxonomies: true,
});

const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach(item => console.log(`${item.type}: ${item.title} — ${item.location}`));
```

### Input parameters

| Parameter | Type | Required | Default | Description |
|-----------|------|----------|---------|-------------|
| `startUrls` | array | No | — | WP-JSON endpoints, browser listing URLs, or single detail URLs from doinggoodleeds.org.uk |
| `entityTypes` | array | No | `["job-listings"]` | Entity types to scrape: `job-listings`, `volunteers`, `event`, `training-course` |
| `enrichTaxonomies` | boolean | No | `true` | Embed taxonomy names (categories, employment types) via WP-JSON `_embed` |
| `postedWithinHours` | integer | No | — | Only return items posted in the last N hours (24 = last day) |
| `maxItems` | integer | No | `1000` | Maximum items to return |
| `maxConcurrency` | integer | No | `5` | Parallel WP-JSON page-fetch limit |
| `minConcurrency` | integer | No | `1` | Minimum parallel requests |
| `maxRequestRetries` | integer | No | `5` | Retries before a failed request is abandoned |
| `proxy` | object | No | — | Proxy settings (not required — Cloudflare is passive) |

### Output example

```json
[
    {
        "type": "job",
        "cpt": "job-listings",
        "source": "doinggoodleeds.org.uk",
        "jobId": "109955",
        "slug": "community-activities-co-ordinator",
        "jobUrl": "https://doinggoodleeds.org.uk/job/community-activities-co-ordinator/",
        "wpJsonUrl": "https://doinggoodleeds.org.uk/wp-json/wp/v2/job-listings/109955",
        "title": "Community Activities Co-Ordinator",
        "description": "<p>Neighbourhood Action is a Neighbourhood Network Scheme providing support…</p>",
        "descriptionText": "Neighbourhood Action is a Neighbourhood Network Scheme providing support…",
        "companyName": "Neighbourhood Action",
        "companyWebsite": null,
        "location": "Neighbourhood Action in Farnley",
        "remote": false,
        "salary": "£13.00 Per hour",
        "categories": [],
        "employmentTypes": ["Part Time"],
        "contractType": "Part Time",
        "filled": false,
        "status": "publish",
        "postedDate": "2026-02-23T11:46:28Z",
        "modifiedDate": "2026-06-08T11:46:51Z",
        "applyType": "email",
        "applyUrl": "https://doinggoodleeds.org.uk/job/community-activities-co-ordinator/",
        "applyEmail": "neighbourhoodaction@hotmail.com",
        "authorId": 2452,
        "authorName": "Karen Buckland",
        "scrapedAt": "2026-06-14T12:00:00.000Z"
    },
    {
        "type": "job",
        "cpt": "job-listings",
        "source": "doinggoodleeds.org.uk",
        "jobId": "111249",
        "slug": "volunteer-coordinator",
        "jobUrl": "https://doinggoodleeds.org.uk/job/volunteer-coordinator/",
        "wpJsonUrl": "https://doinggoodleeds.org.uk/wp-json/wp/v2/job-listings/111249",
        "title": "Volunteer Coordinator",
        "description": "<p>Oblong is a lively and social organisation with a passion for making life better…</p>",
        "descriptionText": "Oblong is a lively and social organisation with a passion for making life better…",
        "companyName": "Oblong Ltd",
        "companyWebsite": null,
        "location": "Woodhouse Community Centre",
        "remote": false,
        "salary": "18,180.65",
        "categories": ["Support"],
        "employmentTypes": ["Part Time"],
        "contractType": "Part Time",
        "filled": false,
        "status": "publish",
        "postedDate": "2026-05-07T09:48:22Z",
        "modifiedDate": "2026-05-07T09:48:22Z",
        "applyType": "email",
        "applyUrl": "https://doinggoodleeds.org.uk/job/volunteer-coordinator/",
        "applyEmail": "jobs@oblong.org.uk",
        "authorId": 8770,
        "authorName": "Human Resources",
        "scrapedAt": "2026-06-14T12:00:00.000Z"
    }
]
```

Download results in JSON, CSV, Excel, or access programmatically via the [Apify API](https://docs.apify.com/api/v2). Connect to Google Sheets, Slack, Zapier, Make, and [more integrations](https://apify.com/integrations).

### Use cases

- 🏢 **Voluntary-sector recruitment** — monitor charity and nonprofit job postings in Leeds for daily hiring feeds
- 🤝 **Volunteer coordination** — map volunteering opportunities for student placement programmes or corporate volunteering
- 📅 **Community event aggregation** — pull events into a unified Leeds community calendar
- 📚 **Training intelligence** — track what courses charities are running and funding in the Leeds third sector
- 📊 **Workforce research** — Leeds third-sector pay benchmarks and employment type analysis
- 🔬 **Academic research** — build civil-society datasets combining jobs, volunteers, events, and training data

### How much does it cost to scrape Doing Good Leeds?

| Event | Price per event | Price per 1,000 |
|-------|----------------|-----------------|
| `result-scraped` | $0.00199 | **$1.99** |

Each item pushed to the dataset counts as one event. The site has approximately 178 total items across all four entity types, so a **full scrape of everything costs about $0.35**.

Apify platform usage (compute and bandwidth) is billed separately at standard [Apify pricing](https://apify.com/pricing). This actor uses minimal resources — typically under $0.01 per full run.

**Can I try it for free?** Yes — Apify's [free plan](https://apify.com/pricing) includes $5 of monthly usage, enough for hundreds of runs of this actor.

You can also set a spending limit on each run to cap costs. Use [Apify scheduling](https://docs.apify.com/platform/schedules) to automate daily or weekly monitoring.

### Is it legal to scrape Doing Good Leeds?

This actor accesses only publicly available data from the WP-JSON REST API on [doinggoodleeds.org.uk](https://doinggoodleeds.org.uk/). No authentication, login, or private endpoints are used. The data extracted is the same information visible to any visitor browsing the website.

Web scraping of publicly available data is generally permitted under applicable law. For detailed guidance, see Apify's blog post on [web scraping legality](https://blog.apify.com/is-web-scraping-legal/). Users are responsible for ensuring their use complies with doinggoodleeds.org.uk's Terms of Service and applicable data-protection regulations (GDPR, CCPA, etc.).

This actor is not affiliated with, endorsed by, or sponsored by Doing Good Leeds, Voluntary Action Leeds (VAL), or any of their subsidiaries.

### Related scrapers

Explore more job and data scrapers from [ParseBird](https://apify.com/parsebird):

- [Reed.co.uk Jobs Scraper](https://apify.com/parsebird/reed-co-uk-scraper) — scrape UK job listings from Reed.co.uk
- [Hiring.cafe Jobs Scraper](https://apify.com/parsebird/hiring-cafe-scraper) — search across 20+ filters for global tech jobs
- [BuiltIn Jobs Scraper](https://apify.com/parsebird/builtin-jobs-scraper) — US tech job listings from BuiltIn.com
- [Bayt Jobs Scraper](https://apify.com/parsebird/bayt-jobs-scraper) — Middle East job listings from Bayt.com
- [HelloWork Jobs Scraper](https://apify.com/parsebird/hellowork-jobs-scraper) — French job listings from HelloWork.com
- [Data Deduplicator](https://apify.com/parsebird/dataset-deduplicator) — deduplicate any Apify dataset
- [HTTP Request Actor](https://apify.com/parsebird/http-request-actor) — make HTTP requests from the Apify platform

### FAQ

**Can I scrape all four entity types in one run?**
Yes. Set `entityTypes` to `["job-listings", "volunteers", "event", "training-course"]` and leave `startUrls` empty. Each result row has a `cpt` field indicating which collection it came from.

**How fresh is the data?**
Data is scraped live from the WP-JSON API on each run. Use the `postedWithinHours` parameter to filter for only recently posted items — set to 24 for the last day, 72 for the last three days.

**Why are some fields null for non-job entities?**
Fields like `companyName`, `salary`, and `applyEmail` are specific to job listings. Volunteering profiles, events, and training courses use different page structures and may not have these fields populated.

**Where does the company name come from?**
The company name is extracted from the detail page subtitle on doinggoodleeds.org.uk. Most job listings include the employer name there.

**Do I need a proxy?**
No. The WP-JSON API passes through Cloudflare with only a passive cookie — standard HTTP requests work without a proxy.

**Can I schedule recurring runs?**
Yes. Use [Apify scheduling](https://docs.apify.com/platform/schedules) to run daily, weekly, or at any interval. Combine with `postedWithinHours` for efficient monitoring that only fetches new listings.

**Can I access the data via API?**
Yes. Use the [Apify API](https://docs.apify.com/api/v2) to trigger runs and retrieve results programmatically. See the Python and JavaScript examples above.

**How do I limit costs?**
Set `maxItems` to control how many results are returned. Set a spending limit on your run to cap total charges. The entire site has only ~178 items, so costs are minimal.

**Can I scrape a single job or event by URL?**
Yes. Paste a detail URL like `https://doinggoodleeds.org.uk/job/young-adults-worker-3/` into the `startUrls` field. The actor will resolve the slug and fetch that single item.

**What output formats are available?**
JSON, CSV, Excel, HTML, XML, and RSS. Download from the Apify Console or access via the API. Connect to [Google Sheets, Slack, Zapier, Make](https://apify.com/integrations), and more.

# Actor input Schema

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

WP-JSON endpoints, browser listing URLs, or single detail URLs from doinggoodleeds.org.uk. Leave empty to scrape all entities matching the Entity Types selector below.

## `entityTypes` (type: `array`):

Which entity types to scrape when Start URLs is empty. Pick any combination of the four collections available on doinggoodleeds.org.uk.

## `enrichTaxonomies` (type: `boolean`):

Embed taxonomy term names (categories, employment types) via WP-JSON \_embed. Disable for faster, lighter responses.

## `postedWithinHours` (type: `integer`):

Only return items posted in the last N hours (24 = last day, 72 = last 3 days). Leave empty or set to 0 to return all items. Ideal for daily monitoring runs.

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

Maximum number of items to return. The site has ~178 total items across all entity types.

## `maxConcurrency` (type: `integer`):

Maximum number of parallel WP-JSON page requests.

## `minConcurrency` (type: `integer`):

Minimum number of parallel WP-JSON page requests.

## `maxRequestRetries` (type: `integer`):

How many times to retry a failed WP-JSON request before giving up.

## `proxy` (type: `object`):

Proxy settings. Doing Good Leeds allows access without a proxy — only enable if you experience Cloudflare blocking.

## Actor input object example

```json
{
  "startUrls": [
    {
      "url": "https://doinggoodleeds.org.uk/wp-json/wp/v2/job-listings"
    }
  ],
  "entityTypes": [
    "job-listings"
  ],
  "enrichTaxonomies": true,
  "maxItems": 100,
  "maxConcurrency": 5,
  "minConcurrency": 1,
  "maxRequestRetries": 5
}
```

# Actor output Schema

## `dataset` (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://doinggoodleeds.org.uk/wp-json/wp/v2/job-listings"
        }
    ],
    "entityTypes": [
        "job-listings"
    ],
    "enrichTaxonomies": true,
    "maxItems": 100,
    "maxConcurrency": 5,
    "minConcurrency": 1,
    "maxRequestRetries": 5
};

// Run the Actor and wait for it to finish
const run = await client.actor("parsebird/doinggoodleeds-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://doinggoodleeds.org.uk/wp-json/wp/v2/job-listings" }],
    "entityTypes": ["job-listings"],
    "enrichTaxonomies": True,
    "maxItems": 100,
    "maxConcurrency": 5,
    "minConcurrency": 1,
    "maxRequestRetries": 5,
}

# Run the Actor and wait for it to finish
run = client.actor("parsebird/doinggoodleeds-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 '{
  "startUrls": [
    {
      "url": "https://doinggoodleeds.org.uk/wp-json/wp/v2/job-listings"
    }
  ],
  "entityTypes": [
    "job-listings"
  ],
  "enrichTaxonomies": true,
  "maxItems": 100,
  "maxConcurrency": 5,
  "minConcurrency": 1,
  "maxRequestRetries": 5
}' |
apify call parsebird/doinggoodleeds-scraper --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Doing Good Leeds Scraper",
        "description": "Scrape paid jobs, volunteering, events, and training courses from doinggoodleeds.org.uk via WP-JSON. Four entity types, ~178 items total. Title, employer, location, salary, apply email/URL, full description HTML. Export as JSON, CSV, Excel.",
        "version": "1.0",
        "x-build-id": "Xy2DFokBi5Ch38YPx"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/parsebird~doinggoodleeds-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-parsebird-doinggoodleeds-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/parsebird~doinggoodleeds-scraper/runs": {
            "post": {
                "operationId": "runs-sync-parsebird-doinggoodleeds-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/parsebird~doinggoodleeds-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-parsebird-doinggoodleeds-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",
                "properties": {
                    "startUrls": {
                        "title": "Start URLs",
                        "type": "array",
                        "description": "WP-JSON endpoints, browser listing URLs, or single detail URLs from doinggoodleeds.org.uk. Leave empty to scrape all entities matching the Entity Types selector below.",
                        "items": {
                            "type": "object",
                            "required": [
                                "url"
                            ],
                            "properties": {
                                "url": {
                                    "type": "string",
                                    "title": "URL of a web page",
                                    "format": "uri"
                                }
                            }
                        }
                    },
                    "entityTypes": {
                        "title": "Entity Types",
                        "type": "array",
                        "description": "Which entity types to scrape when Start URLs is empty. Pick any combination of the four collections available on doinggoodleeds.org.uk.",
                        "items": {
                            "type": "string",
                            "enum": [
                                "job-listings",
                                "volunteers",
                                "event",
                                "training-course"
                            ],
                            "enumTitles": [
                                "Paid Jobs",
                                "Volunteering",
                                "Events",
                                "Training Courses"
                            ]
                        },
                        "default": [
                            "job-listings"
                        ]
                    },
                    "enrichTaxonomies": {
                        "title": "Enrich Taxonomies",
                        "type": "boolean",
                        "description": "Embed taxonomy term names (categories, employment types) via WP-JSON _embed. Disable for faster, lighter responses.",
                        "default": true
                    },
                    "postedWithinHours": {
                        "title": "Posted Within Hours",
                        "minimum": 0,
                        "type": "integer",
                        "description": "Only return items posted in the last N hours (24 = last day, 72 = last 3 days). Leave empty or set to 0 to return all items. Ideal for daily monitoring runs."
                    },
                    "maxItems": {
                        "title": "Max Items",
                        "minimum": 1,
                        "type": "integer",
                        "description": "Maximum number of items to return. The site has ~178 total items across all entity types.",
                        "default": 1000
                    },
                    "maxConcurrency": {
                        "title": "Max Concurrency",
                        "minimum": 1,
                        "maximum": 10,
                        "type": "integer",
                        "description": "Maximum number of parallel WP-JSON page requests.",
                        "default": 5
                    },
                    "minConcurrency": {
                        "title": "Min Concurrency",
                        "minimum": 1,
                        "maximum": 10,
                        "type": "integer",
                        "description": "Minimum number of parallel WP-JSON page requests.",
                        "default": 1
                    },
                    "maxRequestRetries": {
                        "title": "Max Request Retries",
                        "minimum": 0,
                        "maximum": 10,
                        "type": "integer",
                        "description": "How many times to retry a failed WP-JSON request before giving up.",
                        "default": 5
                    },
                    "proxy": {
                        "title": "Proxy Configuration",
                        "type": "object",
                        "description": "Proxy settings. Doing Good Leeds allows access without a proxy — only enable if you experience Cloudflare blocking."
                    }
                }
            },
            "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
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
