# Cv Library Jobs Search Scraper (`alexist/cv-library-jobs-search-scraper`) Actor

Scrape job search results from CV-Library.co.uk with precision. This scraper captures titles, descriptions, locations, application methods, and scoring data across unlimited search pages — perfect for job market researchers, HR teams, and recruitment analysts.

- **URL**: https://apify.com/alexist/cv-library-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.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

## CV-Library Jobs Search Scraper: Extract UK Job Results Instantly
---

### What Is CV-Library?

CV-Library is one of the UK's largest job search platforms, hosting hundreds of thousands of live vacancies across all industries and seniority levels. Whether you're searching for account manager roles, cleaning positions, or specialized technical jobs, CV-Library aggregates listings from employers and recruitment agencies nationwide. Manually clicking through search results and collecting job details is tedious and error-prone — the **CV-Library Jobs Search Scraper** automates the entire process, turning search result pages into structured, actionable data.

---

### Overview

The **CV-Library Jobs Search Scraper** extracts job listings from CV-Library search results pages, preserving critical metadata including relevance scores, application methods, and employer details. It is ideal for:

- **Recruitment agencies** monitoring market supply and competitor postings
- **HR professionals** benchmarking salary bands and role availability
- **Job market researchers** analyzing employment trends in the UK
- **Aggregator platforms** feeding data into multi-job-board portals
- **Career advisors** tracking industry hiring patterns

The scraper handles multiple search pages seamlessly, supports dynamic URL queries with filters (location, job type, keyword), and gracefully manages failed URLs without interrupting your run.

---

### Input Format

The scraper accepts a JSON configuration object:

```json
{
  "urls": [
    "https://www.cv-library.co.uk/account-manager-cleaning-jobs?page_number=2&search_id=search.01KXFX418VYKC3XXDYJB7KMNZT"
  ],
  "ignore_url_failures": true,
  "max_items_per_url": 20
}
````

| Field | Description | Example |
|---|---|---|
| `urls` | Search result page URLs from CV-Library (supports pagination and filters) | `https://www.cv-library.co.uk/[keyword]-jobs?page_number=1` |
| `max_items_per_url` | Maximum listings extracted per page (default: 20) | `20`, `50`, `100` |
| `ignore_url_failures` | If `true`, continues scraping if some URLs fail; if `false`, stops on error | `true` or `false` |

**Tips:**

- Include `page_number=X` in URLs to scrape multiple pages (e.g., pages 1–5).
- Filter URLs by location, contract type, or salary using CV-Library's search parameters.
- The scraper preserves search metadata (`search_id`), allowing reproducible data collection.

***

### Output Format

**Sample output**

```json
{
  "id": "225340250",
  "score": 91.7523,
  "matched_queries": [
    "must:desc",
    "must:title_employer",
    "search_mode:standard",
    "ranking:source=bm25",
    "ranking:result_rank=1",
    "ranking:sort=relevance",
    "facet_search:requested",
    "facet_search:executed"
  ],
  "account": {
    "id": "301073",
    "name": "Saint Gobain",
    "type": "Corporate"
  },
  "application_flow": "external-redirect",
  "applications": 20,
  "apply_type": "external",
  "catchment_area": "point",
  "category": [
    "Sales",
    "Sales Manager",
    "Sales Account Manager",
    "Sales Account Director",
    "Work From Home",
    "Hybrid"
  ],
  "category_paths": [
    "sales/sales_manager/sales_account_manager/sales_account_director",
    "sales",
    "sales/sales_manager",
    "work_from_home",
    "sales/sales_manager/sales_account_manager",
    "work_from_home/hybrid"
  ],
  "class_name": "standard",
  "contract": [
    "Permanent"
  ],
  "description": "Hambaker Pipelines is seeking a dynamic Internal <mark>Account</mark> <mark>Manager</mark> to join our growing sales team. In this role, you'll play a key part in supporting and expanding our customer base, working closely with merchants and contractors across the UK.",
  "external_id": "GBR13896_1783436706",
  "external_apply_url": "https://www.aplitrak.com/?adid=Sm9zaC5TbWl0aC42NTQ1Ni4wMjFAc2FpbnRnb2JhaW4uYXBsaXRyYWsuY29t",
  "flags": [
    "ijm_eligible",
    "featured",
    "remote_working"
  ],
  "location": {
    "id": "location.EwcYDZkXPoK05TsjHjcXamqZsbF",
    "name": "Guide Bridge",
    "display_name": "Dukinfield, Greater Manchester",
    "city": "Tameside",
    "state": "England",
    "county": "Greater Manchester",
    "centroid": {
      "lat": 53.46858,
      "lon": -2.10118
    }
  },
  "logo": "/logo/big/eb810b1a587d465698588f0837d86ddd",
  "partner": {
    "id": "5"
  },
  "posted": "2026-07-07T15:05:07Z",
  "title": "Internal <mark>Account</mark> <mark>Manager</mark>",
  "from_url": "https://www.cv-library.co.uk/account-manager-cleaning-jobs?page_number=2&search_id=search.01KXFX418VYKC3XXDYJB7KMNZT"
}
```

Each job listing returns a rich record with 20 fields capturing both job content and search relevance:

