# JustJoin.it Scraper (`solidcode/justjoin-it-scraper`) Actor

\[💰 $0.95 / 1K] Extract IT jobs from JustJoin.it — salaries, tech stack, company, location, and apply links. Search by keyword and city, filter by category, seniority, contract type, and remote/hybrid/office.

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

## Pricing

from $0.95 / 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 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

## JustJoin.it Scraper

Pull IT job listings from JustJoin.it at scale — disclosed salary ranges, per-skill proficiency levels, company size and logo, geo-coordinates, contract breakdowns, and apply links for every role across the Polish and Central European tech market. Built for tech recruiters, sourcers, salary-benchmarking analysts, and developers job-hunting in the CEE market who need structured salary and skill data without copy-pasting one offer page at a time.

### Why This Scraper?

- **Real disclosed salary ranges, multi-currency aware** — every job that publishes pay returns `salaryFrom`, `salaryTo`, and `salaryCurrency` using the employer's original posted figure (PLN, EUR, USD, GBP), never a converted estimate.
- **Per-skill proficiency levels** — `requiredSkills` and `niceToHaveSkills` each return the skill name plus the seniority level the employer wants (e.g. React: 4, Python: 5), not just a flat tag list.
- **Geo-coordinates on every listing** — latitude, longitude, city, street, and country code for each role, ready to map or cluster.
- **Polish/CEE contract-type breakdown** — B2B, Permanent (UoP), Mandate contract, Specific-task contract, and Internship captured per job, with salary attached to each contract type.
- **25 named tech categories** — Python, Java, JavaScript, DevOps, Data, AI/ML, Testing, Mobile, Security, PHP, Ruby, Go, Scala, C/C++, .NET, UX/UI, PM, Architecture, ERP, Analytics, Game, HTML, Admin, Support, and Other.
- **6 seniority levels** — filter to Intern, Junior, Mid, Senior, Team Leader / Manager, or C-level roles.
- **Remote / Hybrid / Office working-mode filter** plus required-languages with proficiency, so you can target fully-remote, English-speaking roles in one pass.
- **Apply link and method captured** — `applyUrl` and `applyMethod` for direct outreach, alongside published and expiry dates.
- **Up to 10,000 results per search** with a one-toggle full-description option (HTML + plain text) you can switch off for faster bulk pulls.

### Use Cases

**Tech Recruitment & Sourcing**
- Build candidate-facing role lists filtered by stack, seniority, and city
- Surface fully-remote roles open to your candidates' languages
- Track competitor hiring by company across categories
- Capture apply links for direct candidate referrals

**Salary Benchmarking**
- Compare disclosed B2B vs Permanent pay for the same role
- Benchmark salary ranges by city, seniority, and tech category
- Track pay movements over time with repeated newest-first pulls
- Map salary against required skill levels

**Market Research & Talent Analytics**
- Measure demand for specific frameworks and languages across the CEE market
- Map hiring density by city using per-listing geo-coordinates
- Quantify remote vs hybrid vs office offerings by category
- Profile company sizes hiring for a given stack

**Competitive Intelligence**
- Monitor a competitor's open roles, stack, and seniority mix
- Detect new openings the day they go live with newest-first sorting
- Track which contract types competitors offer in your market

**Job Seekers**
- Filter to remote, salary-disclosed roles matching your skills
- Sort by highest salary to surface top-of-market openings
- Pull full job descriptions and apply links for shortlisted roles

### Getting Started

#### Simple keyword search

