# JobServe Scraper — UK IT & Contract Jobs, No Phones (`highbrow_fame/jobserve-jobs`) Actor

UK IT, engineering and contract jobs from JobServe: title, agency or employer, location, day rate or salary with min/max/period and IR35, job type, dates, and the full ad if you want. No phones.

- **URL**: https://apify.com/highbrow_fame/jobserve-jobs.md
- **Developed by:** [yestrue](https://apify.com/highbrow_fame) (community)
- **Categories:** Jobs
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$1.50 / 1,000 job delivereds

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

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

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
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.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

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

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## JobServe Scraper — UK IT & Contract Jobs, No Phones

Get job ads from JobServe (jobserve.com), the UK job board for IT, engineering and contract work: title, the recruitment agency or employer behind the ad, location, the day rate or salary as JobServe shows it plus its minimum, maximum, period and IR35 status, job type, industries, posted and start dates, contract length — and, if you want, the full ad, JobServe's job number and the closing date. Paste your JobServe search links — or just type a skill and a place.

**Why this one**

- 🔗 **Your search, as you set it up.** Run a search on jobserve.com and paste the link. Or type keywords and places here — "devops" in "Manchester", "SAP" in "EC2A" — and choose distance, job type, "posted within", remote working and agency or direct employer below.
- ⚡ **Fast, 200 jobs a request.** A live run read 1,562 jobs from three searches in 75 seconds; another read 2,019 jobs in 5 minutes — 2,000 of JobServe's 8,459 "engineer" jobs and all 19 contract devops jobs around Manchester, 49 of them with the full ad.
- 💷 **Day rates you can sort by.** Next to JobServe's rate line ("£420 PD Inside IR35", "Up to £65K + Bonus") every job has `salaryMin`, `salaryMax`, `salaryPeriod` (hour, day, week, month, year, shift), `salaryCurrency` and `ir35` (inside / outside). When the ad hides the numbers ("TBC", "Competitive") they stay empty.
- 🏢 **Agency or employer, at a glance.** `advertiserType` says whether a recruitment agency ("employment business" / "employment agency") or the employer itself posted the job. JobServe's own "posted by" filter changes nothing; here it works — in a live run 39 of 1,069 permanent engineer jobs around Birmingham came straight from the employer.
- 🔒 **No phone numbers, no recruiter names.** Agencies and employers are named by their company name only; the recruiter JobServe names on each job page is never read. Phone numbers and e-mail addresses in the ad text are replaced with `[phone removed]` / `[e-mail removed]`, and sentences that name a contact person ("call Sarah on …", "enquiries should be directed to Mr …") are taken out.
- 💸 **You pay only for jobs delivered.** A link that is not a JobServe search, or a place JobServe does not know, comes back as a free record with the reason.

### What you get

For every job:

| Field | What it is |
|---|---|
| `title`, `jobId`, `url`, `permalink` | the job ad, and JobServe's short link to it |
| `advertiser`, `advertiserType`, `isAgency`, `logo` | who posted it — `employment business`, `employment agency` (recruiters) or `employer` — by company name |
| `location` | where the job is, as JobServe shows it |
| `rate`, `salaryMin`, `salaryMax`, `salaryPeriod`, `salaryCurrency`, `ir35` | the rate or salary line, and its numbers |
| `jobType`, `industries` | Permanent, Contract, Contract/Permanent or Part Time/Temporary/Seasonal; JobServe's industries |
| `postedAt`, `startDate`, `duration` | when it was posted (UK time), when it starts, how long a contract runs |
| `reference` | the advertiser's own reference, when it is a code |
| `snippet` | the start of the ad (about 500 characters) |
| `input`, `place`, `position`, `scrapedAt`, `status`, `error` | which search it came from, and why a search gave nothing |

With **Full ad for the first 50 jobs** also: `description`, `employmentType`, `jobServeRef` (JobServe's job number), `expiresAt`, `city`, `region`, `country`, `workEligibility` — and `detailsError` for a job whose page was not opened or is gone.

#### Example

A real record from a live run with the full ad — contract "devops" jobs within 50 miles of Manchester, 26 September 2026:

```json
{
  "input": "devops in Manchester",
  "place": "Manchester",
  "position": 5,
  "jobId": "349E56ECA8587166A1",
  "url": "https://www.jobserve.com/gb/en/search-jobs-in-Manchester,-Lancashire,-United-Kingdom/TEST-ENGINEER-SFIA-LEVEL-4-349E56ECA8587166A1/",
  "permalink": "https://www.jobserve.com/g3THi",
  "title": "Test Engineer (SFIA Level 4)",
  "advertiser": "Layer7",
  "advertiserType": "employer",
  "isAgency": false,
  "location": "Manchester, UK",
  "rate": "£420 PD Inside IR35",
  "salaryMin": 420,
  "salaryMax": 420,
  "salaryPeriod": "day",
  "salaryCurrency": "GBP",
  "ir35": "inside",
  "jobType": "Contract",
  "industries": ["IT"],
  "postedAt": "2026-09-22T07:00:40",
  "startDate": null,
  "duration": null,
  "reference": "JSTESSIFA4",
  "snippet": "Rate: £420.00 per day Inside IR35 Location: Hybrid with occasional onsite attendance in Newcastle or Manchester Security Clearance: Active SC Clearance required…",
  "logo": null,
  "description": "Rate: £420.00 per day Inside IR35\nLocation: Hybrid with occasional onsite attendance in Newcastle or Manchester\nSecurity Clearance: Active SC Clearance required\nRole Overview\nWe are seeking an experienced Test Engineer (SFIA Level…",
  "employmentType": "CONTRACTOR",
  "jobServeRef": "486716980-1",
  "expiresAt": "2026-10-06T07:00+00:00",
  "city": "Manchester",
  "region": "Lancashire",
  "country": "United Kingdom",
  "workEligibility": "Applicants must be eligible to work in the specified location",
  "status": "OK",
  "scrapedAt": "2026-09-26T05:59:05.969Z"
}
```

### How to use it

1. Paste **Search links** from jobserve.com, one per line — or type **Keywords** and **Places** (every keyword is searched in every place) and choose the filters.
2. Set **Max jobs per search**, and tick **Full ad for the first 50 jobs** if you need whole descriptions.
3. Press **Start**, and download the results from the **Output** tab as JSON, CSV or Excel.

To follow new jobs, save your input as a task with **Posted within** set to 1 day and schedule it daily.

You can also call it from the Apify API, from Make, Zapier or n8n, or from an AI agent through the Apify MCP server.

### Pricing

You are charged **per job delivered** — see the price on this page. The full ads cost nothing extra. Links that are not JobServe searches and places JobServe does not know are free.

### FAQ

**How many jobs per search?** As many as JobServe finds. JobServe searches the jobs of the last 7 days; the run reads its list 200 jobs at a time, without repeats — a live run read 2,000 of 8,459 "engineer" jobs in 10 pages. Set **Max jobs per search** as high as you need.

**Why only 50 full ads a run?** JobServe limits how many pages one IP address may open in a short time. In live runs it began sending empty job pages after 215 and after 92 job pages had been opened within minutes, then empty list pages too; a run that carried on was blocked, and the IP got normal pages again 10 to 20 minutes later. So a run reads all its lists first, then opens at most 50 job pages, one every 3 seconds, and stops at the first empty page — the jobs still come, with every list field and the start of the ad in `snippet`. For more full ads, run again later.

**What if JobServe slows the run down?** The run waits on the same connection (1 minute, then 3) and, if JobServe still refuses, ends that search with a free `FAILED` record that says so; the jobs found before stay in the dataset. It never switches to other IP addresses to get around the limit.

**Are the filters obeyed?** JobServe applies them. In live runs 30 of 30 jobs of a contract search around Leeds and 19 of 19 around Manchester were contracts; a pasted contract search gave 30 contracts and 2 "Contract/Permanent" jobs, which JobServe counts as contracts too. "Posted by" is applied by the run itself, for search links too.

**What about towns with the same name?** JobServe knows eight Newports. "Newport" alone comes back as a free record listing them ("Newport, Gwent", "Newport, Isle of Wight", …); write the one you mean with its county after a comma. A place JobServe does not know ("Nowhereville") gives a free `NOT_FOUND` record.

**Why does the same job show up in two of my searches?** Each search gets the jobs JobServe shows for it, without repeats. Searches overlap: 15 jobs came in both "devops" around Manchester and "engineer" in a live run. Use `jobId` to drop them if you combine searches.

**Why no phone numbers or recruiter names?** They are personal data. Every job has its `url`, and applicants apply on JobServe. The contact person JobServe shows on each job page is never read; in the ad text phone numbers, e-mail addresses and sentences that name a contact are taken out by rules. Rules can miss an unusual wording; a scan of 2,019 jobs from a live run (49 with the full ad) found no phone number, e-mail address or contact name.

**Is this affiliated with JobServe?** No. This is an independent tool that reads public job ads on jobserve.com.

**Like it?** A short review on the Store page helps other people find this Actor. Something missing or broken? Tell us on the Issues tab — we read every one.

# Actor input Schema

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

Run a search on jobserve.com with the filters you want and paste the address of the results page (…/JobSearch.aspx?shid=…). One per line. JobListing.aspx?q=…\&lq=… links and JobServe's "…-jobs-in-…" pages work too.

## `keywords` (type: `array`):

Or search here without a link: skills or job titles (java developer, SAP, "project manager"). JobServe's own search syntax works (and, or, not, quotes). Each keyword is searched in each place below, or in the whole UK when there is no place. The filters below apply.

## `locations` (type: `array`):

UK towns, counties, regions or postcodes (Manchester, Kent, Scotland, EC2A), one per line. When several towns share a name, add the county after a comma: "Newport, Gwent". A place without keywords gives all its jobs.

## `maxListingsPerSearch` (type: `integer`):

Stops each search after this many jobs.

## `radius` (type: `string`):

For towns and postcodes: how far around them, as on JobServe.

## `postedWithinDays` (type: `string`):

JobServe searches the jobs of the last 7 days at most.

## `jobType` (type: `string`):

Optional. JobServe counts "contract or permanent" jobs as contracts too.

## `remoteOnly` (type: `boolean`):

Optional: only jobs JobServe marks as remote working.

## `postedBy` (type: `string`):

Optional: recruitment agencies (JobServe's "employment business" and "employment agency") or direct employers. Applied to search links too.

## `includeDetails` (type: `boolean`):

Off by default. Adds the full job description, JobServe's job number, the closing date, region and country for the first 50 jobs of the run (JobServe limits how many job pages one IP address may open — see the README); the other jobs come with their list fields. Sentences that name a recruiter are taken out of the ad by rules.

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

How many searches to work on at the same time. All of them share one polite pace towards JobServe.

## `proxyConfiguration` (type: `object`):

Used only when a request fails on the network: the first try goes out directly.

## Actor input object example

```json
{
  "searchUrls": [
    "https://www.jobserve.com/gb/en/JobListing.aspx?q=python&lq=London"
  ],
  "maxListingsPerSearch": 30,
  "radius": "50",
  "postedWithinDays": "7",
  "jobType": "any",
  "remoteOnly": false,
  "postedBy": "any",
  "includeDetails": false,
  "maxConcurrency": 2,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

## `results` (type: `string`):

Every result as a JSON record, with a status for each input.

## `resultsCsv` (type: `string`):

The same records as CSV, for a spreadsheet.

# 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.jobserve.com/gb/en/JobListing.aspx?q=python&lq=London"
    ],
    "maxListingsPerSearch": 30,
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("highbrow_fame/jobserve-jobs").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.jobserve.com/gb/en/JobListing.aspx?q=python&lq=London"],
    "maxListingsPerSearch": 30,
    "proxyConfiguration": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("highbrow_fame/jobserve-jobs").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "searchUrls": [
    "https://www.jobserve.com/gb/en/JobListing.aspx?q=python&lq=London"
  ],
  "maxListingsPerSearch": 30,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}' |
apify call highbrow_fame/jobserve-jobs --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,highbrow_fame/jobserve-jobs"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/BqxizgztR3EHIhRuT/builds/hMswQX7mLtbwXJZRX/openapi.json
