# UN Careers Job Scraper — United Nations Jobs (`nomad-agent/un-careers-scraper`) Actor

Get live UN Secretariat job openings from careers.un.org: title, department, duty station, level, category, job family, network, deadline and apply URL. Filter by keyword, category, job family, network, duty station, or run delta mode for only-new postings. No login, no setup.

- **URL**: https://apify.com/nomad-agent/un-careers-scraper.md
- **Developed by:** [Nomad.Dev](https://apify.com/nomad-agent) (community)
- **Categories:** Jobs
- **Stats:** 7 total users, 5 monthly users, 70.2% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $4.50 / 1,000 job results

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

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

## What's an Apify Actor?

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

## How to integrate an Actor?

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

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

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

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

# README

## UN Careers Job Scraper — United Nations Jobs

Fetch current United Nations vacancies from careers.un.org with server-side filters for category, job family, network and keyword.

> **Claude / Codex skill to describe and setup this actor: [SKILL.md](https://github.com/Exdenta/OinkAIJobSearch/blob/main/skill/un-careers-scraper/SKILL.md)**

### What UN careers data does this scraper extract?

Each result is one flat JSON record per job posting:

| Field | Type | Description |
|---|---|---|
| `jobId` | string | Stable source-side identifier for the posting |
| `title` | string | Job title as posted |
| `company` | string | Hiring organisation (always "United Nations") |
| `department` | string | Hiring department/office (e.g. "Department of Operational Support") |
| `location` | string | Duty station |
| `category` | string | Staff category name (e.g. "Professional and Higher") |
| `categoryCode` | string | Staff category code (e.g. "PD") — see the `categories` input for the full list |
| `jobFamily` | string | Functional area name (e.g. "Programme Management") |
| `jobFamilyCode` | string | Functional area code (e.g. "PGM") — see the `jobFamilies` input for the full list |
| `network` | string | High-level job network name (e.g. "Political, Peace and Humanitarian") |
| `networkCode` | string | Job network code (e.g. "POLNET") — see the `networks` input for the full list |
| `level` | string | Job level / grade (e.g. "P-3") |
| `recruitmentType` | string | Recruitment type as posted (e.g. "Staff") |
| `postedAt` | string | Posting start date (ISO 8601, e.g. "2026-06-25") |
| `deadline` | string | Application deadline date (ISO 8601) |
| `url` | string | Direct link to the posting |
| `isNew` | boolean | Only present when `onlyNewSinceLastRun` is on — always `true` (already-seen postings are dropped, never emitted with `isNew: false`) |
| `description` | string | Full plain-text job description (omitted when `includeDescription` is `false`) |

### How to scrape UN careers with this Actor

1. Click **Try for free** / **Run** — no login to the target site, no cookies, no proxies to configure.
2. Adjust the input (keyword, filters, `maxItems`) or keep the defaults.
3. Run it and export the dataset as JSON, CSV or Excel, or read it over the [API](https://docs.apify.com/api/v2).

Run it from your own code:

```python
from apify_client import ApifyClient

client = ApifyClient("<YOUR_APIFY_TOKEN>")
run = client.actor("nomad-agent/un-careers-scraper").call(run_input={"maxItems": 50})
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item["title"], "—", item["company"], item["url"])
```

Or a single HTTP call that runs the Actor and returns items in one response:

```bash
curl -X POST \
  "https://api.apify.com/v2/acts/nomad-agent~un-careers-scraper/run-sync-get-dataset-items?token=<YOUR_APIFY_TOKEN>" \
  -H "Content-Type: application/json" \
  -d '{"maxItems": 50}'
```

### Input

| Field | Type | Default | Notes |
|---|---|---|---|
| `keyword` | string | `""` | Free-text search across job titles and descriptions (e.g. "data engineer", "human rights"). Leave empty to… |
| `categories` | array | `""` | Staff category. Leave empty for all. |
| `jobFamilies` | array | `""` | Functional area. Leave empty for all. |
| `networks` | array | `""` | High-level job network. Leave empty for all. |
| `locationFilter` | string | `""` | Optional case-insensitive substring match on duty station, applied client-side (the API has no server-side… |
| `maxItems` | integer | `100` | Maximum number of openings to return. Set 0 for no limit (all matching openings). |
| `includeDescription` | boolean | `true` | Include the full plain-text job description in each result. Turn off for lighter, faster output. |
| `sortDirection` | string | `"newest"` | Order openings by posting start date. |
| `cacheTtlSeconds` | integer | `1800` | Cache the upstream fetch in the key-value store for this many seconds; re-runs within the window skip the… |
| `onlyNewSinceLastRun` | boolean | `false` | Delta / monitoring mode: only output openings not seen on a previous flagged run. See **Delta mode / monitoring** below. |

### Output example

```json
{
  "jobId": "243519",
  "title": "Programme Management Officer",
  "company": "United Nations",
  "department": "Department of Political and Peacebuilding Affairs",
  "location": "Geneva",
  "category": "Professional and Higher",
  "categoryCode": "PD",
  "jobFamily": "Programme Management",
  "jobFamilyCode": "PGM",
  "network": "Political, Peace and Humanitarian",
  "networkCode": "POLNET",
  "level": "P-3",
  "recruitmentType": "Staff",
  "postedAt": "2026-06-25",
  "deadline": "2026-07-24",
  "url": "https://careers.un.org/jobSearchDescription/243519?language=en",
  "description": "Full plain-text job description..."
}
```

### Delta mode / monitoring

Turn on `onlyNewSinceLastRun` to get only openings that weren't already returned by a previous run with the flag on — ideal for a cron schedule or an alert bot that should pay only for genuinely new UN vacancies.

How it works: delivered postings are remembered in a dedicated key-value store, keyed by each posting's `jobId`, capped at ~50,000 entries (oldest evicted first). The first run with the flag on has nothing to compare against, so it emits everything — all `isNew: true`. Every emitted record gets `isNew: true` stamped on it; there is no `isNew: false`, since already-seen postings are simply dropped before push (and never billed). The state store is best-effort: if it can't be read, the run degrades to "everything is new" rather than failing.

### Pricing

Pay per event: **$0.005 per Actor start** and **$0.006 per job returned**.
100 jobs ≈ $0.605. The whole portal is ~480 open vacancies, so even an uncapped
run (`maxItems: 0`) tops out around **$3**. No subscription, no rental — you pay
only for what you fetch.

### Use cases

- International-career job boards and alert bots
- NGO / IGO career coaching services
- Research on UN hiring by duty station or job family
- Deadline tracking for UN applicants

### FAQ

**Is it legal to scrape UN careers?**
This Actor reads only publicly available job postings — data any visitor can see without logging in. No personal data behind authentication is touched. Review the target site's terms and your local regulations for your specific use case.

**Do I need an account on the target site?**
No. Postings are fetched from public pages/APIs — no login, cookies or session tokens.

**How fresh is the data?**
Every run fetches live listings. Results are cached for `cacheTtlSeconds` (default 30 min, set 0 to always hit the source live).

**How many jobs can I get?**
`maxItems` caps the run (set 0 where supported for no cap). Most sources paginate from newest to oldest.

**Can I filter UN jobs by duty station?**
Yes — pass locationFilter (e.g. "geneva", "nairobi"). It is applied as a case-insensitive substring match on the duty station.

**Does this cover UNICEF, WHO, UNDP, UNHCR, IMF or World Bank jobs?**
This Actor covers the **UN Secretariat** via its official portal, careers.un.org — the departments, offices, peace operations and regional commissions that recruit through that system. Several UN specialized agencies and international financial institutions (UNICEF, WHO, UNDP, UNHCR, IMF, the World Bank) run their **own** separate application systems, so their vacancies are not on careers.un.org. Many of those agencies' openings are aggregated by our sibling Actors — see **Related Actors** below (Impactpool, ReliefWeb, Devex) — so you can cover the wider UN / NGO / international-organization job market with the same fleet. You can also pass a `keyword` (e.g. "UNICEF", "WHO") to surface UN Secretariat postings that reference those partners.

**Can I run it on a schedule and only get new jobs?**
Yes — turn on `onlyNewSinceLastRun` (see **Delta mode / monitoring**). Combined with Apify Schedules, you only pay for genuinely new UN vacancies each run.

**Something broken or missing?**
Open an issue on the Actor's **Issues** tab — it is monitored and reliability fixes ship fast. If this Actor saves you time, a short review on the Store listing helps other UN job-seekers and researchers find it.

**Is this Actor useful to you?**
A quick ⭐ review on the Actor's **Reviews** tab helps other UN and international-org job seekers find it — and tells us what to build next.

### Related Actors

- [UNjobs Scraper — unjobs.org UN Vacancies](https://apify.com/nomad-agent/unjobs-scraper)
- [Research & Academic Jobs Scraper — 10 Sources](https://apify.com/nomad-agent/researcher-bundle)
- [ReliefWeb Jobs Scraper — Humanitarian & NGO](https://apify.com/nomad-agent/reliefweb-scraper)
- [Impactpool Jobs Scraper — UN & NGO Careers](https://apify.com/nomad-agent/impactpool-scraper)
- [Devex Jobs Scraper — International Development](https://apify.com/nomad-agent/devex-scraper)

***

**From the maker of [Oink](https://github.com/Exdenta/OinkAIJobSearch)** — an open-source, AI-powered job-search bot for Telegram that runs on these Actors. [Try the free bot](https://t.me/job_search_everyday_bot), get a managed instance at [oinkjobsearch.com](https://oinkjobsearch.com), or browse the [full catalog of 50+ Actors](https://apify.com/nomad-agent).

# Actor input Schema

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

Free-text search across job titles and descriptions (e.g. <code>data engineer</code>, <code>human rights</code>). Leave empty to return all current openings.

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

Staff category. Leave empty for all.

## `jobFamilies` (type: `array`):

Functional area. Leave empty for all.

## `networks` (type: `array`):

High-level job network. Leave empty for all.

## `locationFilter` (type: `string`):

Optional case-insensitive substring match on duty station, applied client-side (the API has no server-side location filter). E.g. <code>geneva</code>, <code>new york</code>, <code>nairobi</code>.

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

Maximum number of openings to return. Set 0 for no limit — returns every matching opening. careers.un.org carries roughly 480 vacancies in total, so at $0.006 per result an uncapped run costs about $3 and finishes in under a minute.

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

Include the full plain-text job description in each result. Turn off for lighter, faster output.

## `sortDirection` (type: `string`):

Order openings by posting start date.

## `cacheTtlSeconds` (type: `integer`):

Cache the upstream fetch in the key-value store for this many seconds; re-runs within the window skip the network call. Set 0 to disable.

## `onlyNewSinceLastRun` (type: `boolean`):

Delta / monitoring mode: only output openings not seen on a previous run that also had this flag on. Already-seen postings are dropped before push (never billed), so this is the cheapest way to run this Actor on a schedule and only pay for genuinely new UN vacancies. State is tracked per Actor in a dedicated key-value store, keyed by each posting's <code>jobId</code>. The first delta run has nothing to compare against, so it emits everything. See README “Delta mode / monitoring”.

## Actor input object example

```json
{
  "keyword": "data analyst",
  "locationFilter": "geneva",
  "maxItems": 100,
  "includeDescription": true,
  "sortDirection": "newest",
  "cacheTtlSeconds": 1800,
  "onlyNewSinceLastRun": false
}
```

# Actor output Schema

## `dataset` (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 = {};

// Run the Actor and wait for it to finish
const run = await client.actor("nomad-agent/un-careers-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 = {}

# Run the Actor and wait for it to finish
run = client.actor("nomad-agent/un-careers-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 '{}' |
apify call nomad-agent/un-careers-scraper --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

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