# S1jobs.com Scraper (`solidcode/s1jobs-com-scraper`) Actor

\[💰 $2.5 / 1K] Extract every job on s1jobs.com, Scotland's largest job board. Search by keyword, town, sector, contract and salary, or paste ready-made links. Get title, salary, location, coordinates, employer, skills, full description and recruiter apply emails.

- **URL**: https://apify.com/solidcode/s1jobs-com-scraper.md
- **Developed by:** [SolidCode](https://apify.com/solidcode) (community)
- **Categories:** Jobs, Agents, Automation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.50 / 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.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

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

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.
Actors are written with capital "A".

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

## S1jobs.com Scraper

Extract every live vacancy from s1jobs.com, Scotland's largest job board — job title, full advert text, salary band, contract type, employer, skills, map coordinates, and the advert's own apply route — a recruiter email or the employer's application link. Search by keyword, town, sector, employer or salary from plain form fields, or paste s1jobs.com links and let the run do the rest. Built for Scottish recruitment agencies, UK labour-market analysts, job-aggregator and ATS teams, and lead-generation teams targeting actively hiring employers who need a clean, structured feed of Scottish vacancies without hand-crafting search URLs or paying an enrichment vendor to guess contact details.

### Why This Scraper?

- **Latitude and longitude on every job collected from a search, plus a UK postcode on every enriched one** — 600 out of 600 on both counts in a live test run. Plot Scottish vacancies on a map, run travel-time or radius analysis, roll up by postcode district, and join to census geographies immediately. No separate geocoding pass, no per-address geocoding bill.
- **A working apply route on 599 of 600 jobs in a live test run** — either `applyEmail`, the address the advertiser actually put on the listing (427 of 600), or `applyUrl`, the employer's own application page on their careers site or ATS (172 of 600). Neither is a pattern guessed by a third-party enrichment service.
- **All 40 s1jobs sectors, each verified live** — Accountancy, Agriculture / Fishing / Forestry, Energy / Renewables, Tech / Digital / IT, Social Care / Social Services / Housing and 35 more. 74 filter values were tested against real result counts in total, with zero dead options.
- **Up to 60 fields per job, including the complete advert text** — the whole job description, not a truncated preview: salary band, specialisms, skill tags, employer accreditations, the employer's own profile blurb, and the employer's internal job reference on roughly five adverts in six.
- **Six role highlights the board itself flags** — apprenticeships, graduate-suitable roles, immediate start, public-sector roles, accredited employers, and listings that include a video.
- **Five sort orders and eleven search radii** — order by newest, best match, highest salary, lowest salary, or closest first; search a single town exactly, or fan out in steps from 5 up to 50 miles around it.
- **Verified duplicate-free output** — s1jobs republishes roughly 109 promoted listings on every page of results, and its own result pages overlap between pages. Duplicates are removed run-wide, so you never pay twice for the same vacancy. A 155-row test run returned 155 unique job IDs.
- **Whole-board coverage of ~3,100+ live Scottish vacancies** — leave every field blank for a full sweep, or narrow by employer name, annual salary band, permanent/contract/temporary, full or part time, direct employer vs recruitment agency, and four working arrangements including home working.
- **No URL-crafting needed, but pasted links still work** — mix s1jobs search pages and individual job pages in one list; pasted job links are always processed first so a broad search can never crowd them out of your result limit.

### Use Cases

**Recruitment & Staffing**

- Track competitor agency postings across Glasgow, Edinburgh and Aberdeen day by day
- Build candidate-matching pipelines from full job descriptions and skill tags
- Spot which employers are hiring directly and which are going through agencies
- Monitor apprenticeship and graduate openings for early-careers placement desks

**Labour-Market Research**

- Measure hiring volume across all 40 sectors in Scotland over time
- Map vacancy density by council area, town, and coordinates
- Compare public-sector vs private-sector hiring using the public-sector flag
- Quantify the real spread of hybrid, remote, home-working and on-site roles

**Salary Benchmarking**

- Build sector-by-sector pay bands from advertised annual minimums and maximums
- Compare permanent vs contract vs temporary compensation for the same role titles
- Track how advertised pay for a given job title moves month over month
- Identify which sectors publish salary openly and which withhold it

**Lead Generation**

- Reach hiring managers using the apply email or application link published on the advert
- Build prospect lists of employers hiring in a target sector and radius
- Prioritise accredited employers and public-sector bodies as higher-value accounts
- Enrich CRM records with employer profile URLs, logos and descriptions

**Job Aggregators & ATS Platforms**

- Populate a Scotland-focused job board with structured, ready-to-index listings
- Feed vacancy data into an applicant tracking system with stable job IDs
- Run scheduled newest-first pulls to keep an aggregator index fresh
- Deduplicate reliably using the job ID that stays constant across pages

### Getting Started

#### Simple: nursing jobs in Glasgow

```json
{
  "searchKeyword": "nurse",
  "location": "Glasgow",
  "maxResults": 100
}
```

#### Filtered: well-paid permanent tech and engineering roles near Edinburgh

```json
{
  "location": "Edinburgh",
  "distanceMiles": "20",
  "sectors": ["Tech / Digital / IT", "Engineering / Technical"],
  "contractTypes": ["Permanent"],
  "jobTypes": ["Full"],
  "minSalary": 35000,
  "sortBy": "newest",
  "maxResults": 500
}
```

#### Advanced: hybrid public-sector energy roles around Aberdeen, highest paid first

```json
{
  "searchKeyword": "project manager",
  "location": "Aberdeen",
  "distanceMiles": "30",
  "sectors": ["Energy / Renewables"],
  "workingLocations": ["Hybrid working", "Home working"],
  "advertiserType": "Employer",
  "roleFlags": ["is_public_sector"],
  "minSalary": 40000,
  "maxSalary": 80000,
  "sortBy": "salary",
  "includeJobDetails": true,
  "maxResults": 1000
}
```

#### Paste your own links: a browse page plus one specific vacancy

```json
{
  "startUrls": [
    "https://www.s1jobs.com/jobs/glasgow/",
    "https://www.s1jobs.com/job/field-officer-127131934"
  ],
  "maxResults": 0
}
```

### Input Reference

#### What to Scrape

| Parameter | Type | Default | Description |
|-----------|------|---------|-------------|
| `searchKeyword` | string | `""` | Word or phrase matched against job titles, employer names and descriptions, e.g. `"HGV driver"`. Blank collects everything matching your filters. |
| `location` | string | `""` | Scottish town or city, e.g. `"Glasgow"`, `"Inverness"`. Blank searches all of Scotland. |
| `distanceMiles` | string | `""` | Search radius around the town: `"0"` (that town only) or `"5"` through `"50"` in 5-mile steps. Only applies when a town is set. |
| `startUrls` | array | `[]` | Paste s1jobs.com links — search/browse pages, individual job pages, or both mixed together. When set, the keyword, place and filters are ignored because each link carries its own. Search links return the full field set; single job pages carry a slightly smaller one, because s1jobs publishes `expiryDate`, `county`, `workingLocation`, `durationMessage` and the video flags only on its search pages. |

#### Filters

| Parameter | Type | Default | Description |
|-----------|------|---------|-------------|
| `sectors` | array | `[]` | Restrict to any of 40 sectors, e.g. `"Healthcare / Pharmaceuticals"`. Picking several returns jobs from any of them. |
| `jobTypes` | array | `[]` | `"Full"` or `"Part"`. Empty includes both. |
| `contractTypes` | array | `[]` | `"Permanent"`, `"Temporary"`, `"Contract"`. Empty includes all. |
| `workingLocations` | array | `[]` | `"Onsite working"`, `"Hybrid working"`, `"Remote working"`, `"Home working"`. Jobs that state no arrangement are excluded when you pick a value. |
| `advertiserType` | string | `""` | `"Employer"` for direct employers only, `"Agency"` for recruitment agencies only. |
| `companyName` | string | `""` | Restrict to one employer, spelled exactly as it appears on s1jobs. |
| `minSalary` | integer | none | Minimum advertised annual salary in GBP, e.g. `30000`. Jobs without a published salary are excluded. |
| `maxSalary` | integer | none | Maximum advertised annual salary in GBP, e.g. `50000`. Jobs without a published salary are excluded. |
| `roleFlags` | array | `[]` | Any of `apprenticeship`, `graduate`, `immediate_start`, `is_public_sector`, `has_accreditation`, `has_video`. Picking several means a job must match **all** of them. |

#### Results

| Parameter | Type | Default | Description |
|-----------|------|---------|-------------|
| `sortBy` | string | `"newest"` | `"newest"`, `"best"`, `"salary"` (highest first), `"_salary"` (lowest first), or `"closest"` (needs a town). |
| `includeJobDetails` | boolean | `true` | Opens each vacancy's own page to add the UK postcode, the apply route (`applyEmail` or `applyUrl`), the employer's job reference, the employer description and accreditations. Costs no extra per job. If s1jobs is unusually slow, a job that has not answered within two and a half minutes simply keeps its standard information — the job itself is never dropped. |
| `maxResults` | integer | `100` | Total jobs to collect. Set to `0` to collect everything that matches (capped at 20,000 per run as a safety limit). |

### Output

Every job is one flat row. Fields with no value are omitted from that row, so results stay compact. The example below shows the full shape; a real row carries either `applyEmail` or `applyUrl` depending on how that employer takes applications, never both.

```json
{
  "jobId": "127131934",
  "vacancyId": "1042288",
  "jobUrl": "https://www.s1jobs.com/job/field-officer-127131934",
  "jobTitle": "Field Officer",
  "description": "We are looking for an experienced Field Officer to join our Glasgow team...",
  "postedDate": "2026-07-24T09:41:03Z",
  "closingDate": "2026-08-21T00:00:00Z",
  "salaryText": "£32,000 - £36,000 per annum",
  "salaryRate": "annual",
  "salaryMin": 32000,
  "salaryMax": 36000,
  "salaryAnnualMin": 32000,
  "salaryAnnualMax": 36000,
  "contractType": "Permanent",
  "jobType": "Full",
  "workingHourPattern": "Regular working hours",
  "workingLocation": "Hybrid working",
  "location": "Glasgow, Glasgow City",
  "city": "Glasgow",
  "county": "Glasgow City",
  "country": "Scotland",
  "postcode": "G2 4JR",
  "latitude": 55.8609,
  "longitude": -4.2514,
  "companyName": "Aberdeen City Council",
  "companyUrl": "https://www.s1jobs.com/company/aberdeen-city-council",
  "companyDescription": "One of Scotland's largest local authorities...",
  "advertiserType": "Employer",
  "coreSkills": ["Social Care / Social Services / Housing"],
  "primaryCoreSkill": "Social Care / Social Services / Housing",
  "specialisms": ["Housing Support"],
  "skills": ["Case Management", "Safeguarding"],
  "applicationMethod": "email",
  "applyEmail": "recruitment@example-employer.co.uk",
  "applyUrl": "https://careers.example-employer.co.uk/vacancies/1188",
  "jobReference": "ACC-2026-1188",
  "isPublicSector": true,
  "requiresCv": true,
  "hasVideo": false,
  "scrapedAt": "2026-07-31T09:12:44Z"
}
```

#### Core Job Fields

| Field | Type | Description |
|-------|------|-------------|
| `jobId` | string | Stable s1jobs identifier — use this to deduplicate across runs |
| `vacancyId` | string | Secondary vacancy identifier used by the board |
| `jobUrl` | string | Direct link to the vacancy page |
| `jobTitle` | string | Advertised job title |
| `description` | string | Full advert text, not a truncated snippet |
| `postedDate` | string | Publication date (ISO) |
| `firstLiveDate` | string | Date the advert first went live (ISO) |
| `closingDate` | string | Application closing date (ISO) |
| `expiryDate` | string | Date the advert is removed from the board (ISO) |
| `durationMessage` | string | Free-text duration note, e.g. a fixed-term length |
| `searchUrl` | string | The s1jobs page this job was collected from |
| `scrapedAt` | string | Timestamp the row was collected (ISO) |

#### Location & Coordinates

| Field | Type | Description |
|-------|------|-------------|
| `location` | string | Human-readable location label as shown on the listing |
| `city` | string | Town or city name |
| `county` | string | Council area |
| `district` | string | District within the council area |
| `country` | string | Always `Scotland` for board listings |
| `postcode` | string | UK postcode (with full job details on) |
| `latitude` | number | Decimal latitude, ready for mapping |
| `longitude` | number | Decimal longitude, ready for mapping |

#### Salary

| Field | Type | Description |
|-------|------|-------------|
| `salaryText` | string | Salary exactly as advertised, e.g. `£32,000 - £36,000 per annum` |
| `salaryRate` | string | Pay period, e.g. `annual`, `hourly` |
| `salaryMin` | number | Lower bound at the advertised rate |
| `salaryMax` | number | Upper bound at the advertised rate |
| `salaryAnnualMin` | number | Lower bound normalised to an annual figure |
| `salaryAnnualMax` | number | Upper bound normalised to an annual figure |

#### Contract & Hours

| Field | Type | Description |
|-------|------|-------------|
| `contractType` | string | `Permanent`, `Temporary` or `Contract` |
| `jobType` | string | `Full` or `Part` time |
| `workingHourPattern` | string | Working-hours pattern, e.g. `Regular working hours`, `Shift work`. Only a minority of employers publish it, and the share varies a lot by sector and sort order |
| `workingLocation` | string | `Onsite working`, `Hybrid working`, `Remote working` or `Home working` |

#### Employer & Apply Contacts

| Field | Type | Description |
|-------|------|-------------|
| `companyName` | string | Employer or advertising agency name |
| `companyId` | string | Employer identifier on s1jobs |
| `companyUrn` | string | Employer reference used on the employer profile |
| `companyUrl` | string | Link to the employer's s1jobs profile |
| `companyLogoUrl` | string | Employer logo image URL |
| `companyDescription` | string | Employer's own "about us" text |
| `companyAccreditations` | array | Employer accreditations, e.g. Living Wage, Disability Confident |
| `advertiserType` | string | `Employer` (direct) or `Agency` |
| `advertType` | string | Advert product type used for the listing |
| `applicationMethod` | string | How this advert takes applications: `email` or `url` |
| `applyEmail` | string | Recruiter apply email as published on the advert, when `applicationMethod` is `email` |
| `applyUrl` | string | The employer's own application page on their careers site or ATS, when `applicationMethod` is `url` |
| `jobReference` | string | The employer's own internal job reference, published on roughly seven adverts in eight |
| `externalReference` | string | Reference used by the source ATS or feed |

#### Classification & Skills

| Field | Type | Description |
|-------|------|-------------|
| `coreSkills` | array | Sectors the job belongs to, from the 40 s1jobs sectors |
| `primaryCoreSkill` | string | The single main sector for the role |
| `specialisms` | array | Sub-specialisms within the sector |
| `skills` | array | Individual skill tags attached to the advert |
| `jobAccreditations` | array | Accreditations attached to this specific vacancy |
| `publicSectorType` | string | Kind of public body, when the role is public sector |

#### Role Flags & Media

| Field | Type | Description |
|-------|------|-------------|
| `isApprenticeship` | boolean | Advertised as an apprenticeship |
| `isGraduateSuitable` | boolean | Marked suitable for graduates |
| `isImmediateStart` | boolean | Immediate-start marker as published by s1jobs. The board does not currently populate this marker, so filter with the `immediate_start` role highlight instead of reading this field |
| `isPublicSector` | boolean | Public-sector role |
| `requiresCv` | boolean | A CV is required to apply |
| `hasAccreditation` | boolean | Employer holds at least one accreditation |
| `hasVideo` | boolean | Listing includes a video |
| `videoUrl` | string | Link to the listing's video, when present |
| `isFeatured` | boolean | Featured listing on the board |
| `isSponsored` | boolean | Promoted listing |

### Tips for Best Results

- **Role highlights combine with AND, not OR.** Ticking apprenticeship *and* graduate together returned just 3 jobs across the whole board. Pick one highlight at a time unless you deliberately want a razor-thin set.
- **`immediate_start` filters correctly even though the matching output flag stays false.** The board narrows the result set server-side but never sets the field, so use the role highlight to filter and ignore `isImmediateStart` when analysing rows.
- **"Closest first" needs a town or city to measure from.** Choose it without one and the run quietly switches to newest first and says so in the log — set `location` to get the ordering you actually wanted.
- **For scheduled runs, pair `"sortBy": "newest"` with a small `maxResults`.** s1jobs has no "posted in the last X hours" filter, so newest-first with a cap of 50–100 is the cheapest way to pick up only fresh vacancies on a daily schedule.
- **`maxResults` is a floor, never a ceiling.** Results arrive 20 at a time and the final page is kept whole, so a cap of 30 gives you 40 rows. You will never receive fewer than you asked for because of trimming.
- **Salary filters silently drop every job without a published salary.** A large share of Scottish adverts withhold pay, so run once without `minSalary`/`maxSalary` to see how much of your target market advertises it before you filter.
- **Keep `includeJobDetails` on unless you are in a hurry.** It is what adds the apply route, the UK postcode and the employer job reference — and it does not change what you are charged, because billing is per job either way.
- **Build lead lists from `applyEmail` and `applyUrl` together.** About seven adverts in ten publish a recruiter email and the other three send applicants to the employer's own site, so reading only `applyEmail` quietly drops a third of your reachable list. The split shifts with the sector you filter on.

### Pricing

**From $2.50 per 1,000 results** — cheaper than the alternatives on the store, with real search fields instead of hand-built URLs. Bronze, Silver and Gold subscribers pay progressively less; the table shows the total cost at each discount tier.

| Results | No discount | Bronze | Silver | Gold |
|---------|-------------|--------|--------|------|
| 100 | $0.30 | $0.28 | $0.27 | $0.25 |
| 1,000 | $3.00 | $2.80 | $2.65 | $2.50 |
| 10,000 | $30.00 | $28.00 | $26.50 | $25.00 |
| 100,000 | $300.00 | $280.00 | $265.00 | $250.00 |

A "result" is one unique job row in your dataset — duplicates the board repeats across pages are removed before you are billed. **No compute or time-based charges — you pay per result, plus a small fixed per-run start fee.**

### Integrations

Export data in JSON, CSV, Excel, XML, or RSS. Connect to 1,500+ apps via:

- **Zapier** / **Make** / **n8n** — Workflow automation
- **Google Sheets** — Direct spreadsheet export
- **Slack** / **Email** — Notifications on new results
- **Webhooks** — Trigger your own APIs when a run finishes
- **Apify API** — Full programmatic access

### Legal & Ethical Use

This actor is built for legitimate recruitment research, labour-market analysis, salary benchmarking and job aggregation. You are responsible for complying with applicable laws, including UK GDPR, and with s1jobs.com's Terms of Service. Contact details published on job adverts are provided by employers for applications and recruitment enquiries — do not use them for spam, harassment, or unsolicited bulk marketing, and honour any opt-out request you receive.

# Actor input Schema

## `searchKeyword` (type: `string`):

Word or phrase to look for in job titles, employer names and descriptions (e.g. 'nurse', 'HGV driver', 'software engineer'). Leave blank to collect every vacancy matching the filters below.

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

Scottish town or city to search in, e.g. 'Glasgow', 'Edinburgh', 'Aberdeen', 'Inverness'. Leave blank to search all of Scotland.

## `distanceMiles` (type: `string`):

How far around the town or city above to search. Only has an effect when a town or city is set — s1jobs measures the radius from that place.

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

Paste s1jobs.com links — either search/browse pages (e.g. https://www.s1jobs.com/jobs/glasgow/) or single job pages (e.g. https://www.s1jobs.com/job/field-officer-127131934). You can mix both in one list. When you use this, the keyword, place and filters are ignored, because each link already carries its own filters. Results from several links are merged and de-duplicated. Search and browse links return the full set of fields; a single job page carries a slightly smaller set, because s1jobs publishes a few fields (expiry date, council area, working arrangement, duration note and the video flags) only on its search pages.

## `sectors` (type: `array`):

Only include jobs in these sectors. Picking several returns jobs from any of them. Leave empty to include every sector.

## `jobTypes` (type: `array`):

Only include full-time or part-time roles. Leave empty to include both.

## `contractTypes` (type: `array`):

Only include jobs offering these contract types. Leave empty to include all.

## `workingLocations` (type: `array`):

Only include jobs with these working arrangements. Picking several returns jobs matching any of them. Many employers do not state an arrangement at all, and those jobs are excluded when you pick a value here. Leave empty to include all.

## `advertiserType` (type: `string`):

Only include jobs posted directly by the employer, or only those posted by a recruitment agency.

## `companyName` (type: `string`):

Only include jobs from this employer, e.g. 'Aviva' or 'Aberdeen City Council'. Use the employer name exactly as it appears on s1jobs.

## `minSalary` (type: `integer`):

Only include jobs advertising a yearly salary of at least this amount, e.g. 30000. Enter a whole number of pounds with no comma, currency symbol or minus sign — anything else is rejected before the run starts. Many jobs do not publish a salary, and those are excluded when you set this. Leave blank for any salary.

## `maxSalary` (type: `integer`):

Only include jobs advertising a yearly salary up to this amount, e.g. 50000. Enter a whole number of pounds with no comma, currency symbol or minus sign — anything else is rejected before the run starts. Keep it above the minimum salary, or no job can match both. Many jobs do not publish a salary, and those are excluded when you set this. Leave blank for any salary.

## `roleFlags` (type: `array`):

Only include jobs marked with these highlights on s1jobs. Picking several means a job must match all of them, so combining many will return very few results. Leave empty to include everything.

## `sortBy` (type: `string`):

The order s1jobs returns results in. 'Newest first' is the best way to collect only recent postings — pair it with a small result limit for scheduled runs that pick up just the latest jobs. 'Closest first' needs a town or city to measure from; if you pick it without one, the run automatically uses 'Newest first' instead and tells you in the log.

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

Open each job's own page to add the UK postcode, the apply route (a recruiter apply email or the employer's own application link — every job has one or the other), the employer's job reference, the employer description, and accreditations. This makes one extra request per job, so runs take longer — but it does not change what you are charged, because you are still billed per job. If s1jobs is unusually slow, a job that hasn't answered within two and a half minutes keeps its standard information and the run carries on — you never lose the job itself. Turn off for the fastest possible run.

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

Cap on how many jobs to collect in total. Default 100 — increase for bigger runs, or set to 0 to collect everything that matches. It must be a whole number of 0 or more; a negative value is rejected before the run starts. The run stops asking for new pages once the cap is reached but keeps the whole final page, so you may receive slightly more than requested — never fewer because of trimming. A 'collect everything' (0) run is capped at 20,000 jobs for the whole run as a safety limit, far above the size of the board.

## Actor input object example

```json
{
  "startUrls": [],
  "sectors": [],
  "jobTypes": [],
  "contractTypes": [],
  "workingLocations": [],
  "roleFlags": [],
  "sortBy": "newest",
  "includeJobDetails": true,
  "maxResults": 100
}
```

# Actor output Schema

## `overview` (type: `string`):

Every job with title, employer, location, salary, contract type and link.

## `details` (type: `string`):

Complete records including description, skills, coordinates, employer profile and apply details.

# 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 = {
    "searchKeyword": "",
    "location": "",
    "distanceMiles": "",
    "startUrls": [],
    "sectors": [],
    "jobTypes": [],
    "contractTypes": [],
    "workingLocations": [],
    "advertiserType": "",
    "companyName": "",
    "roleFlags": [],
    "sortBy": "newest",
    "includeJobDetails": true,
    "maxResults": 100
};

// Run the Actor and wait for it to finish
const run = await client.actor("solidcode/s1jobs-com-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 = {
    "searchKeyword": "",
    "location": "",
    "distanceMiles": "",
    "startUrls": [],
    "sectors": [],
    "jobTypes": [],
    "contractTypes": [],
    "workingLocations": [],
    "advertiserType": "",
    "companyName": "",
    "roleFlags": [],
    "sortBy": "newest",
    "includeJobDetails": True,
    "maxResults": 100,
}

# Run the Actor and wait for it to finish
run = client.actor("solidcode/s1jobs-com-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 '{
  "searchKeyword": "",
  "location": "",
  "distanceMiles": "",
  "startUrls": [],
  "sectors": [],
  "jobTypes": [],
  "contractTypes": [],
  "workingLocations": [],
  "advertiserType": "",
  "companyName": "",
  "roleFlags": [],
  "sortBy": "newest",
  "includeJobDetails": true,
  "maxResults": 100
}' |
apify call solidcode/s1jobs-com-scraper --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/acts/QCo0ea6iGn8ICNs9w/builds/cEL3ezheAySTrUe3a/openapi.json
