# Cwjobs Jobs Search Scraper (`alexist/cwjobs-jobs-search-scraper`) Actor

Scrape job search results from CWJobs.co.uk with structured data including titles, salaries, company details, locations, and 30+ fields per listing — perfect for job market analysis, recruiter research, and tech talent intelligence platforms.

- **URL**: https://apify.com/alexist/cwjobs-jobs-search-scraper.md
- **Developed by:** [Alex](https://apify.com/alexist) (community)
- **Categories:** Automation, Developer tools, Jobs
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

Pay per usage

This Actor is paid per platform usage. The Actor is free to use, and you only pay for the Apify platform usage, which gets cheaper the higher subscription plan you have.

Learn more: https://docs.apify.com/platform/actors/running/actors-in-store#pay-per-usage

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

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

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python/docs.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/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 Search Scraper: Extract UK Tech Job Listings Instantly
---

### What Is CWJobs?

CWJobs.co.uk is the UK's leading specialized job board for computing, technology, and engineering roles. It hosts thousands of active listings from startups to FTSE 100 companies, making it essential for tech professionals and recruiters monitoring the UK market. Manually browsing search results to collect this data is tedious and error-prone — the **CWJobs Search Scraper** automates the process, delivering clean, structured records from job search pages instantly.

---

### Overview

The **CWJobs Search Scraper** extracts job listings from CWJobs search result pages, converting unstructured HTML into machine-readable records. It is designed for:

- **Recruiters** tracking tech talent availability and salary trends
- **Market researchers** analyzing UK computing job demand
- **Career platforms** aggregating UK tech job data
- **Data analysts** building datasets for compensation benchmarking

Key strengths include flexible URL handling, graceful error management, configurable pagination limits, and rich output spanning 30+ fields covering job details, company info, posting dates, and market indicators.

---

### Input Format

The scraper accepts a JSON configuration object with the following structure:

```json
{
  "urls": [
    "https://www.cwjobs.co.uk/jobs/in-london"
  ],
  "ignore_url_failures": true,
  "max_items_per_url": 20
}
````

| Field | Description | Example |
|---|---|---|
| `urls` | Array of CWJobs search result page URLs to scrape | `["https://www.cwjobs.co.uk/jobs/in-london"]` |
| `ignore_url_failures` | If `true`, skips failed URLs instead of halting the run | `true` |
| `max_items_per_url` | Maximum job listings extracted per search page | `20` |

> **Tip:** CWJobs search URLs can be filtered by location (e.g., `in-london`, `in-manchester`), job type, and keywords. Combine multiple URLs to build comprehensive datasets across regions.

***

### Output Format

**Sample output**

```json
{
  "id": 107660338,
  "title": "Innovation Ecosystem & Insights Specialist",
  "labels": [],
  "url": "https://www.totaljobs.com/job/insights-specialist/bp-energy-job107660338?src=search&page=1&position=1&WT.mc_id=A_PT_CrossBrand_CWJobs",
  "company_id": 1428985,
  "company_name": "BP Energy",
  "company_url": "https://www.cwjobs.co.uk/jobs/bp-energy?cmpId=1428985&cmp=1",
  "company_logo_url": "https://tjgliveassets.s3.eu-west-1.amazonaws.com/company-logos/2e66e5e85ad5408380e06078af3eb663.png",
  "date_posted": "2026-07-09T00:22:43.73Z",
  "location": "St James, South West London (SW1), WC2N 5DU",
  "is_anonymous": false,
  "salary": "Competitive",
  "post_code": "WC2N 5DU",
  "partnership": {
    "is_partnership_job": false,
    "show_partnership_label": false,
    "is_backfilled": true,
    "source_site_friendly_name": "Totaljobs.com",
    "is_cross_posted": false
  },
  "unified_salary": null,
  "work_from_home": "",
  "meta_data": {
    "position_on_page": 1,
    "position_absolute": 1
  },
  "harmonised_id": "3e57239d-ccf2-421f-adf2-7f18d8ffd8aa",
  "job_posting_sequence": 1,
  "period_posted_date": "2026-07-09T00:22:43.73Z",
  "publish_from_date": "2026-07-09T00:22:43.73Z",
  "publish_to_date": "2026-08-20T00:22:43.73Z",
  "has_future_posting": false,
  "fingerprint_count": 1,
  "section": "main",
  "top_labels": [],
  "skills": [],
  "text_snippet": "We're excited to welcome an <strong>Innovation</strong> Ecosystem & <strong>Insights Specialist</strong> to our Supply Trading & Shipping (ST&S) team as we continue to connect and transform global energy markets. The <strong>Innovation</strong> Ecosystem & <strong>Insights Specialist</strong> will join Vista, our business-led team focused on exploring emerging technologies, business models and partnerships that are relevant to ST&S. * Familiarity with <strong>innovation,</strong> data and <strong>insight</strong> tools, including external intelligence platforms. This role offers variety and depth for someone who enjoys translating market signals into actionable <strong>insights</strong> and identifying emerging technologies, trends and partnership opportunities that matter to the business. Working closely with stakeholders across front, mid and back offices, as well as internal and external technology partners, Vista focuses on making <strong>innovation</strong> practical and relevant to the business.",
  "cv_to_job_score": null,
  "is_highlighted": false,
  "is_sponsored": false,
  "travel_time": null,
  "unified_travel_time": null,
  "is_top_job": false,
  "is_traffic_from_partner": false,
  "from_url": "https://www.cwjobs.co.uk/jobs/in-london"
}
```

Each extracted job listing returns a detailed record with 30+ fields:

#### Identification & Indexing

| Field | Meaning | Example |
|---|---|---|
| `id` | Unique internal CWJobs job identifier | `12345678` |
| `harmonised_id` | Standardized job ID across aggregator networks | `uk-cwjobs-12345678` |
| `title` | Job title as displayed on CWJobs | `Senior Python Developer` |
| `url` | Direct link to the full job posting | `https://www.cwjobs.co.uk/jobs/...` |
| `labels` | Categorization tags (e.g., seniority, type) | `["Full-time", "Permanent", "London"]` |
| `top_labels` | Most prominent tags highlighted in search results | `["Full-time", "London"]` |
| `section` | Job category or section on CWJobs | `IT & Software Development` |

#### Company Information

| Field | Meaning | Example |
|---|---|---|
| `company_name` | Employer name | `TechCorp UK Ltd` |
| `company_id` | Unique company identifier in CWJobs database | `5001` |
| `company_url` | Company website or profile link | `https://www.techcorp.co.uk` |
| `company_logo_url` | Company logo image URL | `https://cdn.cwjobs.co.uk/logos/...` |
| `is_anonymous` | Whether company identity is hidden | `false` |

#### Job Details & Compensation

| Field | Meaning | Example |
|---|---|---|
| `salary` | Salary range displayed in job listing | `£50,000 - £70,000` |
| `unified_salary` | Standardized salary in a consistent format | `50000-70000` |
| `location` | Job location as listed | `London, UK` |
| `post_code` | UK postcode for the role's location | `SW1A 1AA` |
| `work_from_home` | Remote work policy indicator | `hybrid` or `remote` |
| `travel_time` | Estimated commute time from reference point | `30 mins` |
| `unified_travel_time` | Standardized commute duration | `30` |
| `text_snippet` | Brief excerpt of the job description | `"We're seeking a talented engineer to join..."` |

#### Skills & Matching

| Field | Meaning | Example |
|---|---|---|
| `skills` | Extracted technical and soft skills required | `["Python", "AWS", "Docker", "Communication"]` |
| `cv_to_job_score` | Match score between typical CV and job requirements (0-100) | `85` |

#### Posting & Lifecycle

| Field | Meaning | Example |
|---|---|---|
| `date_posted` | When the job was posted on CWJobs | `2024-01-15` |
| `period_posted_date` | Time window when listing was active | `last 7 days` |
| `publish_from_date` | Scheduled publication start date | `2024-01-10` |
| `publish_to_date` | Scheduled publication end date | `2024-02-10` |
| `has_future_posting` | Whether the listing is scheduled for future publication | `false` |
| `job_posting_sequence` | Sequence number for re-postings | `1` |

#### Visibility & Promotion

| Field | Meaning | Example |
|---|---|---|
| `is_highlighted` | Whether the listing has special highlighting | `true` |
| `is_sponsored` | Whether the job has paid placement boost | `true` |
| `is_top_job` | Whether ranked as a top/featured listing | `true` |
| `is_traffic_from_partner` | Whether traffic is sourced from partner sites | `false` |
| `partnership` | Partner program or affiliation status | `premium_partner` |

#### Analytics & Meta

| Field | Meaning | Example |
|---|---|---|
| `meta_data` | Additional metadata objects (JSON) | `{"min_years_exp": 5, "contract_type": "permanent"}` |
| `fingerprint_count` | Number of unique applications/views | `127` |

***

### How to Use

1. **Build search URLs** — Visit CWJobs.co.uk and navigate to the jobs you want to scrape (filter by location, role type, keywords). Copy the URL.
2. **Configure input** — Paste URLs into the `urls` array. Adjust `max_items_per_url` for desired volume (default: 20).
3. **Enable resilience** — Set `ignore_url_failures: true` to handle temporary network issues without stopping the run.
4. **Execute the scraper** — Start the actor and monitor progress in the log.
5. **Export data** — Download results as JSON, CSV, or Excel for analysis, database import, or BI integration.

**Troubleshooting:**

- If results are empty, verify the URL is a *search results page*, not a static page.
- For rate limiting, increase `max_items_per_url` or split URLs across multiple runs.
- Check that `ignore_url_failures` is enabled for robust bulk operations.

***

### Use Cases & Business Value

- **Salary benchmarking:** Analyze compensation trends across UK tech roles and regions
- **Talent sourcing:** Feed job listings into ATS systems or candidate databases
- **Competitor intelligence:** Track how rivals position roles and hiring needs
- **Market research:** Study demand for specific skills and technologies in the UK job market
- **Job aggregator platforms:** Build comprehensive UK tech job boards without manual curation

The CWJobs Search Scraper eliminates hours of copy-paste work, delivering consistent data that powers business intelligence, recruitment automation, and market analysis.

***

### Conclusion

The **CWJobs Search Scraper** is an essential tool for recruiters, data analysts, and tech professionals who need structured data from the UK's leading tech job board. With 30+ fields per listing and flexible configuration, it transforms raw search results into actionable insights. Start scraping today and unlock the full value of CWJobs data.

# Actor input Schema

## `urls` (type: `array`):

Add the URLs of the Jobs list urls you want to scrape. You can paste URLs one by one, or use the Bulk edit section to add a prepared list.

## `ignore_url_failures` (type: `boolean`):

If true, the scraper will continue running even if some URLs fail to be scraped.

## `max_items_per_url` (type: `integer`):

The maximum number of items to scrape per URL.

## Actor input object example

```json
{
  "urls": [
    "https://www.cwjobs.co.uk/jobs/in-london"
  ],
  "ignore_url_failures": true,
  "max_items_per_url": 20
}
```

# 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 = {
    "urls": [
        "https://www.cwjobs.co.uk/jobs/in-london"
    ],
    "ignore_url_failures": true,
    "max_items_per_url": 20
};

