# EURACTIV Jobs | Normalized (`nomad-agent/normalized-euractiv-jobs-scraper`) Actor

Unofficial independent Actor for bounded public EURACTIV Jobs searches. Returns strict normalized records with source links, descriptions, dates, locations, compensation when published, and application details.

- **URL**: https://apify.com/nomad-agent/normalized-euractiv-jobs-scraper.md
- **Developed by:** [Nomad Dev](https://apify.com/nomad-agent) (community)
- **Categories:** Jobs
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

Pay per usage

This Actor is paid per platform usage. The Actor is free to use, and you only pay for the Apify platform usage, which gets cheaper the higher subscription plan you have.

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

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.

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

## How to integrate an Actor?

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

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

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

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

# README

## EURACTIV Jobs | Normalized

Search public EURACTIV Jobs job listings and export consistent, automation-ready records. This is an unofficial independent Actor. It is not affiliated with, endorsed by, or operated by EURACTIV Jobs, and its icon does not use third-party branding.

### What you get

Each dataset item follows `nomad-agent-job-v1` and keeps the original posting identity and canonical URL. When the source publishes them, the Actor captures the full description, posting and deadline dates, location, work arrangement, salary, availability, and application link. Missing source facts stay `null`; they are not guessed.

The run is deliberately bounded. It uses only the board identifiers, search phrase, or listing URLs you provide and never discovers employers or performs a global crawl. A blocked source, incomplete detail page, verified empty search, deadline, and successful run remain distinct in the `RUN-SUMMARY` record.

### First run

The Store input is prefilled with this stateless five-item example:

```json
{
  "schemaVersion": "nomad-agent-job-search-input-v1",
  "maxItems": 5,
  "dedupe": {
    "enabled": false,
    "key": ""
  },
  "euractiv": {
    "schemaVersion": "nomad-euractiv-search-v1",
    "q": "policy",
    "pageLimit": 1
  }
}
```

From this Actor directory, the same input can be run with:

```sh
apify run --purge --input '{"schemaVersion":"nomad-agent-job-search-input-v1","maxItems":5,"dedupe":{"enabled":false,"key":""},"euractiv":{"schemaVersion":"nomad-euractiv-search-v1","q":"policy","pageLimit":1}}'
```

### Output

Results are written to the default dataset. The default key-value store contains `RUN-SUMMARY`, including terminal status, source counts, delivery count, result-limit status, retry guidance, and bounded error codes.

An abridged dataset item looks like this:

```json
{
  "schemaVersion": "nomad-agent-job-v1",
  "identity": {"source": "euractiv", "externalId": "source-specific-id", "url": "https://source.example/jobs/123"},
  "data": {
    "title": "Software Engineer",
    "company": {"name": "Example employer"},
    "locations": [{"raw": "Remote"}],
    "application": {"url": "https://source.example/jobs/123", "postedAt": "2026-09-14T09:00:00+00:00"},
    "compensation": {"currency": "EUR", "minimum": 70000, "maximum": 90000}
  },
  "custom": {"schemaId": "nomad-euractiv-source-v1"},
  "llm": null,
  "raw": {"description": "Source-published description evidence"}
}
```

The Store sample output is selected from the successful first-run dataset and therefore contains the complete schema-valid record rather than this shortened illustration.

### Repeat-delivery suppression

The Store's first run sets `dedupe.enabled` to `false`, so it is stateless and immediately reusable. When enabled, the Actor uses an atomic persistent ledger with short delivery claims and confirmed tombstones. The scope includes the Apify user ID, Actor, and canonical search, so tenants never share history. A non-empty `dedupe.key` lets one tenant deliberately share history across related searches. Confirmed deliveries are retained for 365 days; known dataset failures release their claims, while ambiguous delivery or ledger outcomes fail the run instead of claiming clean success.

### Limits and pricing

`maxItems` is capped at 200; zero also means 200. Public requests and detail work have finite request and time budgets. The initial Store model is pay per platform usage: there are no hidden per-result or pay-per-event charges in the Actor code.

Source sites can change without notice. Check `RUN-SUMMARY` and the original application URL before using a record in production.

# Actor input Schema

## `schemaVersion` (type: `string`):

Required version marker for the normalized job-search input.

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

Stops source detail work and output at this bound. Zero means 200.

## `postedWithin` (type: `string`):

Keep jobs with a source-published date inside this window. Use any when a missing source date should remain eligible.

## `workArrangements` (type: `array`):

Optional remote, hybrid, or onsite filter; empty means all.

## `includeRaw` (type: `boolean`):

Include the bounded source evidence retained in each normalized row.

## `dedupe` (type: `object`):

Suppress confirmed repeat deliveries for the same Apify user and search. Disable it for a stateless run.

## `euractiv` (type: `object`):

A bounded keyword search of public EURACTIV Jobs jobs.

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

Optional top-level search phrase. The source object's q value takes precedence when both are present.

## Actor input object example

```json
{
  "schemaVersion": "nomad-agent-job-search-input-v1",
  "maxItems": 5,
  "postedWithin": "any",
  "workArrangements": [],
  "includeRaw": true,
  "dedupe": {
    "enabled": false,
    "key": ""
  },
  "euractiv": {
    "schemaVersion": "nomad-euractiv-search-v1",
    "q": "policy",
    "pageLimit": 1
  }
}
```

# Actor output Schema

## `dataset` (type: `string`):

No description

## `runSummary` (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 = {
    "schemaVersion": "nomad-agent-job-search-input-v1",
    "maxItems": 5,
    "postedWithin": "any",
    "workArrangements": [],
    "includeRaw": true,
    "dedupe": {
        "enabled": false,
        "key": ""
    },
    "euractiv": {
        "schemaVersion": "nomad-euractiv-search-v1",
        "q": "policy",
        "pageLimit": 1
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("nomad-agent/normalized-euractiv-jobs-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 = {
    "schemaVersion": "nomad-agent-job-search-input-v1",
    "maxItems": 5,
    "postedWithin": "any",
    "workArrangements": [],
    "includeRaw": True,
    "dedupe": {
        "enabled": False,
        "key": "",
    },
    "euractiv": {
        "schemaVersion": "nomad-euractiv-search-v1",
        "q": "policy",
        "pageLimit": 1,
    },
}

# Run the Actor and wait for it to finish
run = client.actor("nomad-agent/normalized-euractiv-jobs-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 '{
  "schemaVersion": "nomad-agent-job-search-input-v1",
  "maxItems": 5,
  "postedWithin": "any",
  "workArrangements": [],
  "includeRaw": true,
  "dedupe": {
    "enabled": false,
    "key": ""
  },
  "euractiv": {
    "schemaVersion": "nomad-euractiv-search-v1",
    "q": "policy",
    "pageLimit": 1
  }
}' |
apify call nomad-agent/normalized-euractiv-jobs-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,nomad-agent/normalized-euractiv-jobs-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/r9QX393fOiLyU6ZWr/builds/ipOUyILbrJPGTSksA/openapi.json
