# Escape the City Scraper: Purpose-Driven UK Jobs (`santamaria-automations/escape-the-city-scraper`) Actor

Extract UK purpose-driven job listings from Escape the City (escapethecity.org). Returns 30+ fields per row: title, employer, salary, location, cause, workplace type, B-Corp / Top-1% / visa-sponsor flags, benefits, plus employer website, about text, hero image and other open roles. Pay per result.

- **URL**: https://apify.com/santamaria-automations/escape-the-city-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 $3.00 / 1,000 search 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/actors/running/actors-in-store.md#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

## Escape the City Scraper: Purpose-Driven UK Jobs

Extract UK purpose-driven job listings from [Escape the City](https://www.escapethecity.org), a hand-curated board for ethical, social-impact, sustainability, B-Corp, charity and progressive-startup roles. Signal-to-noise is far higher here than on generalist boards because every listing is vetted for mission alignment.

### What it does

Given one or more keywords (optionally with a location, cause area or workplace-type filter), the actor walks Escape the City's search results, extracts each job card, and can optionally fetch the full detail page for the complete description, apply URL and closing date, and can optionally resolve each employer's profile page for the enriched about text, external website and other open roles at the same organisation.

- Search by keyword (`sustainability`, `climate`, `social impact`, `B-Corp`, ...) or feed direct URLs
- Filter by cause (Sustainable consumption, Climate action, Reducing inequalities, and more)
- Filter by workplace type (Fully remote, Hybrid, In person)
- Restrict to B-Corp certified, Escape Top 1% Certified, or visa-sponsor employers only
- Fast search mode returns 25+ core fields from a single request
- Full detail mode adds the complete job description, apply URL, application instructions, closing date and structured salary
- Deep employer mode also resolves each unique employer's `/organisation/{slug}` page for the enriched about text, external website, hero image and a list of other open roles

### Sample output

```json
{
  "_type": "job",
  "id": "1785895249629x380953201525951360",
  "title": "Sustainability Consultant",
  "employer_name": "Seismic",
  "company_logo_url": "https://imagedelivery.net/UyWgzBGGhtJ_birCaenX3A/81a02f1d-69f3-4a8b-241b-3eb6bf38bb00/public",
  "location": "London, London, United Kingdom",
  "country": "GB",
  "cause": "Sustainable consumption",
  "industry": "Consulting, Environment and Conservation",
  "employment_type": "full-time",
  "experience_level": "mid",
  "workplace_type": "hybrid",
  "remote_working": "Hybrid - 60%",
  "mission_type": "B-Corp, Top 1% Employer",
  "bcorp": true,
  "top1percent_employer": true,
  "visa_sponsor": false,
  "employer_size": "11-50",
  "escape_factor": ["Socially impactful", "People-first culture", "Small & unique"],
  "benefits": ["Pet friendly", "Paid sabbatical", "Enhanced maternity", "Task based interview", "Home office budget", "Enhanced holidays"],
  "salary_min": null,
  "salary_max": null,
  "salary_currency": null,
  "salary_period": null,
  "salary_text": null,
  "headline": "Join Seismic to drive meaningful change and help accelerate a sustainable future.",
  "description_snippet": "Join Seismic to drive meaningful change and help accelerate a sustainable future.",
  "posted_at": "2026-05-27",
  "closing_at": null,
  "source_url": "https://www.escapethecity.org/opportunity/53172-sustainability-consultant--at-seismic",
  "source_platform": "escapethecity.org",
  "apply_url": "https://careers.seismic.com/jobs/8167280?utm_source=escape-the-city",
  "scraped_at": "2026-08-20T18:30:00Z",
  "company_about": "Seismic is a values-led consultancy accelerating the transition to a sustainable future...",
  "company_website": "https://seismic.eco",
  "company_active_jobs_count": 3,
  "company_active_jobs": [
    {
      "title": "Senior Consultant (Sustainability Communications)",
      "job_url": "https://www.escapethecity.org/opportunity/53100-senior-consultant-sustainability-communications--at-seismic"
    }
  ]
}
```

### Pricing

**$0.001 per actor start + $0.003 per search result + $0.005 per full detail result + $0.005 per unique employer resolved (only when `includeCompanyDetails` is on).**

Typical cost:

- **Search mode**: about $3 per 1,000 jobs (title, employer, location, cause, workplace type, benefits, B-Corp / Top-1% / visa-sponsor flags, employer size, headline, posted date, logo)
- **Full mode**: about $8 per 1,000 jobs (adds full description, apply URL, application instructions, closing date, structured salary)
- **Deep employer mode** (adds `includeCompanyDetails=true`): about $8 per 1,000 jobs + $0.005 per unique employer. Employers are deduplicated within a run, so 100 jobs from 40 different employers cost about $8.20, not $8.50.

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 search 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). Provide either this or `startUrls`. |
| `startUrls` | array of strings | Direct SERP or PDP URLs to crawl instead of building searches from keywords. Mutually exclusive with `searchQueries`. |
| `location` | string | City, region or 'Remote' to bias results towards. Included in the Algolia query for relevance ranking. |
| `cause` | select | Optional cause filter (Sustainable consumption, Climate action, Reducing inequalities, and more). |
| `remote` | select | Optional workplace-type filter (Fully remote, In person, Hybrid tiers). |
| `bcorp` | boolean | Restrict results to B-Corp certified organisations only. |
| `top1Percent` | boolean | Restrict results to Escape's Top 1% Certified employer list. |
| `visaSponsor` | boolean | Restrict results to employers able to sponsor a UK visa. |
| `maxResults` | integer | Total cap across all keywords (default 25). |
| `maxResultsPerQuery` | integer | Cap per individual keyword (default 200). |
| `includeJobDetails` | boolean | Fetch each detail page for full data plus apply URL and closing date (default false). |
| `includeCompanyDetails` | boolean | Also resolve each unique employer's organisation page for enriched about text, external website and other open roles. Requires `includeJobDetails=true`. Deduplicated per run. Default false. |
| `maxConcurrency` | integer | Parallel detail-page requests (default 4, max 20). |