#### Identification & Relevance

| Field | Meaning |
|---|---|
| `ID` | Unique CV-Library job identifier |
| `External ID` | Job ID from the original employer or recruiter |
| `Score` | Relevance score based on search query match (higher = more relevant) |
| `Matched Queries` | Keywords from your search that matched this listing |
| `Title` | Job title as displayed on CV-Library |

#### Job Details & Content

| Field | Meaning |
|---|---|
| `Description` | Full job description text (HTML or plain text) |
| `Category` | Job category (e.g., "Cleaning," "Hospitality," "IT") |
| `Category Paths` | Full category hierarchy (e.g., "Admin > Office Management") |
| `Contract` | Employment type (e.g., "Permanent," "Temporary," "Contract," "Internship") |
| `Location` | Job location(s) within the UK |
| `Catchment Area` | Geographic area or radius where the role applies |
| `Posted` | Date when the listing was published on CV-Library |

#### Application & Employer

| Field | Meaning |
|---|---|
| `Account` | Employer or recruiter account name |
| `Partner` | Partner agency or job board that syndicated the listing |
| `Logo` | Employer logo URL |
| `Applications` | Number of applications received (if visible) |
| `Apply Type` | Application method (e.g., "Direct," "Agency," "External") |
| `Application Flow` | Workflow description (quick apply, CV upload, redirect) |
| `External Apply URL` | URL to external application portal (if applicable) |
| `Flags` | Special attributes (e.g., "Premium," "Featured," "Urgent Hire") |
| `Class Name` | Internal classification for styling or filtering |

***

### How to Use

1. **Search on CV-Library** — Visit CV-Library.co.uk and enter your search criteria (keyword, location, salary range, contract type).
2. **Copy the URL** — Once results load, copy the full URL from your browser, including `page_number` and `search_id` parameters.
3. **Add multiple pages** — To scrape paginated results, paste URLs for each page (e.g., `page_number=1`, `page_number=2`, etc.).
4. **Configure limits** — Set `max_items_per_url` to control data volume. Default is 20 per page.
5. **Enable fault tolerance** — Set `ignore_url_failures: true` for multi-page runs to avoid interruptions.
6. **Run and export** — Start the scraper, monitor progress, and download results as JSON, CSV, or Excel.

**Troubleshooting:**

- If results are empty, verify the URL is a search results page, not a single job detail page.
- Ensure `search_id` is included to preserve reproducibility across runs.
- Check that filters (location, salary, contract type) are properly encoded in the URL.

***

### Use Cases & Business Value

- **Market intelligence:** Track job volume, salary trends, and hiring activity by sector or region
- **Competitive analysis:** Monitor how rivals position roles, required qualifications, and benefits
- **Aggregation:** Combine CV-Library data with Indeed, LinkedIn, and Glassdoor scrapes for comprehensive job boards
- **Academic research:** Analyze UK employment demand by skill, region, and contract type
- **Talent planning:** Forecast hiring demand to build recruitment pipelines

The CV-Library Jobs Search Scraper eliminates manual copy-paste work, delivering consistency and scale for data-driven recruitment and labor market research.

***

### Conclusion

The **CV-Library Jobs Search Scraper** is the fastest way to extract structured job data from one of the UK's most-visited employment platforms. With intelligent relevance scoring, flexible URL input, and comprehensive job metadata, it transforms search results into datasets ready for analysis, integration, or business intelligence. Start scraping today and unlock insights into the UK job market.

# 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.cv-library.co.uk/account-manager-cleaning-jobs?page_number=2&search_id=search.01KXFX418VYKC3XXDYJB7KMNZT"
  ],
  "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.cv-library.co.uk/account-manager-cleaning-jobs?page_number=2&search_id=search.01KXFX418VYKC3XXDYJB7KMNZT"
    ],
    "ignore_url_failures": true,
    "max_items_per_url": 20
};

// Run the Actor and wait for it to finish
const run = await client.actor("alexist/cv-library-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.cv-library.co.uk/account-manager-cleaning-jobs?page_number=2&search_id=search.01KXFX418VYKC3XXDYJB7KMNZT"],
    "ignore_url_failures": True,
    "max_items_per_url": 20,
}

# Run the Actor and wait for it to finish
run = client.actor("alexist/cv-library-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.cv-library.co.uk/account-manager-cleaning-jobs?page_number=2&search_id=search.01KXFX418VYKC3XXDYJB7KMNZT"
  ],
  "ignore_url_failures": true,
  "max_items_per_url": 20
}' |
apify call alexist/cv-library-jobs-search-scraper --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Cv Library Jobs Search Scraper",
        "description": "Scrape job search results from CV-Library.co.uk with precision. This scraper captures titles, descriptions, locations, application methods, and scoring data across unlimited search pages — perfect for job market researchers, HR teams, and recruitment analysts.",
        "version": "0.0",
        "x-build-id": "WUlBgekcs1ZeqJvRM"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/alexist~cv-library-jobs-search-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-alexist-cv-library-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~cv-library-jobs-search-scraper/runs": {
            "post": {
                "operationId": "runs-sync-alexist-cv-library-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~cv-library-jobs-search-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-alexist-cv-library-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
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
