# CWJobs Scraper - UK Tech Jobs Data (`benthepythondev/cwjobs-scraper`) Actor

Scrape CWJobs UK technology job listings: title, company, location, salary, posted date, remote flag, logo and URL.

- **URL**: https://apify.com/benthepythondev/cwjobs-scraper.md
- **Developed by:** [ben](https://apify.com/benthepythondev) (community)
- **Categories:** Jobs, Business, 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 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 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

## CWJobs Scraper - UK Tech Jobs Data

Scrape UK technology job listings from **CWJobs.co.uk** in one run. Get job title, hiring company, location, salary label, posted date, work-from-home flag, company logo and direct job URL. Export to JSON, CSV or Excel, schedule recurring runs, call the actor through the API, or send results to Make, Zapier, n8n, Airtable, Google Sheets, a recruiting CRM or your own job-board backend.

### What is the CWJobs Scraper?

CWJobs is a UK technology job board focused on software engineering, IT infrastructure, data, cybersecurity, product, cloud, support and digital roles. Recruiters and employers use it to publish specialist technology vacancies across London, Manchester, Birmingham, Leeds, Scotland, remote roles and the wider UK market.

For recruiters, agencies, labor-market analysts and B2B sales teams, CWJobs listings are high-intent hiring-signal data. They show which companies are hiring technical talent, what stack or role family they need, and where demand is concentrated. This actor turns CWJobs search results into clean structured data without requiring a browser, account, proxy or paid unblocker.

### What data does it extract?

- **Job ID**
- **Job title**
- **Hiring company**
- **Location**
- **Direct job URL**
- **Posted date / time**
- **Work-from-home flag**
- **Salary label** when shown
- **Company logo URL**
- **Search URL used**

### Input

| Field | Type | Description |
|-------|------|-------------|
| `searchUrls` | array | Full CWJobs search URLs to scrape exactly. |
| `keyword` | string | Tech role, skill or keyword to search if no URL is provided. |
| `location` | string | Optional UK city or region for keyword searches. |
| `maxResults` | integer | Maximum jobs returned. |

### Example input

```json
{
  "keyword": "python developer",
  "location": "London",
  "maxResults": 50
}
````

Using an exact search URL:

```json
{
  "searchUrls": ["https://www.cwjobs.co.uk/jobs/devops-engineer/in-london"],
  "maxResults": 100
}
```

### Output

Each dataset item is one CWJobs listing:

```json
{
  "job_id": "12345678",
  "title": "Python Developer",
  "company": "Example Technology Ltd",
  "location": "London",
  "url": "https://www.cwjobs.co.uk/job/python-developer/example-12345678",
  "posted": "2 days ago",
  "work_from_home": true,
  "salary": "£65,000 - £85,000",
  "company_logo": "https://...",
  "search": "https://www.cwjobs.co.uk/jobs/python-developer/in-london"
}
```

### Use cases

- **Tech recruiting intelligence** - monitor demand for Python, Java, DevOps, cloud, data, cybersecurity and product roles.
- **Lead generation** - identify companies actively hiring technical staff, a strong buying signal for IT services, SaaS, payroll, HR tools, training and staffing.
- **Salary research** - collect visible salary labels for technical roles.
- **Competitor hiring alerts** - track hiring by competitors, customers or target accounts.
- **Job-board aggregation** - feed CWJobs cards into a niche UK tech jobs board, newsletter or internal talent dashboard.
- **Regional market analysis** - compare demand across London, Manchester, Birmingham, Scotland, remote and other UK markets.

### Why use this actor?

The actor parses CWJobs' server-rendered search cards with stable `data-at` attributes. That is more reliable and cheaper than launching a browser. It runs in a small container, avoids residential proxy costs and returns normalized output that is ready for spreadsheets, dashboards and enrichment workflows.

CWJobs belongs to the StepStone group, so the page structure is close to other high-demand job boards. The actor reuses a proven parser pattern already tested on similar sites, while keeping the branding, input defaults, README and SEO targeted specifically to CWJobs searches.

For commercial use, focused searches are best. A broad query like `developer` can be noisy, while `python developer`, `azure architect`, `soc analyst`, `data engineer`, `devops engineer` or `product manager` produces cleaner lead lists and better market signals. Pair the results with contact enrichment when turning hiring signals into outreach.

CWJobs is especially useful because it is narrower than general UK job boards. A hiring signal from CWJobs usually means the employer or recruiter is looking for technical talent, which is directly relevant to software agencies, IT consultancies, cloud migration vendors, cybersecurity providers, developer tooling companies, bootcamps and technical recruiters. That commercial intent makes the dataset more valuable than a generic list of all jobs.

The actor is also designed to work well in repeatable monitoring workflows. You can create one task per keyword group, such as backend engineering, cloud infrastructure, data engineering or security operations, then schedule those tasks daily. Over time, the output can show which role families are accelerating, which recruiters dominate a niche, and which companies repeatedly post hard-to-fill technical positions.

### Tips

- Use `searchUrls` when you want to preserve filters from CWJobs.
- Use specific tech keywords for cleaner results.
- De-duplicate downstream by `job_id` or `url`.
- Schedule daily runs to track newly posted jobs over time.
- Combine with company/contact enrichment actors for sales workflows.

### FAQ

**Does this require a CWJobs account?** No. It reads public search-result cards.

**Does it use a browser or proxy?** No. It uses a plain HTTP parser.

**Can I scrape a filtered CWJobs URL?** Yes. Paste the full URL in `searchUrls`.

**Does it include salary?** It returns the salary label when CWJobs shows one.

**Can I export the data?** Yes. Apify supports JSON, CSV, Excel, API access and webhooks.

**Is this useful for lead generation?** Yes. Active tech job postings are strong buying signals for B2B services.

### You might also like

- [StepStone Scraper](https://apify.com/benthepythondev/stepstone-scraper) for European jobs.
- [Reed Jobs Scraper](https://apify.com/benthepythondev/reed-jobs-scraper) for UK jobs.
- [SEEK Jobs Scraper](https://apify.com/benthepythondev/seek-jobs-scraper) for Australia and New Zealand jobs.
- [JobsDB Jobs Scraper](https://apify.com/benthepythondev/jobsdb-jobs-scraper) for Asian jobs.
- [Talent.com Jobs Scraper](https://apify.com/benthepythondev/talent-jobs-scraper) for global jobs.

### Keywords

CWJobs scraper, CWJobs jobs scraper, CWJobs UK tech jobs, scrape CWJobs, UK technology jobs data, tech recruiting data, software developer jobs UK, DevOps jobs scraper, cybersecurity jobs scraper, hiring signals, recruitment lead generation, Apify jobs scraper, export CWJobs to CSV.

# Actor input Schema

## `searchUrls` (type: `array`):

Paste CWJobs search-results URLs. Filter on the site, then copy the URL. Leave empty to use keyword + location below.

## `keyword` (type: `string`):

Job title or tech keyword to search, e.g. 'python developer'.

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

Optional UK city or region, e.g. London, Manchester or remote.

## `domain` (type: `string`):

CWJobs domain used for keyword searches.

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

Maximum number of jobs to return.

## `useResidentialProxy` (type: `boolean`):

Use Apify RESIDENTIAL GB by default. Recommended because CWJobs can timeout on Apify datacenter IPs.

## `proxyCountry` (type: `string`):

Residential proxy country code. Use GB for CWJobs.

## Actor input object example

```json
{
  "searchUrls": [
    "https://www.cwjobs.co.uk/jobs/python"
  ],
  "keyword": "python",
  "domain": "www.cwjobs.co.uk",
  "maxResults": 10,
  "useResidentialProxy": true,
  "proxyCountry": "GB"
}
```

# 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 = {
    "searchUrls": [
        "https://www.cwjobs.co.uk/jobs/python"
    ],
    "keyword": "python",
    "domain": "www.cwjobs.co.uk",
    "maxResults": 10,
    "useResidentialProxy": true,
    "proxyCountry": "GB"
};

// Run the Actor and wait for it to finish
const run = await client.actor("benthepythondev/cwjobs-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 = {
    "searchUrls": ["https://www.cwjobs.co.uk/jobs/python"],
    "keyword": "python",
    "domain": "www.cwjobs.co.uk",
    "maxResults": 10,
    "useResidentialProxy": True,
    "proxyCountry": "GB",
}

# Run the Actor and wait for it to finish
run = client.actor("benthepythondev/cwjobs-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 '{
  "searchUrls": [
    "https://www.cwjobs.co.uk/jobs/python"
  ],
  "keyword": "python",
  "domain": "www.cwjobs.co.uk",
  "maxResults": 10,
  "useResidentialProxy": true,
  "proxyCountry": "GB"
}' |
apify call benthepythondev/cwjobs-scraper --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "CWJobs Scraper - UK Tech Jobs Data",
        "description": "Scrape CWJobs UK technology job listings: title, company, location, salary, posted date, remote flag, logo and URL.",
        "version": "1.0",
        "x-build-id": "2ta8SYHgXa1QcQuXo"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/benthepythondev~cwjobs-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-benthepythondev-cwjobs-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/benthepythondev~cwjobs-scraper/runs": {
            "post": {
                "operationId": "runs-sync-benthepythondev-cwjobs-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/benthepythondev~cwjobs-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-benthepythondev-cwjobs-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": {
                    "searchUrls": {
                        "title": "CWJobs search URLs",
                        "type": "array",
                        "description": "Paste CWJobs search-results URLs. Filter on the site, then copy the URL. Leave empty to use keyword + location below.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "keyword": {
                        "title": "Keyword / job title",
                        "type": "string",
                        "description": "Job title or tech keyword to search, e.g. 'python developer'.",
                        "default": "python"
                    },
                    "location": {
                        "title": "Location",
                        "type": "string",
                        "description": "Optional UK city or region, e.g. London, Manchester or remote."
                    },
                    "domain": {
                        "title": "CWJobs domain",
                        "type": "string",
                        "description": "CWJobs domain used for keyword searches.",
                        "default": "www.cwjobs.co.uk"
                    },
                    "maxResults": {
                        "title": "Max results",
                        "minimum": 1,
                        "maximum": 1000,
                        "type": "integer",
                        "description": "Maximum number of jobs to return.",
                        "default": 50
                    },
                    "useResidentialProxy": {
                        "title": "Use residential proxy",
                        "type": "boolean",
                        "description": "Use Apify RESIDENTIAL GB by default. Recommended because CWJobs can timeout on Apify datacenter IPs.",
                        "default": true
                    },
                    "proxyCountry": {
                        "title": "Proxy country",
                        "type": "string",
                        "description": "Residential proxy country code. Use GB for CWJobs.",
                        "default": "GB"
                    }
                }
            },
            "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
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