### Output fields

**Core listing:** `_type`, `id`, `title`, `employer_name`, `company_logo_url`, `location`, `country`, `source_url`, `source_platform`, `scraped_at`.

**Purpose taxonomy:** `cause`, `sector`, `industry`, `mission_type`, `bcorp`, `top1percent_employer`, `visa_sponsor`, `escape_factor`.

**Role structure:** `employment_type`, `experience_level`, `workplace_type`, `remote_working`, `employer_size`, `benefits`.

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

**Description:** `headline`, `description_snippet` (search mode), `description_full` and `description_html` (full mode).

**Dates:** `posted_at`, `closing_at` (full mode).

**Application:** `apply_url` (external), `application_instructions` (full mode).

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

**Employer profile (`includeCompanyDetails=true`):** `company_about`, `company_headline`, `company_website`, `company_hero_image`, `company_profile_url`, `company_active_jobs_count`, `company_active_jobs`.

### 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/escape-the-city-scraper`

**Example prompt once connected:**

> "Use `escape-the-city-scraper` to find the 20 most recent sustainability roles at B-Corp employers in London. Enable `includeCompanyDetails` so I get each employer's website and other open roles. Return a table with employer, title, workplace type, website."

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

### Why this scraper

- Escape the City is one of the very few boards where every listing is vetted for mission alignment. If you want the sustainability, climate, charity, or ethical-startup filter to be meaningful, this is your source.
- Cause taxonomy, B-Corp flag, Top-1% Employer flag, visa-sponsor flag, benefits list, escape-factor tags: none of these live on aggregators. They come from Escape's own moderated dataset.
- Salary is only surfaced when the employer opts to display it (Escape does not scrape it from body text). When null, `salary_text` sometimes carries a free-text range from the PDP overview.
- Employer profile pages are rich enough to be a lead-gen surface on their own: external website, hero image, long about text, and a live list of other open roles. All accessed via one extra fetch per employer, deduplicated in the run.

### Common use cases

- Sourcing candidates for a sustainability or ESG recruiter: filter by `cause=Sustainable consumption` or `cause=Climate action`.
- Feeding an ethical-jobs aggregator: run without keywords, cap at 500 results, refresh daily.
- Employer-brand research: run with `top1Percent=true` and `includeCompanyDetails=true` to enumerate every Escape-certified employer and their open roles.
- Visa-sponsor watchlist: filter with `visaSponsor=true` and re-run weekly.
- B-Corp analytics: filter with `bcorp=true` and analyse industry distribution across roles.

### Notes and limits

