# CharityJob UK Scraper: Nonprofit & Charity Jobs (`santamaria-automations/charityjob-uk-scraper`) Actor

Extract charity, nonprofit and social sector job listings from CharityJob (charityjob.co.uk), the UK's largest specialist charity job board. Returns title, employer, cause area, salary (GBP min/max), workplace type, closing date, full description and apply URL. Pay per result.

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

## Pricing

from $1.40 / 1,000 serp results

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 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

### CharityJob UK Scraper

Extract charity, nonprofit and social sector job listings from [CharityJob](https://www.charityjob.co.uk), the UK's largest specialist charity job board with 5,000+ live roles across fundraising, campaigns, communications, programmes, operations, policy, and volunteer coordination.

### What it does

Given one or more search keywords (optionally with a UK location), the actor walks CharityJob's search results, extracts each job card, and can optionally fetch the full detail page for the complete description, structured salary, employment type, cause area, tags, and application deadline.

- Search by keyword (`fundraising manager`, `communications officer`, `programme coordinator`, ...)
- Filter by UK location (`London`, `Manchester`, `Edinburgh`, `Remote`)
- Cap results per employer to get sector breadth rather than one dominant charity
- Fast SERP mode returns 14 fields per row from the search page alone
- Full detail mode also returns the complete job description, cause area, category tags, employment type, salary min/max and closing date
- Deep-employer mode (`includeCompanyDetails: true`) also fetches each charity's /organisation profile page for the About-us text, external website, headquarters city, and a list of the charity's other currently-open roles

### Sample output

```json
{
  "_type": "job",
  "job_id": "1080735",
  "title": "Senior Community Fundraising Manager (Retention)",
  "company_name": "Diabetes UK",
  "company_logo_url": "https://downloads.charityjob.co.uk/cdn-cgi/image/width=240,height=240,fit=contain,format=auto/uploads/logo_new_strap_cmyk_01_2018_03_02_10_45_02_am.png",
  "organisation_type": "Registered Charity",
  "location": "Remote",
  "country": "GB",
  "workplace_type": "remote",
  "category": "Campaigns, Project Management, Advocacy, Strategy, Community Fundraising, Direct / Supporters, Events / Activities",
  "cause_area": "Charities, Charity Support",
  "employment_type": "full-time, contract",
  "salary_min": 48626,
  "salary_max": 54029,
  "salary_currency": "GBP",
  "salary_period": "year",
  "salary_text": "\u00a348,626 - \u00a354,029",
  "description": "We have an exciting opportunity for a strategic leader who can set the direction for retention...",
  "tags": ["Campaigns", "Project Management", "Advocacy", "Strategy", "Community Fundraising"],
  "posted_at": "2026-08-18",
  "closing_at": "2026-09-06",
  "job_url": "https://www.charityjob.co.uk/jobs/diabetes-uk/senior-community-fundraising-manager-retention-/1080735",
  "application_url": "https://www.charityjob.co.uk/jobs/diabetes-uk/senior-community-fundraising-manager-retention-/1080735",
  "job_ref": "diabetesuk/TP/35192/1342",
  "source_platform": "charityjob.co.uk",
  "search_query": "fundraising manager in London",
  "scraped_at": "2026-08-18T20:15:00Z",
  "company_website": "https://www.diabetes.org.uk/",
  "company_address_city": "London",
  "company_address_country": "UK",
  "company_about": "Diabetes UK is the UK's leading charity for the 4.9 million people living with diabetes. We fund research, campaign for change, and support people to live well with diabetes...",
  "company_active_jobs_count": 8
}
```

### Pricing

**$0.001 per actor start + $0.003 per SERP result + $0.005 per full detail result + $0.005 per unique employer resolved (when `includeCompanyDetails: true`).**

Typical cost:

- **SERP mode**: about $3 per 1,000 jobs (title, employer, salary text, location, logo, posted date)
- **Full mode**: about $8 per 1,000 jobs (adds cause area, category tags, structured salary, employment type, full description, closing date)

You only pay for detail fetches that succeed. Failed fetches are not charged.

**New to Apify?** Every account gets a $5 free monthly platform credit, enough for around 1,600 SERP rows or around 600 full-detail rows on this actor before you commit to paying anything. Test extensively first.

### Input

| Field | Type | Description |
|---|---|---|
| `searchQueries` | array of strings | Keywords to search for (each runs as a separate search) |
| `location` | string | UK town, city, region, or `Remote` |
| `maxResults` | integer | Total cap across all keywords (default 25) |
| `maxResultsPerQuery` | integer | Cap per individual keyword (default 200) |
| `maxJobsPerCompany` | integer | Optional cap per employer (0 = disabled) |
| `includeJobDetails` | boolean | Fetch each detail page for full data (default false) |
| `includeCompanyDetails` | boolean | Also fetch the /organisation profile page for About-us, website, headquarters, and the charity's other open roles. Deduplicated per employer within a run. Implies `includeJobDetails=true`. Default false. |
| `maxConcurrency` | integer | Parallel detail-page requests (default 4, max 20) |
| `proxyConfiguration` | proxy | Defaults to Apify residential proxies |

### Output fields

**Core listing:** `_type`, `job_id`, `title`, `company_name`, `company_logo_url`, `organisation_type`, `location`, `country`, `job_url`, `application_url`, `source_platform`, `scraped_at`.

**Structured job facets (full mode):** `category`, `cause_area`, `employment_type`, `workplace_type`, `tags`, `job_ref`.

**Salary:** `salary_min`, `salary_max`, `salary_currency`, `salary_period`, `salary_text`.

**Description:** `description` and `description_html` (full mode).

**Dates:** `posted_at`, `closing_at`.

**Context:** `search_query` (which keyword produced this row).

**Employer / company profile (`includeCompanyDetails: true`):** `company_about`, `company_website`, `company_address_city`, `company_address_country`, `company_active_jobs_count`, `company_active_jobs[]` (title + job\_url per role). `company_phone`, `company_email`, `company_address_street`, `company_address_postcode` are usually null on CharityJob - the charity profile pages do not expose these fields.

### Use with AI Agents (MCP)

Connect this actor to any MCP-compatible AI client: Claude Desktop, Claude.ai, Cursor, VS Code, LangChain, LlamaIndex, or custom agents.

**Apify MCP server URL:**

`https://mcp.apify.com?tools=santamaria-automations/charityjob-uk-scraper`

**Example prompt once connected:**

> "Use `charityjob-uk-scraper` to find the 30 most recent fundraising manager roles in London with salary details and closing dates. Return results as a table."

Clients that support dynamic tool discovery (Claude.ai, VS Code) will receive the full input schema automatically.

### Why this scraper

- CharityJob is a specialist board built for the UK third sector. Signal-to-noise on charity, campaigning, programmes and international development is far higher than any generalist aggregator.
- Structured salary, employment type and cause area come out of the schema.org JSON-LD job posting embedded in every listing, not a fragile HTML scrape.
- Category and cause area are the site's own taxonomy (Fundraising, Campaigns, Advocacy, Health, Education, Environment, ...) not guessed labels.
- Employer logos are extracted from the SERP card so the output is presentation-ready for a jobs feed, CRM, or newsletter.

### Common use cases

- Building a sector-specific jobs feed for a nonprofit, charity CIC, or think-tank community.
- Sourcing candidates for a charity recruiter: filter by keyword like `programme director` or `head of fundraising`.
- Watching a target charity: search their name as a keyword and re-run daily to catch new roles.
- Nonprofit salary benchmarking: pull all fundraising roles with `includeJobDetails=true` and analyse `salary_min` / `salary_max` by cause area.

### Notes and limits

- Some listings only advertise a salary range as free text (for example "Competitive" or "Voluntary"). In those cases `salary_min` and `salary_max` will be null and `salary_text` carries the original phrase.
- Category, cause area, tags, employment type and closing date populate most consistently when `includeJobDetails` is true (they live on the detail page, not the SERP card).
- The `application_url` field returns the CharityJob listing URL. Clicking Apply on that page redirects the browser to the recruiter's own application form; the destination is set at click-time and is not exposed server-side.
- CharityJob's search page returns 15 top-jobs on page 1 and roughly 25-30 organic listings per page after that. Very narrow keywords can return under 30 total results.

### Related Actors

- [Guardian Jobs Scraper](https://apify.com/santamaria-automations/guardianjobs-scraper) : Guardian Jobs, strong on UK charity, media, education and public sector roles.
- [Reed.co.uk Scraper](https://apify.com/santamaria-automations/reed-uk-scraper) : the UK's largest general-purpose job board.
- [CV-Library Scraper](https://apify.com/santamaria-automations/cvlibrary-scraper) : another large UK job board with strong industrial coverage.
- [Website Email Scraper](https://apify.com/santamaria-automations/website-email-scraper) : find contact emails on employer websites, useful for outreach after sourcing.

### Support

For issues, feature requests, or filter combinations that don't behave as expected, please open an issue on the [Issues tab](https://apify.com/santamaria-automations/charityjob-uk-scraper/issues) of this actor. We typically respond within 6 hours.

Contact: contact@nanoscrape.com

# Actor input Schema

## `searchQueries` (type: `array`):

One or more keywords to search for on charityjob.co.uk (for example 'fundraising manager', 'campaigns officer', 'programme coordinator'). Each keyword runs as a separate search. Results are deduplicated by job ID.

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

Direct SERP URLs to crawl instead of building from keywords. Mutually exclusive with searchQueries — provide one or the other.

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

UK town, city or region to restrict results to (for example 'London', 'Manchester', 'Edinburgh'). Applied to every search keyword.

## `includeJobDetails` (type: `boolean`):

Fetch each job's detail page for the full description, structured salary, employment type, cause area, tags, and application deadline. Slower and slightly more expensive but returns the richest data.

## `includeCompanyDetails` (type: `boolean`):

Also fetch each unique employer's company profile page for the About-us text, phone, address, website, and a list of the employer's other currently-open roles. Deduplicated per employer within a run. Adds $0.005 per unique employer. Implies includeJobDetails=true (employer link only lives on the PDP).

## `maxResults` (type: `integer`):

Total cap across all search keywords.

## `maxResultsPerQuery` (type: `integer`):

Maximum results per individual search keyword.

## `maxJobsPerCompany` (type: `integer`):

Optional cap on how many roles are returned from any single charity or employer. Useful when a large national charity dominates a keyword and you want breadth across the sector. Set to 0 to disable the cap.

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

Number of detail pages to fetch in parallel when full details are enabled.

## Actor input object example

```json
{
  "searchQueries": [
    "fundraising manager"
  ],
  "location": "London",
  "includeJobDetails": false,
  "includeCompanyDetails": false,
  "maxResults": 25,
  "maxResultsPerQuery": 200,
  "maxJobsPerCompany": 0,
  "maxConcurrency": 4
}
```

# Actor output Schema

## `jobListings` (type: `string`):

Dataset containing scraped CharityJob UK listings. Each row includes job ID, title, employer, organisation type, cause area, category, salary (min/max/currency/period/text), employment type, workplace type, tags, description (plain + HTML), posted and closing dates, apply URL and canonical job URL.

# 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 = {
    "searchQueries": [
        "fundraising manager"
    ],
    "includeJobDetails": false,
    "maxResults": 25,
    "maxResultsPerQuery": 200,
    "maxJobsPerCompany": 0,
    "maxConcurrency": 4
};

// Run the Actor and wait for it to finish
const run = await client.actor("santamaria-automations/charityjob-uk-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 = {
    "searchQueries": ["fundraising manager"],
    "includeJobDetails": False,
    "maxResults": 25,
    "maxResultsPerQuery": 200,
    "maxJobsPerCompany": 0,
    "maxConcurrency": 4,
}

# Run the Actor and wait for it to finish
run = client.actor("santamaria-automations/charityjob-uk-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 '{
  "searchQueries": [
    "fundraising manager"
  ],
  "includeJobDetails": false,
  "maxResults": 25,
  "maxResultsPerQuery": 200,
  "maxJobsPerCompany": 0,
  "maxConcurrency": 4
}' |
apify call santamaria-automations/charityjob-uk-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,santamaria-automations/charityjob-uk-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/2VjAYvMtpE5ibGLMV/builds/bpKv8fXlwbIncNSmU/openapi.json
