# JustJoin.it Scraper - Tech Jobs Data (`benthepythondev/justjoin-it-scraper`) Actor

Scrape JustJoin.it tech job offers: title, company, city, workplace mode, seniority, contract type, salary, skills and URL.

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

## Pricing

from $3.00 / 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.

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 - Tech Jobs Data

Scrape technology job offers from **JustJoin.it** in one run. Get the job title, hiring company, city, remote or hybrid mode, seniority, contract type, salary label, skills and direct offer URL from any JustJoin.it search page. Export results to JSON, CSV or Excel, schedule recurring monitoring, call the actor by API, or connect the dataset to Make, Zapier, n8n, Airtable, Google Sheets, a recruiting CRM or a hiring-intelligence workflow.

### What is the JustJoin.it Scraper?

JustJoin.it is one of the best-known technology job boards in Poland and Central Europe. It focuses on software engineering, data, DevOps, AI, product, QA, security, analytics and other digital roles. Its job cards often include the details recruiters care about most: visible salary ranges, workplace mode, seniority, contract type and required skills.

This actor turns JustJoin.it search pages into structured data. Paste a filtered JustJoin.it URL or provide a keyword and location slug. The actor fetches the public search page, parses the visible offer cards, removes duplicates and pushes normalized rows to the Apify dataset.

### What data does it extract?

- Job ID / offer slug
- Job title
- Hiring company
- City / main location
- Workplace type, such as remote or hybrid
- Seniority level
- Contract type
- Salary label when shown
- Skills and technologies
- Direct JustJoin.it offer URL
- Search URL used

### Input

| Field | Type | Description |
|-------|------|-------------|
| `searchUrls` | array | Full JustJoin.it search URLs to scrape exactly. |
| `keyword` | string | Technology or role keyword used when no URL is provided. |
| `location` | string | JustJoin.it location slug, such as `all-locations`, `warszawa`, `krakow` or `remote`. |
| `maxResults` | integer | Maximum offers returned per search. |

### Example input