- Escape the City is a curated board: the live pool is a few hundred to low thousands of roles at any time, not tens of thousands. A single search with `maxResults=1000` will typically return whatever is available, not artificial padding.
- Salary numeric fields (`salary_min`, `salary_max`) are only populated when the employer opts to show salary. When null, check `salary_text` for a free-text range, or expect that Escape leaves salary intentionally open.
- `closing_at` is null when the employer sets no expiry date (Escape's own default), meaning the role is open until filled.
- `description_full` and `apply_url` only populate when `includeJobDetails` is true (they live on the detail page, not the search response).
- `company_about`, `company_website`, `company_hero_image`, `company_active_jobs` only populate when `includeCompanyDetails` is true.
- `cause` is Escape the City's own SDG-inspired taxonomy, not a job-title inference. Some roles have multiple cause tags.
- The `apply_url` is typically the employer's own careers site with a `utm_source=escape-the-city` query parameter, not an in-house apply form.

### Related Actors

- [Guardian Jobs Scraper](https://apify.com/santamaria-automations/guardianjobs-scraper) : the UK's curated board for charity, media, education and public-sector roles.
- [CharityJob UK Scraper](https://apify.com/santamaria-automations/charityjob-uk-scraper) : the UK's largest charity-only job board.
- [Reed.co.uk Scraper](https://apify.com/santamaria-automations/reed-uk-scraper) : the UK's largest general-purpose job board, 200,000+ live roles.
- [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/escape-the-city-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 escapethecity.org (for example 'sustainability', 'social impact', 'climate', 'charity'). Each keyword runs as a separate search against the site's Algolia backend. Results are deduplicated by job ID. Leave blank if you supply startUrls instead.

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

Direct escapethecity.org URLs to crawl instead of building searches from keywords. Supports SERP URLs like https://www.escapethecity.org/search/jobs?query=climate and individual PDP URLs like https://www.escapethecity.org/opportunity/{slug}. Mutually exclusive with searchQueries: provide one or the other.

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

Town, city or region to bias results towards (for example 'London', 'Manchester', 'Remote'). Included in the Algolia query for relevance ranking against the location-txt field.

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

Fetch each job's detail page for the full description, apply URL, application instructions, closing date and structured salary. Adds one extra HTTP hop per job.

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

Also resolve each unique employer to its Escape the City /organisation/{slug} page for the enriched about text, external website, hero image and a list of the employer's other currently-open roles. Adds one extra HTTP hop per unique employer (deduplicated within the run) and charges a separate company-detail-result event at $0.005 each. Requires includeJobDetails=true.

## `cause` (type: `string`):

Optional cause filter. Escape the City organises purpose-driven roles by cause area.

## `remote` (type: `string`):

Optional workplace-type filter matching the site's own option-remote facet.

## `bcorp` (type: `boolean`):

Restrict results to B-Corp certified organisations only.

## `top1Percent` (type: `boolean`):

Restrict results to Escape's Top 1% Certified employer list only.

## `visaSponsor` (type: `boolean`):

Restrict results to employers able to sponsor a UK visa.

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

Total cap across all search keywords.

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

Maximum results per individual search keyword.

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

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

## Actor input object example

```json
{
  "searchQueries": [
    "sustainability"
  ],
  "location": "London",
  "includeJobDetails": false,
  "includeCompanyDetails": false,
  "cause": "",
  "remote": "",
  "bcorp": false,
  "top1Percent": false,
  "visaSponsor": false,
  "maxResults": 5,
  "maxResultsPerQuery": 5,
  "maxConcurrency": 4
}
```

# Actor output Schema

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

Dataset containing scraped Escape the City listings. Each row includes job ID, title, employer, cause, industry, workplace type, remote-working detail, benefits list, salary (min/max/currency/period/text), full description, apply URL, application instructions, posted and closing dates, and (when includeCompanyDetails=true) employer website, hero image, active-jobs list.

# 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": [
        "sustainability"
    ],
    "includeJobDetails": false,
    "includeCompanyDetails": false,
    "maxResults": 5,
    "maxResultsPerQuery": 5,
    "maxConcurrency": 4
};

// Run the Actor and wait for it to finish
const run = await client.actor("santamaria-automations/escape-the-city-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": ["sustainability"],
    "includeJobDetails": False,
    "includeCompanyDetails": False,
    "maxResults": 5,
    "maxResultsPerQuery": 5,
    "maxConcurrency": 4,
}

# Run the Actor and wait for it to finish
run = client.actor("santamaria-automations/escape-the-city-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": [
    "sustainability"
  ],
  "includeJobDetails": false,
  "includeCompanyDetails": false,
  "maxResults": 5,
  "maxResultsPerQuery": 5,
  "maxConcurrency": 4
}' |
apify call santamaria-automations/escape-the-city-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,santamaria-automations/escape-the-city-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/VYrTSbZSSk444XALw/builds/CYjcLLdHlSLsB6tCW/openapi.json