// Run the Actor and wait for it to finish
const run = await client.actor("alexist/cwjobs-jobs-search-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 = {
    "urls": ["https://www.cwjobs.co.uk/jobs/in-london"],
    "ignore_url_failures": True,
    "max_items_per_url": 20,
}

# Run the Actor and wait for it to finish
run = client.actor("alexist/cwjobs-jobs-search-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 '{
  "urls": [
    "https://www.cwjobs.co.uk/jobs/in-london"
  ],
  "ignore_url_failures": true,
  "max_items_per_url": 20
}' |
apify call alexist/cwjobs-jobs-search-scraper --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Cwjobs Jobs Search Scraper",
        "description": "Scrape job search results from CWJobs.co.uk with structured data including titles, salaries, company details, locations, and 30+ fields per listing — perfect for job market analysis, recruiter research, and tech talent intelligence platforms.",
        "version": "0.0",
        "x-build-id": "BlHZzTtpfqRaoqGTk"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/alexist~cwjobs-jobs-search-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-alexist-cwjobs-jobs-search-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/alexist~cwjobs-jobs-search-scraper/runs": {
            "post": {
                "operationId": "runs-sync-alexist-cwjobs-jobs-search-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/alexist~cwjobs-jobs-search-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-alexist-cwjobs-jobs-search-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": {
                    "urls": {
                        "title": "URLs of the Jobs list urls to scrape",
                        "type": "array",
                        "description": "Add the URLs of the Jobs list urls you want to scrape. You can paste URLs one by one, or use the Bulk edit section to add a prepared list.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "ignore_url_failures": {
                        "title": "Continue running even if some URLs fail to be scraped",
                        "type": "boolean",
                        "description": "If true, the scraper will continue running even if some URLs fail to be scraped."
                    },
                    "max_items_per_url": {
                        "title": "Max items per URL",
                        "type": "integer",
                        "description": "The maximum number of items to scrape per URL."
                    }
                }
            },
            "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
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
