# BestJobs.eu Scraper - Romania Job Listings & Salary Data (`studio-amba/bestjobs-eu-scraper`) Actor

Extract job listings from bestjobs.eu, Romania's general/IT/engineering/finance/graduate jobs board (1.45M+ monthly views). Search by keyword and location for job title, company, salary, locations and employment type. Optional full description enrichment. No login needed.

- **URL**: https://apify.com/studio-amba/bestjobs-eu-scraper.md
- **Developed by:** [Studio Amba](https://apify.com/studio-amba) (community)
- **Categories:** Jobs
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.20 / 1,000 result scrapeds

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/actors/running/actors-in-store.md#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

### What does BestJobs.eu Scraper do?

**BestJobs.eu Scraper** extracts job listings from [bestjobs.eu](https://www.bestjobs.eu), Romania's general/IT/engineering/finance/graduate jobs board with over 1.45 million monthly views. Search by keyword and location, get back structured data: job title, company, salary, all matched locations, applicant counts, and (optionally) the full job description and employment type.

Run it on the Apify platform to get **API access, scheduling, proxy rotation, webhook integrations, and monitoring** out of the box. No login or cookies required -- all data is extracted from publicly available job listings.

### Why use this actor?

- **Market research**: Track hiring volume and salary ranges across Romanian sectors -- general, IT, engineering, finance and graduate roles all live on the same board.
- **Recruitment intelligence**: Monitor which companies are actively hiring, how many applicants they're getting, and which listings are running as paid/premium placements.
- **Salary benchmarking**: bestjobs.eu publishes both employer-stated salary ranges and its own market-estimated range per listing -- useful as a cross-check, not just a single number.
- **Job aggregation**: Feed Romanian and Romania-linked-abroad listings (bestjobs.eu also carries roles based in Belgium/Netherlands for Romanian workers) into your own job board or HR dashboard.
- **Lead generation**: Identify actively hiring companies in Romania for B2B outreach and recruitment services.
- **Reliable at scale**: The scraper reads bestjobs.eu's own server-rendered page data directly -- no browser automation, no DOM guessing -- so it does not break when the site's visual layout changes, only when the underlying data shape does. That is a materially lower failure rate than a browser-based scraper on the same site.

### How to scrape bestjobs.eu data

1. Go to the BestJobs.eu Scraper page on Apify Store.
2. Click **Try for free** to open the Actor in Apify Console.
3. Enter your search keyword (e.g. "contabil", "programator", "inginer", or any Romanian or English job title).
4. Optionally set a location (Bucuresti, Cluj-Napoca, Timisoara, etc.) to narrow results.
5. Set the maximum number of results you want, and turn on **Fetch full details** if you need the complete job description.
6. Click **Start** and wait for the run to finish.
7. Download your data as JSON, CSV, Excel, or connect it to your workflow via API.

No coding required. The scraper handles pagination and data extraction automatically, and works with Apify's free automatic proxy -- no residential proxy needed for this site.

### Input

| Field | Type | Description | Default |
|-------|------|-------------|---------|
| `searchQuery` | String | Job search keyword (Romanian or English) | `contabil` |
| `location` | String | City or region (Bucuresti, Cluj-Napoca, Timisoara, etc.) | All locations |
| `includeDetails` | Boolean | Visit each job's detail page for full description, benefits, employment type and remote status | `false` |
| `maxResults` | Integer | Maximum number of listings to scrape (1-5,000) | `100` |
| `proxyConfiguration` | Object | Proxy settings (Apify automatic proxy works fine) | Automatic |

#### Example input

```json
{
    "searchQuery": "programator",
    "location": "Bucuresti",
    "maxResults": 50,
    "includeDetails": true
}
```

### Output

The scraper outputs structured JSON data for each job listing. You can download the dataset in various formats such as JSON, HTML, CSV, or Excel.

#### Example output

```json
{
    "jobId": "52058805",
    "jobTitle": "Software Engineer",
    "company": "FOYU Live",
    "location": "Globalworth Campus A, Strada George Constantinescu 4B, Sectorul 2, Bucharest, Romania",
    "locations": [
        "Globalworth Campus A, Strada George Constantinescu 4B, Sectorul 2, Bucharest, Romania"
    ],
    "salary": "1500 - 1900",
    "estimatedSalary": "",
    "salaryConfidential": false,
    "employmentType": "Full time",
    "remote": false,
    "partialRemote": false,
    "vacancies": 1,
    "premium": true,
    "applications": 223,
    "description": "Software Engineer About the Role We are looking for a passionate and pragmatic Software Engineer...",
    "url": "https://www.bestjobs.eu/en/job/software-engineer",
    "scrapedAt": "2026-09-02T14:30:00.000Z"
}
```

### Data fields

| Field | Description |
|-------|-------------|
| `jobId` | bestjobs.eu internal job ID |
| `jobTitle` | Job position title |
| `company` | Hiring company name |
| `location` | Primary job location (city, country) |
| `locations` | All locations matched to this listing |
| `salary` | Employer-stated salary range, when not marked confidential |
| `estimatedSalary` | bestjobs.eu's own market-estimated salary range, with currency and period |
| `salaryConfidential` | `true` when the employer hid the exact salary. Requires `includeDetails` |
| `employmentType` | Full time / Part time, etc. Requires `includeDetails` |
| `remote` | `true` if fully remote. Requires `includeDetails` |
| `partialRemote` | `true` if hybrid/partial remote. Requires `includeDetails` |
| `vacancies` | Number of open positions on this listing. Requires `includeDetails` |
| `premium` | `true` if the employer paid for premium/highlighted placement |
| `applications` | Applicant count so far, as shown by the source |
| `description` | Full job description text, HTML stripped. Requires `includeDetails` |
| `url` | Direct link to the job listing on bestjobs.eu |
| `scrapedAt` | ISO 8601 timestamp of data collection |

Note: bestjobs.eu does not expose a posted/published date anywhere on the listing or detail page -- this is a gap in the source data itself, not something the scraper omits.

### How much does it cost to scrape bestjobs.eu?

The scraper reads plain HTTP responses (no browser), so it's fast and cheap. A single listing request returns up to 100 jobs at once. Pricing is per result (per job scraped), not per run, so cost estimate scales linearly:

- **100 listings** (search results only): a fraction of a cent in platform credits
- **100 listings** (with `includeDetails`): one extra request per job, still well under $0.05 in typical usage
- **1,000 listings** (search results only): under $0.10 in platform credits

Turning off `includeDetails` is faster and cheaper when you only need title, company, salary and location. Usage cost only settles once a run reports **SUCCEEDED** -- reading the dataset from a still-running run will undercount what you'll actually be charged.

### Tips and advanced options

- **Use Romanian or English keywords** -- both work. Job titles and company names on the site are not translated, so results are identical either way; only the site's own UI chrome changes language.
- **Enable `includeDetails`** only when you need the full description, employment type, or remote status. It adds one request per job.
- **Set `maxResults`** to control costs and runtime. Start small (10-50) to verify the output, then scale up.
- **Location is free text**, not a fixed list -- pass any Romanian city or region name (e.g. "Cluj-Napoca", "Timisoara", "Iasi") and it's matched the same way the site's own search box matches it.
- **Schedule runs** to track new listings daily or weekly using Apify's built-in scheduler.
- **Combine with other scrapers** to build a comprehensive Romanian job market dataset -- see our eJobs.ro scraper for a second major Romanian board.

### FAQ and support

#### Is it legal to scrape bestjobs.eu?

This scraper extracts only publicly available job listing data that any visitor can see without logging in. It does not access private data, bypass authentication, or violate GDPR. Always review the website's Terms of Service before large-scale scraping and ensure your use case complies with applicable Romanian and EU laws.

#### The scraper returns 0 results

- Make sure your search query matches actual job listings on bestjobs.eu. Try common keywords like "contabil", "programator", "vanzari".
- Try a broader search term or remove the location filter.
- The site may have changed its page structure -- if this persists, open an issue and we'll fix it.

#### Why is there no posted date field?

bestjobs.eu does not publish a posted/published date on either its listing cards or its job detail pages. This is a limitation of the source site, confirmed by direct inspection of the page data -- not a field the scraper failed to extract.

#### Can I get custom modifications?

Yes. If you need additional fields, different output formats, or integration with your systems, open an issue in the **Issues** tab or contact us for a custom solution.

#### How often should I run this scraper?

bestjobs.eu updates listings continuously. Running once daily or weekly is sufficient for most use cases. Use Apify's scheduler to automate recurring runs.

### Related Scrapers

Studio Amba runs scrapers across every major European jobs board. Related actors:

- **eJobs.ro Scraper** -- Romania's other major general jobs board
- **Jobs.cz Scraper** -- Czech jobs board
- **InfoJobs Scraper** -- Spanish jobs board
- **Jobbird Scraper** -- Dutch jobs board
- **JobTeaser Scraper** -- Pan-European graduate/student jobs board

### Maintained by Studio Amba

We run 700+ scrapers for European websites, and the priority is keeping every one of them working. Automated runs test this actor against the live site and verify the output is complete. When the website changes, the scraper usually gets repaired the same day, without you having to report it. If something looks wrong, open an issue and we'll take a look.

# Actor input Schema

## `searchQuery` (type: `string`):

Job keyword to search for, in Romanian or English (e.g. 'contabil', 'programator', 'inginer', 'marketing'). Defaults to 'jobs' (all listings) if left empty.

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

Optional city or region to narrow the search (e.g. 'Bucuresti', 'Cluj-Napoca', 'Timisoara'). Leave empty to search all locations.

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

Visit each job's detail page for the full description, benefits, employment type and spoken-language requirements. Slower: one extra request per job.

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

Maximum number of job listings to return.

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

Apify proxy settings. Default automatic (free) Apify proxy works for bestjobs.eu -- no residential needed.

## Actor input object example

```json
{
  "searchQuery": "contabil",
  "location": "Bucuresti",
  "includeDetails": false,
  "maxResults": 20,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

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

No 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 = {
    "searchQuery": "contabil",
    "location": "Bucuresti",
    "maxResults": 20,
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("studio-amba/bestjobs-eu-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 = {
    "searchQuery": "contabil",
    "location": "Bucuresti",
    "maxResults": 20,
    "proxyConfiguration": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("studio-amba/bestjobs-eu-scraper").call(run_input=run_input)

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

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

```

## CLI example

```bash
echo '{
  "searchQuery": "contabil",
  "location": "Bucuresti",
  "maxResults": 20,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}' |
apify call studio-amba/bestjobs-eu-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,studio-amba/bestjobs-eu-scraper"
        }
    }
}

```

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

## OpenAPI specification

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