```json
{
  "searchUrls": ["https://justjoin.it/job-offers/all-locations/python"],
  "maxResults": 50
}
````

Keyword input:

```json
{
  "keyword": "devops",
  "location": "all-locations",
  "maxResults": 100
}
```

### Output example

```json
{
  "job_id": "link-group-senior-python-fullstack-developer-bialystok-python",
  "title": "Senior Python Fullstack Developer",
  "company": "Link Group",
  "city": "Bialystok",
  "workplace_type": "Remote",
  "seniority": "Senior",
  "contract_type": "B2B",
  "salary": "28 - 31 EUR/h",
  "skills": ["TypeScript", "CI/CD", "GCP", "React", "Python"],
  "url": "https://justjoin.it/job-offer/link-group-senior-python-fullstack-developer-bialystok-python",
  "search": "https://justjoin.it/job-offers/all-locations/python"
}
```

### Use cases

- **Tech recruiting intelligence** - monitor demand for Python, Java, DevOps, data, QA, security, AI and product roles.
- **Salary research** - collect visible salary labels from tech job cards.
- **Lead generation** - identify companies actively hiring technical staff, a strong buying signal for recruiting, HR tools, developer tools, outsourcing, payroll and training.
- **Remote-work analysis** - track remote and hybrid role counts by skill or location.
- **Competitor hiring alerts** - monitor target companies, agencies or market segments.
- **Job-board aggregation** - feed JustJoin.it offers into a niche newsletter, dashboard or internal search system.

### Why use this actor?

The actor reads public search-result cards and does not require an account, API key or browser. It is designed for fast, repeatable runs with small memory usage. Because the output is normalized, you can compare JustJoin.it data with other job-board or ATS actors in the same workflow.

JustJoin.it is commercially useful because its listings are specific and rich. Many cards show salary, seniority, contract type and skills directly in the search result, which makes the dataset more actionable than generic job-board pages. For sales teams, a company hiring senior Python engineers or DevOps specialists is a strong sign of active technical investment. For recruiters, salary and stack data make it easier to qualify roles and build market benchmarks.

For best results, use exact search URLs when you want to preserve filters from the website. For broad monitoring, create separate Apify tasks for each technology family, such as Python, Java, JavaScript, DevOps, Data, AI, QA or Security. Schedule them daily to detect new offers and trend changes over time.

The dataset also works well as a pricing and positioning signal. Salary labels by seniority and contract type help compare B2B versus permanent hiring, remote versus hybrid roles, and demand across major Polish and European tech hubs. If you run a staffing agency, software consultancy, payroll service, developer-tool company or training business, these signals can help prioritize accounts that are actively hiring and already publishing budget ranges.

### Tips

- Use `searchUrls` for filtered searches.
- Use `keyword` + `location` for simple repeated monitoring.
- De-duplicate downstream by `job_id` or `url`.
- Combine with company/contact enrichment actors for lead-generation workflows.
- Keep `maxResults` small for frequent scheduled checks.

### FAQ

**Does this require a JustJoin.it account?** No. It reads public job-search pages.

**Does it use a browser?** No. It uses direct HTTP requests and an HTML parser.

**Can I scrape a filtered URL?** Yes. Paste the full URL in `searchUrls`.

**Does it include salaries?** Yes, when salary labels are visible on the job card.

**Can I export to CSV or Excel?** Yes. Apify datasets support JSON, CSV, Excel, API access and webhooks.

**Is this useful for lead generation?** Yes. Active hiring is a strong B2B buying signal.

### You might also like

- [No Fluff Jobs Scraper](https://apify.com/benthepythondev/nofluffjobs-scraper) for salary-rich tech jobs.
- [StepStone Scraper](https://apify.com/benthepythondev/stepstone-scraper) for European job boards.
- [CWJobs Scraper](https://apify.com/benthepythondev/cwjobs-scraper) for UK tech jobs.
- [iCIMS Jobs Scraper](https://apify.com/benthepythondev/icims-jobs-scraper) for ATS career pages.
- [Remote Jobs Aggregator](https://apify.com/benthepythondev/remote-jobs-aggregator) for remote job feeds.

### Keywords

JustJoin.it scraper, JustJoin scraper, JustJoin.it jobs scraper, Polish tech jobs, scrape JustJoin.it, tech jobs data, developer jobs Poland, remote tech jobs, salary data, Python jobs scraper, DevOps jobs scraper, recruitment lead generation, hiring signals, Apify jobs scraper, export JustJoin.it jobs to CSV.

# Actor input Schema

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

Paste JustJoin.it search URLs. Leave empty to use keyword + location.

## `keyword` (type: `string`):

Technology or role keyword, e.g. python, java, devops, data.

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

JustJoin.it location slug, e.g. all-locations, warszawa, krakow, remote.

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

Maximum number of offers to return.

## Actor input object example

```json
{
  "searchUrls": [
    "https://justjoin.it/job-offers/all-locations/python"
  ],
  "keyword": "python",
  "location": "all-locations",
  "maxResults": 10
}
```

# 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://justjoin.it/job-offers/all-locations/python"
    ],
    "keyword": "python",
    "location": "all-locations",
    "maxResults": 10
};

// Run the Actor and wait for it to finish
const run = await client.actor("benthepythondev/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 = {
    "searchUrls": ["https://justjoin.it/job-offers/all-locations/python"],
    "keyword": "python",
    "location": "all-locations",
    "maxResults": 10,
}

# Run the Actor and wait for it to finish
run = client.actor("benthepythondev/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 '{
  "searchUrls": [
    "https://justjoin.it/job-offers/all-locations/python"
  ],
  "keyword": "python",
  "location": "all-locations",
  "maxResults": 10
}' |
apify call benthepythondev/justjoin-it-scraper --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "JustJoin.it Scraper - Tech Jobs Data",
        "description": "Scrape JustJoin.it tech job offers: title, company, city, workplace mode, seniority, contract type, salary, skills and URL.",
        "version": "1.0",
        "x-build-id": "UvedT0JG7VlRfzceC"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/benthepythondev~justjoin-it-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-benthepythondev-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/benthepythondev~justjoin-it-scraper/runs": {
            "post": {
                "operationId": "runs-sync-benthepythondev-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/benthepythondev~justjoin-it-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-benthepythondev-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": {
                    "searchUrls": {
                        "title": "Search URLs",
                        "type": "array",
                        "description": "Paste JustJoin.it search URLs. Leave empty to use keyword + location.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "keyword": {
                        "title": "Keyword / skill",
                        "type": "string",
                        "description": "Technology or role keyword, e.g. python, java, devops, data.",
                        "default": "python"
                    },
                    "location": {
                        "title": "Location slug",
                        "type": "string",
                        "description": "JustJoin.it location slug, e.g. all-locations, warszawa, krakow, remote.",
                        "default": "all-locations"
                    },
                    "maxResults": {
                        "title": "Max results",
                        "minimum": 1,
                        "maximum": 1000,
                        "type": "integer",
                        "description": "Maximum number of offers to return.",
                        "default": 50
                    }
                }
            },
            "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
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