```json
{
    "keywords": "Python",
    "maxItems": 50
}
````

#### Keyword, city, category, and seniority

```json
{
    "keywords": "React",
    "city": "Warszawa",
    "categories": ["javascript"],
    "seniority": ["senior"],
    "workingMode": ["remote"],
    "withSalaryOnly": true,
    "maxItems": 200
}
```

#### Start URLs with filters and a result cap

```json
{
    "startUrls": [
        "https://justjoin.it/job-offers/warszawa/python",
        "https://justjoin.it/job-offer/example-senior-data-engineer"
    ],
    "employmentType": ["b2b", "permanent"],
    "sortBy": "salary-desc",
    "includeDescription": false,
    "maxItems": 500
}
```

### Input Reference

#### Search

| Parameter | Type | Default | Description |
|-----------|------|---------|-------------|
| `keywords` | string | `"Python"` | Search term for job titles, skills, or companies (e.g. "React", "DevOps"). Leave empty to browse all jobs. |
| `city` | string | `""` | City name to filter by (e.g. "Warszawa", "Kraków", "Wrocław", "Berlin"). Also includes nearby jobs within ~30 km of the city. Leave empty for all locations. |
| `startUrls` | string\[] | `[]` | Paste full JustJoin.it search or job-offer URLs to scrape directly. Used in addition to the keyword/city search. |

#### Filters

| Parameter | Type | Default | Description |
|-----------|------|---------|-------------|
| `categories` | select\[] | `[]` | Tech categories to include: AI/ML, JavaScript, HTML, PHP, Ruby, Python, Java, .NET, Scala, C / C++, Mobile, Testing, DevOps, Admin, UX/UI, Project Manager, Game, Analytics, Security, Data, Go, Support, ERP, Architecture, Other. Leave empty for all. |
| `seniority` | select\[] | `[]` | Experience levels: Intern, Junior, Mid, Senior, Team Leader / Manager, C-level. Leave empty for all. |
| `employmentType` | select\[] | `[]` | Contract types: B2B, Permanent (UoP), Mandate contract, Internship, Specific-task contract. Leave empty for all. |
| `workingMode` | select\[] | `[]` | Work arrangements: Remote, Hybrid, Office. Leave empty for all. |
| `withSalaryOnly` | boolean | `false` | When on, only include jobs that publish a salary range. |
| `sortBy` | select | `Default (relevance)` | Result order: Default (relevance), Newest first, Highest salary first, Lowest salary first. |

#### Output & Limits

| Parameter | Type | Default | Description |
|-----------|------|---------|-------------|
| `includeDescription` | boolean | `true` | Include each job's full description text and HTML. Turn off for a faster, lighter run when you only need summary fields. |
| `maxItems` | integer | `100` | Maximum number of jobs to collect. Set to 0 for no limit (everything matching your search). |

### Output

Each job posting is one flat row. Here's a representative result with descriptions enabled:

```json
{
    "id": "a1b2c3d4-1234-5678-90ab-cdef12345678",
    "slug": "senior-python-engineer-acme-warszawa",
    "url": "https://justjoin.it/job-offer/senior-python-engineer-acme-warszawa",
    "title": "Senior Python Engineer",
    "company": "Acme Tech",
    "companyUrl": "https://justjoin.it/companies/acme-tech",
    "companySize": "100 - 499",
    "companyLogo": "https://justjoin.it/logos/acme.png",
    "category": "python",
    "experience": "senior",
    "salary": "20,000 - 28,000 PLN / month",
    "salaryFrom": 20000,
    "salaryTo": 28000,
    "salaryCurrency": "PLN",
    "employmentTypes": [
        { "type": "b2b", "from": 20000, "to": 28000, "currency": "PLN", "currencySource": "original", "unit": "month", "gross": false }
    ],
    "workingMode": "remote",
    "workingTime": "full_time",
    "city": "Warszawa",
    "street": "Krucza 50",
    "country": "PL",
    "latitude": 52.2297,
    "longitude": 21.0122,
    "locations": [
        { "city": "Warszawa", "street": "Krucza 50", "latitude": 52.2297, "longitude": 21.0122, "slug": "warszawa" }
    ],
    "requiredSkills": [
        { "name": "Python", "level": 5 },
        { "name": "Django", "level": 4 }
    ],
    "niceToHaveSkills": [
        { "name": "Kubernetes", "level": 3 }
    ],
    "languages": [
        { "code": "en", "level": "B2" }
    ],
    "remoteInterview": true,
    "openToHireUkrainians": true,
    "promoted": false,
    "isSuperOffer": false,
    "applyMethod": "apply_external",
    "applyUrl": "https://acme-tech.com/careers/senior-python",
    "isActive": true,
    "datePosted": "2026-05-20T08:00:00Z",
    "lastPublishedAt": "2026-05-22T08:00:00Z",
    "expiresAt": "2026-06-21T08:00:00Z",
    "descriptionHtml": "<p>We are looking for a Senior Python Engineer...</p>",
    "descriptionText": "We are looking for a Senior Python Engineer...",
    "source": "justjoin.it"
}
```

#### Core Fields

| Field | Type | Description |
|-------|------|-------------|
| `id` | string | Unique job offer identifier |
| `slug` | string | URL slug for the offer |
| `url` | string | Public JustJoin.it listing URL |
| `title` | string | Job title |
| `category` | string | Tech category (e.g. python, devops) |
| `experience` | string | Seniority level (intern, junior, mid, senior, manager, c\_level) |
| `workingMode` | string | remote, hybrid, or office |
| `workingTime` | string | Full-time or part-time |
| `source` | string | Source marker ("justjoin.it") |

#### Company

| Field | Type | Description |
|-------|------|-------------|
| `company` | string | Employer / company name |
| `companyUrl` | string | Company profile URL |
| `companySize` | string | Company size band (e.g. "100 - 499") |
| `companyLogo` | string | Company logo URL |

#### Salary

| Field | Type | Description |
|-------|------|-------------|
| `salary` | string | Human-readable salary range summary |
| `salaryFrom` | number | Lower bound of the disclosed salary |
| `salaryTo` | number | Upper bound of the disclosed salary |
| `salaryCurrency` | string | Salary currency (PLN, EUR, USD, GBP) |
| `employmentTypes` | object\[] | Contract types with per-type salary, currency, unit, and gross flag. May include an EUR-converted mirror of a row alongside the employer's original figure — the original always has `currencySource: "original"`. |

#### Location

| Field | Type | Description |
|-------|------|-------------|
| `city` | string | Primary city |
| `street` | string | Street address |
| `country` | string | Country code (e.g. PL) |
| `latitude` | number | Geo latitude |
| `longitude` | number | Geo longitude |
| `locations` | object\[] | All listed work locations with city, street, and coordinates |

#### Skills & Languages

| Field | Type | Description |
|-------|------|-------------|
| `requiredSkills` | object\[] | Must-have skills, each with name and proficiency level |
| `niceToHaveSkills` | object\[] | Nice-to-have skills, each with name and proficiency level |
| `languages` | object\[] | Required languages, each with code and proficiency level |
| `remoteInterview` | boolean | Whether a remote interview is available |
| `openToHireUkrainians` | boolean | Whether the employer is open to hiring Ukrainians |

#### Dates & Apply

| Field | Type | Description |
|-------|------|-------------|
| `applyMethod` | string | How to apply (e.g. external link, internal) |
| `applyUrl` | string | External application URL |
| `isActive` | boolean | Whether the listing is still open (from the full job detail) |
| `datePosted` | string | First publication date |
| `lastPublishedAt` | string | Most recent republication date |
| `expiresAt` | string | Listing expiry date |
| `promoted` | boolean | Promoted listing flag |
| `isSuperOffer` | boolean | Featured "super offer" flag |

#### Description

Populated when `includeDescription` is on.

| Field | Type | Description |
|-------|------|-------------|
| `descriptionHtml` | string | Full job description in HTML |
| `descriptionText` | string | Full job description in plain text |

### Tips for Best Results

- **Start small** — set `maxItems` to 25-50 on your first run to confirm the data matches your needs, then scale up.
- **Use `withSalaryOnly` for clean benchmarking** — toggling it on removes "salary undisclosed" rows so every result has a real `salaryFrom`/`salaryTo` to compare.
- **Turn off `includeDescription` for fast bulk pulls** — when you only need salary, skills, and company fields, skipping descriptions makes large runs noticeably quicker.
- **Sort by Highest salary first** — set `sortBy` to "Highest salary first" to surface top-of-market roles at the front of your dataset.
- **Read `employmentTypes` for true compensation** — a single job often lists different pay for B2B vs Permanent; the per-type array shows each figure with its currency, so you compare like-for-like. The array may also include an EUR-converted mirror of a row; filter to entries where `currencySource` is `"original"` to keep only the employer's posted figures.
- **Combine inputs in one run** — mix a keyword, a city, several categories, and start URLs together; results are de-duplicated across all entry points.
- **Use `seniority` plus a category for tight talent maps** — e.g. Senior + Data + Remote gives a focused, mappable slice using each listing's coordinates.

### Pricing

**From $0.95 per 1,000 results** — competitively priced for the CEE tech-hiring market. No compute charges — you only pay per result returned. Bronze, Silver, and Gold subscribers pay progressively less; the table below shows total cost at each discount tier.

| Results | No discount | Bronze | Silver | Gold |
|---------|-------------|--------|--------|------|
| 100 | $0.11 | $0.11 | $0.10 | $0.10 |
| 1,000 | $1.10 | $1.05 | $1.00 | $0.95 |
| 10,000 | $11.00 | $10.50 | $10.00 | $9.50 |
| 100,000 | $110.00 | $105.00 | $100.00 | $95.00 |

A "result" is one job posting row in the output dataset. There are no separate compute or per-event charges — you pay only for the jobs returned.

### 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 custom integrations on run completion
- **Apify API** — Full programmatic access

### Legal & Ethical Use

This actor is designed for legitimate recruitment research, salary benchmarking, and labor-market analysis. Users are responsible for complying with applicable laws and JustJoin.it's Terms of Service. Do not use extracted data for spam, harassment, or any unlawful purpose, and handle any personal data in line with applicable privacy regulations such as GDPR.

# Actor input Schema

## `keywords` (type: `string`):

Search term for job titles, skills, or companies (e.g. 'React', 'Python', 'DevOps'). Leave empty to browse all jobs.

## `city` (type: `string`):

City name to filter by (e.g. 'Warszawa', 'Kraków', 'Wrocław', 'Berlin'). Also includes nearby jobs within ~30 km of the city. Leave empty to include all locations.

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

Optional: paste full JustJoin.it search or job-offer URLs to scrape directly (e.g. 'https://justjoin.it/job-offers/warszawa/python'). When provided, these are used in addition to the keyword/city search above.

## `categories` (type: `array`):

Only include jobs in these tech categories. Leave empty for all categories.

## `seniority` (type: `array`):

Only include jobs at these experience levels. Leave empty for all levels.

## `employmentType` (type: `array`):

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

## `workingMode` (type: `array`):

Only include jobs with these work arrangements. Leave empty for all.

## `withSalaryOnly` (type: `boolean`):

When enabled, only include job listings that publish a salary range.

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

Order in which jobs are collected.

## `includeDescription` (type: `boolean`):

When enabled, each job includes its full description text and HTML. Disable for a faster, lighter run when you only need the summary fields.

## `maxItems` (type: `integer`):

Maximum number of job listings to collect. Set to 0 for no limit (collect everything matching your search).

## Actor input object example

```json
{
  "keywords": "Python",
  "startUrls": [],
  "categories": [],
  "seniority": [],
  "employmentType": [],
  "workingMode": [],
  "withSalaryOnly": false,
  "sortBy": "default",
  "includeDescription": true,
  "maxItems": 100
}
```

# Actor output Schema

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

Table of jobs with key fields like title, company, salary, location, and link.

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

Full per-job detail rows including tech stack, employment types, working mode, and description.

# 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 = {
    "keywords": "Python",
    "city": "",
    "startUrls": [],
    "categories": [],
    "seniority": [],
    "employmentType": [],
    "workingMode": [],
    "withSalaryOnly": false,
    "sortBy": "default",
    "includeDescription": true,
    "maxItems": 100
};

// Run the Actor and wait for it to finish
const run = await client.actor("solidcode/justjoin-it-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 = {
    "keywords": "Python",
    "city": "",
    "startUrls": [],
    "categories": [],
    "seniority": [],
    "employmentType": [],
    "workingMode": [],
    "withSalaryOnly": False,
    "sortBy": "default",
    "includeDescription": True,
    "maxItems": 100,
}

# Run the Actor and wait for it to finish
run = client.actor("solidcode/justjoin-it-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 '{
  "keywords": "Python",
  "city": "",
  "startUrls": [],
  "categories": [],
  "seniority": [],
  "employmentType": [],
  "workingMode": [],
  "withSalaryOnly": false,
  "sortBy": "default",
  "includeDescription": true,
  "maxItems": 100
}' |
apify call solidcode/justjoin-it-scraper --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "JustJoin.it Scraper",
        "description": "[💰 $0.95 / 1K] Extract IT jobs from JustJoin.it — salaries, tech stack, company, location, and apply links. Search by keyword and city, filter by category, seniority, contract type, and remote/hybrid/office.",
        "version": "1.0",
        "x-build-id": "WSPQSfK74b6brcICU"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/solidcode~justjoin-it-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-solidcode-justjoin-it-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/solidcode~justjoin-it-scraper/runs": {
            "post": {
                "operationId": "runs-sync-solidcode-justjoin-it-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/solidcode~justjoin-it-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-solidcode-justjoin-it-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": {
                    "keywords": {
                        "title": "Search Keywords",
                        "type": "string",
                        "description": "Search term for job titles, skills, or companies (e.g. 'React', 'Python', 'DevOps'). Leave empty to browse all jobs."
                    },
                    "city": {
                        "title": "City",
                        "type": "string",
                        "description": "City name to filter by (e.g. 'Warszawa', 'Kraków', 'Wrocław', 'Berlin'). Also includes nearby jobs within ~30 km of the city. Leave empty to include all locations."
                    },
                    "startUrls": {
                        "title": "Start URLs",
                        "type": "array",
                        "description": "Optional: paste full JustJoin.it search or job-offer URLs to scrape directly (e.g. 'https://justjoin.it/job-offers/warszawa/python'). When provided, these are used in addition to the keyword/city search above.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "categories": {
                        "title": "Categories",
                        "uniqueItems": true,
                        "type": "array",
                        "description": "Only include jobs in these tech categories. Leave empty for all categories.",
                        "items": {
                            "type": "string",
                            "enum": [
                                "ai",
                                "javascript",
                                "html",
                                "php",
                                "ruby",
                                "python",
                                "java",
                                "net",
                                "scala",
                                "c",
                                "mobile",
                                "testing",
                                "devops",
                                "admin",
                                "ux",
                                "pm",
                                "game",
                                "analytics",
                                "security",
                                "data",
                                "go",
                                "support",
                                "erp",
                                "architecture",
                                "other"
                            ],
                            "enumTitles": [
                                "AI/ML",
                                "JavaScript",
                                "HTML",
                                "PHP",
                                "Ruby",
                                "Python",
                                "Java",
                                ".NET",
                                "Scala",
                                "C / C++",
                                "Mobile",
                                "Testing",
                                "DevOps",
                                "Admin",
                                "UX/UI",
                                "Project Manager",
                                "Game",
                                "Analytics",
                                "Security",
                                "Data",
                                "Go",
                                "Support",
                                "ERP",
                                "Architecture",
                                "Other"
                            ]
                        },
                        "default": []
                    },
                    "seniority": {
                        "title": "Seniority Level",
                        "uniqueItems": true,
                        "type": "array",
                        "description": "Only include jobs at these experience levels. Leave empty for all levels.",
                        "items": {
                            "type": "string",
                            "enum": [
                                "intern",
                                "junior",
                                "mid",
                                "senior",
                                "manager",
                                "c_level"
                            ],
                            "enumTitles": [
                                "Intern",
                                "Junior",
                                "Mid",
                                "Senior",
                                "Team Leader / Manager",
                                "C-level"
                            ]
                        },
                        "default": []
                    },
                    "employmentType": {
                        "title": "Employment Type",
                        "uniqueItems": true,
                        "type": "array",
                        "description": "Only include jobs offering these contract types. Leave empty for all types.",
                        "items": {
                            "type": "string",
                            "enum": [
                                "b2b",
                                "permanent",
                                "mandate_contract",
                                "internship",
                                "contract"
                            ],
                            "enumTitles": [
                                "B2B",
                                "Permanent (UoP)",
                                "Mandate contract",
                                "Internship",
                                "Specific-task contract"
                            ]
                        },
                        "default": []
                    },
                    "workingMode": {
                        "title": "Working Mode",
                        "uniqueItems": true,
                        "type": "array",
                        "description": "Only include jobs with these work arrangements. Leave empty for all.",
                        "items": {
                            "type": "string",
                            "enum": [
                                "remote",
                                "hybrid",
                                "office"
                            ],
                            "enumTitles": [
                                "Remote",
                                "Hybrid",
                                "Office"
                            ]
                        },
                        "default": []
                    },
                    "withSalaryOnly": {
                        "title": "Only Jobs With Disclosed Salary",
                        "type": "boolean",
                        "description": "When enabled, only include job listings that publish a salary range.",
                        "default": false
                    },
                    "sortBy": {
                        "title": "Sort By",
                        "enum": [
                            "default",
                            "newest",
                            "salary-desc",
                            "salary-asc"
                        ],
                        "type": "string",
                        "description": "Order in which jobs are collected.",
                        "default": "default"
                    },
                    "includeDescription": {
                        "title": "Include Full Job Description",
                        "type": "boolean",
                        "description": "When enabled, each job includes its full description text and HTML. Disable for a faster, lighter run when you only need the summary fields.",
                        "default": true
                    },
                    "maxItems": {
                        "title": "Maximum Jobs",
                        "minimum": 0,
                        "type": "integer",
                        "description": "Maximum number of job listings to collect. Set to 0 for no limit (collect everything matching your search).",
                        "default": 100
                    }
                }
            },
            "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
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
