# Impactpool Jobs Scraper — UN & NGO Careers (`nomad-agent/impactpool-scraper`) Actor

Scrape UN, NGO and international-development jobs from Impactpool.org — the impact-sector careers board (UN agencies, world bank, INGOs, EU institutions). Get title, organisation, duty station and apply URL, plus optional application deadline and full description. Delta mode powers job-alert bots.

- **URL**: https://apify.com/nomad-agent/impactpool-scraper.md
- **Developed by:** [Nomad.Dev](https://apify.com/nomad-agent) (community)
- **Categories:** Jobs
- **Stats:** 8 total users, 4 monthly users, 77.8% 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

## Impactpool Jobs Scraper — UN & NGO Careers

Fetch mission-driven vacancies from Impactpool.org — an NGO jobs board covering UN agencies, world bank / development bank roles, INGOs, EU institutions and social-impact / international-development careers.

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

### What Impactpool data does this scraper extract?

Each result is one flat JSON record per job posting:

| Field | Meaning |
|---|---|
| `id` | Stable source-side identifier (ImpactPool job ID) |
| `title` | Job title as posted |
| `company` | Hiring organisation |
| `location` | Duty station / location (defaults to "Worldwide" when the card doesn't list one) |
| `seniority` | Seniority level as shown on the card (e.g. "Senior - Senior level") |
| `url` | Direct link to the posting |
| `snippet` | Organisation — location — seniority, joined as a short summary line |
| `postedAt` | Posting date — always `null` (ImpactPool publishes none; kept for schema parity) |
| `deadline` | Application/closing date (ISO `YYYY-MM-DD` when parseable) — **requires `includeDetails`** |
| `description` | Full job description text, HTML-stripped — **requires `includeDetails`** |
| `organizationUrl` | Hiring organisation's ImpactPool profile page — **requires `includeDetails`** |
| `organizationId` | ImpactPool's internal organisation id — **requires `includeDetails`** |
| `source` | Always `"impactpool"` |

The last five fields are `null` on a fast listing-only run. Turn on **Include full details** (`includeDetails`) to fetch each returned posting's detail page and fill in the application `deadline`, the full `description`, and the hiring organisation's profile URL/id. Enrichment is bounded to the postings you actually receive (after filters and `maxItems`), and if any single detail page fails the posting is still returned with its listing fields. ImpactPool publishes no *posting* date anywhere, so `postedAt` is always `null`.

### How to scrape Impactpool 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/impactpool-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~impactpool-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 to bias results toward specific roles, sectors or topics (e.g. "policy", "programme manager", "migration", "consultant"). Leave empty to return the latest global feed. |
| `locationFilter` | string | `""` | Only keep postings whose location/duty station text contains this (case-insensitive). Applied after fetching, on top of the keyword search. Leave empty to keep all locations. |
| `maxItems` | integer | `40` | Maximum number of openings to return, across as many pages as it takes; billed per result returned. Set 0 to keep every posting the search returns (bounded by an internal safety cap on pages fetched). |
| `includeDetails` | boolean | `false` | Fetch each returned posting's detail page to add `deadline`, full `description`, and `organizationUrl`/`organizationId`. Adds one extra request per returned job; cost is bounded to the postings you actually receive. Fails open per posting. |
| `onlyNewSinceLastRun` | boolean | `false` | Delta / monitoring mode: return only postings not already delivered by a previous run of this Actor. Already-seen jobs are dropped before they're fetched or billed — ideal for scheduled job-alert bots. |
| `resetSeenJobs` | boolean | `false` | Clear the remembered set of already-seen jobs before this run (every current posting counts as new). Only meaningful with `onlyNewSinceLastRun`. |
| `cacheTtlSeconds` | integer | `1800` | *(Advanced)* Reuse the last fetched page for this many seconds instead of contacting ImpactPool again, so quick repeat runs are faster and cheaper. Set 0 to always fetch a fresh page. |

### Output example

With `includeDetails` enabled:

```json
{
  "id": "1223429",
  "title": "Head of Office / Local Representative - KfW Office in Antananarivo (Madagascar)",
  "company": "KfW Banque de Développement",
  "location": "Antananarivo",
  "seniority": "Senior Executive - Senior Executive level",
  "url": "https://www.impactpool.org/jobs/1223429",
  "snippet": "KfW Banque de Développement — Antananarivo — Senior Executive - Senior Executive level",
  "postedAt": null,
  "deadline": "2026-07-17",
  "description": "Since 1948, KfW has been committed to improving economic, social, and environmental living conditions worldwide...",
  "organizationUrl": "https://www.impactpool.org/organizations/36051/kfw-entwicklungsbank",
  "organizationId": "36051",
  "source": "impactpool"
}
```

On a listing-only run (`includeDetails` off), `deadline`, `description`, `organizationUrl` and `organizationId` are `null`.

### Pricing

Pay per event: **$0.005 per Actor start** and **$0.007 per job returned**.
100 jobs ≈ $0.705. No subscription, no rental — you pay only for what you fetch.

### Integrations

Export the dataset as JSON, CSV or Excel from the Console, pull it over the [Apify API](https://docs.apify.com/api/v2) (including `run-sync-get-dataset-items` for a single blocking call), wire it into Make/Zapier/n8n, or drive it from an AI agent via the [Apify MCP server](https://apify.com/apify/actors-mcp-server).

### Use cases

- Impact-sector job boards and alert bots
- Career coaching for international-development careers
- Fellowship and JPO tracking
- Diversity of duty-station analysis

### FAQ

**Is it legal to scrape Impactpool?**
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).

**Can I get only new jobs on a schedule?**
Yes. Turn on `onlyNewSinceLastRun` and schedule the Actor: each run returns only postings it hasn't delivered before, so a job-alert bot pays only for genuinely new openings. Use `resetSeenJobs` once to start the history fresh.

**How many jobs can I get?**
This Actor pages through ImpactPool's search results (roughly 40 postings per page) until it has `maxItems` postings or the listing runs out. `maxItems` trims the result count if you want fewer; `locationFilter` narrows further.

**Something broken or missing?**
Open an issue on the Actor's **Issues** tab — it is monitored and reliability fixes ship fast.

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

### Related Actors — the full UN / NGO jobs stack

All siblings share the same flat record shape and a delta mode built for job-alert bots — no other UN/NGO-sector scraper on Apify offers an incremental mode:

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

***

**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 to bias results toward specific roles, sectors or topics (e.g. <code>policy</code>, <code>programme manager</code>, <code>migration</code>, <code>consultant</code>). Leave empty to return the latest global feed.

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

Only keep postings whose location/duty station text contains this (case-insensitive). Applied after fetching, on top of the keyword search. Leave empty to keep all locations.

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

Maximum number of openings to return, paging through the search listing as needed; you're billed per result returned. Set 0 to keep every posting the search returns (bounded by an internal safety cap on pages fetched). Values outside 0–1000 are clamped, never rejected.

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

Fetch each returned posting's detail page to add the application <b>deadline</b>, the full job <b>description</b>, and the hiring organisation's ImpactPool profile URL/id. On by default — the listing card alone is too thin to be useful. This adds one extra request per returned job, bounded to the postings you actually receive (after filters and <code>maxItems</code>). Turn off for a lighter listing-only pull. If a detail page yields no usable body, that posting is dropped and retried on the next run.

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

Return only postings not already delivered by a previous run of this Actor. Ideal for scheduled monitoring / job-alert bots: already-seen jobs are dropped before they're fetched or billed, so you pay only for genuinely new openings. Seen job ids are remembered in the Actor's key-value store across runs.

## `resetSeenJobs` (type: `boolean`):

Clear the remembered set of already-seen jobs before this run, so delta mode starts from a clean slate (every current posting counts as new). Only meaningful together with <b>Only new since last run</b>.

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

Reuse the last fetched page for this many seconds instead of contacting ImpactPool again, so quick repeat runs are faster and cheaper. Set 0 (or any negative value) to always fetch a fresh page.

## Actor input object example

```json
{
  "keyword": "policy research",
  "locationFilter": "Geneva",
  "maxItems": 40,
  "includeDetails": true,
  "onlyNewSinceLastRun": false,
  "resetSeenJobs": false,
  "cacheTtlSeconds": 1800
}
```

# 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/impactpool-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/impactpool-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/impactpool-scraper --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/6gD1RdMPm0CqH9Qv4/builds/1LcfflL6KdL2w3JdA/openapi.json
