Devex Job Search Scraper (No Login) + Open-Job Check
Pricing
from $0.05 / 1,000 job results
Devex Job Search Scraper (No Login) + Open-Job Check
$0.1/1K jobs | Search Devex NGO and international-development jobs by keyword and location with the full original description (text and HTML), or check whether Devex job URLs are still open. No login or API key. Not affiliated with Devex.
Pricing
from $0.05 / 1,000 job results
Rating
0.0
(0)
Developer
Nomad.Devs
Maintained by CommunityActor stats
0
Bookmarked
5
Total users
3
Monthly active users
5 days ago
Last modified
Categories
Share
$0.1/1K jobs | Search Devex NGO and international-development jobs by keyword and location with the full original description (text and HTML), or check whether Devex job URLs are still open. No login or API key. Not affiliated with Devex.
Devex Job Search and Open-Job Check
Our scraper searches Devex jobs in international development, NGOs and humanitarian aid by keyword, location and posting age. Every row carries the complete original description in text and HTML, the employer, locations and the application deadline. You can also paste Devex job URLs to check whether each one is still open. It is ideal for aid-sector job alerts, targeted searches and cleaning stale postings out of a job board.
- Want the newest Devex jobs, up to 50 per run, without a keyword? Use our Devex Jobs Scraper (No Login): Newest 50 NGO & Aid Jobs.
- Want UN and NGO jobs from another board? Our Impactpool Jobs Scraper reads Impactpool.
- Looking for humanitarian roles? Our ReliefWeb Humanitarian & NGO Jobs | Full Descriptions covers ReliefWeb.
- Browse all our job-board scrapers: https://apify.com/nomad-agent
Key Benefits
- No login or API key: nothing to set up, and no Devex account at risk.
- Pricing: $0.10 per 1,000 jobs, plus a $0.00005 run-start fee.
- Full descriptions only: a posting with a missing or truncated description is never returned.
How It Works
- Provide your search. Every filter is optional:
- (optional) Keyword (e.g.,
officer,policy analyst). Every term must appear in the job's listing card on Devex. - (optional) Location (e.g.,
Madrid). The text must appear in the listing card. - (optional) Posted within (e.g.,
24h,7d,2w). Default is7d.
- (optional) Keyword (e.g.,
- Set how many jobs you want with
maxItems, from 1 to 10. - Click Start. The form opens with
officer, the last 7 days and 10 jobs, so a first run returns real rows. In our test run, 10 jobs came back in about 24 seconds.
Run the same search again and you get only postings you have not received yet; set dedupe.enabled to false to see everything again.
More settings:
maxItems- How many jobs or open-job verdicts one run returns, from 1 to 10. Default is 3.jobUrls- Switches the run to an open-job check of exactly these Devex job URLs instead of a search.
A run returns up to 10 jobs. For up to 50 newest jobs without a keyword, use Devex Jobs Scraper (link above).
The open-job check (jobUrls) reads each Devex page live and needs Apify Residential proxy access; ordinary searches do not. Only exact Devex job URLs ending in a numeric job id are accepted.
Keyword and location are conservative filters over the text shown on the Devex listing card, so a result can match on a word that is not in its title.
This Actor does not suppress repeats across runs. Schedule it and compare each run's id values with what you already stored.
Data You'll Receive
- Job details: title, complete description (text and HTML), locations, posting date and application deadline (all present on every row in our test run).
- Employer: the organisation name as Devex shows it.
- Provenance:
custom.data.postedAtProvenancesays whetherpostedAtis a date Devex published or the hour we first observed the job. - Open-job check: for each URL you supply,
isActiveistrue,falseornullwhen the page does not say. - Terms:
workTypewasnullon all 10 rows in our test run. - Links and identity: the Devex job URL, plus a stable
idandsource.
Sample output data
Here is an example job from this Actor (long text shortened for display):
{"schemaVersion": "nomad-agent-job-row-v1","recordType": "posting","source": "devex","id": "1466176","url": "https://www.devex.com/jobs/internship-social-behavior-change-26-weeks-colombo-sri-lanka-sri-lankan-nationals-only-1466176","title": "Internship - Social & Behavior Change, 26 weeks, Colombo Sri Lanka (Sri Lankan nationals only)","company": "United Nations Children's Fund (UNICEF)","locations": ["Sri Lanka"],"postedAt": "2026-10-13T00:00:00Z","deadline": "2026-10-22","description": "Internship - Social & Behavior Change, 26 weeks, Colombo Sri Lanka (Sri Lankan nationals only)\n\nJob no: 595893\n\nContract type: Internship\n\nDuty Station: Colombo\n\nLevel: Internship\n\nLocation: Sri Lanka\n\nCategories: Social and Behavior Change… [truncated for display]","descriptionHtml": "<strong>Internship - Social & Behavior Change, 26 weeks, Colombo Sri Lanka (Sri Lankan nationals only)</strong>\n<p><strong>Job no:</strong> 595893<br/>\n<strong>Contract type:</strong> Internship<br/>\n<strong>Duty Station:</strong> Colom… [truncated for display]","workType": null,"custom": {"schemaId": "nomad-agent-job-custom-devex-v1","data": {"externalId": "1466176","descriptionContractVersion": "devex-complete-source-v4","postedAtProvenance": "listing_card"}}}
Devex Jobs API
Results are stored in a dataset that you can export as CSV, JSON or Excel, or read through the Apify API. Schedule it, or connect it to Make, n8n, Zapier or an MCP client to push new jobs wherever you need them.
Support and Feedback
We improve these scrapers from your feedback. If something breaks or you need a filter:
- Open an issue on the Actor's Issues tab.
- If this Actor saved you time, a short review on the Store helps other people find it.
Run evidence
Start with one input and output
An Apify account is required. Use your Apify API token when calling the API; Console runs do not need that token pasted into the input. No user API-key field is required by this input schema.
Free-tier event rates checked 2026-10-04: actor-start $0.00005; result $0.0001.
Cost: Total = Actor event charges + platform usage if separately billed + any BYO-provider charges. See “Current costs” for your event rates, plan tiers and a calculation. A sample does not promise future billable volume.
Input and output below were read from the same successful run SqcFbtP9rB1B30Ahy (2026-10-03, immutable build e6YwuJcEo0NZBsG2g). This is an observed example, not a guarantee that repeating it returns this row.
Input JSON
{"postedWithin": "7d","jobUrls": [],"maxItems": 3,"proxyConfiguration": {"useApifyProxy": true,"apifyProxyGroups": ["RESIDENTIAL"]}}
Matching output excerpt
Long strings and arrays are shortened for display; this is not a complete dataset fixture.
{"schemaVersion": "nomad-agent-job-row-v1","recordType": "posting","source": "devex","id": "1464153","url": "https://www.devex.com/jobs/program-manager-education-and-gedsi-1464153","title": "Program Manager – Education and GEDSI","company": "DT Global","locations": ["Phnom Penh"],"postedAt": "2026-10-02T00:00:00Z","deadline": "2026-10-23","description": "This position is open to experienced Cambodian professionals.\n\nProgram Background\n\nThe Department of Foreign Affairs and Trade (DFAT) through the Australian Embassy in Phnom Penh delivers Australia’s bilateral development cooperation program in Cambodia.\n\nThe program, Cambodia Development Support Unit (CDSU) provides technical support and advisory services t… [truncated for display]","descriptionHtml": "<p style=\"text-align:start;\"><span style=\"color: rgb(70,70,70);background-color: transparent;font-size: 14px;font-family: Roboto;\">This position is open to experienced Cambodian professionals.</span></p>\n<p style=\"text-align:unset;\"><span style=\"color: unset;background-color: unset;font-size: 13px;font-family: Roboto;\"><strong>Program Background</strong></sp… [truncated for display]","workType": null,"custom": {"schemaId": "nomad-agent-job-custom-devex-v1","data": {"externalId": "1464153","descriptionContractVersion": "devex-complete-source-v4","descriptionSourceUrl": "https://www.devex.com/jobs/program-manager-education-and-gedsi-1464153","descriptionComplete": true,"descriptionBoundaryFound": true,"descriptionBoundaryType": "jsonld-description","descriptionTail": "t our personnel and partners to always act in alignment with our company values.","descriptionHash": "sha256:d7277250e5460d1a0da8e35d6cc25d039d7cc4c4ebad28d3034b94121dcd9b9e","postedAtProvenance": "source_metadata","deliveredFrom": "inventory"}}}
Search available Devex job postings with verified complete original descriptions. An explicit jobUrls alive check checks the supplied public job URLs live. No model or user-provided API key is used.
The Actor reads unauthenticated public pages. It does not use a Devex login, paywall access, CAPTCHA bypass, or an authenticated Devex session.
Where records come from
Ordinary searches return available complete job postings as deliveredFrom: "inventory" rows. A search with no matching postings returns no postings. Unavailable or stale job data produces a diagnostic without substituting live search results.
An alive check (jobUrls) verifies current availability. A previously observed record does not prove that the posting is still open.
Cached rows carry descriptionContractVersion: "devex-complete-source-v4".
v4 guarantees exactly what v3 does — a complete, untruncated body that ends
where the source narrative ends — and adds one further proof mechanism:
jsonld-description, where Devex itself declares the whole narrative in
JSON-LD, so its own end is the boundary. On that boundary
descriptionMetadataChildFound and descriptionMetadataLabelLineFound are
null, because the DOM metadata-child question does not apply. Live rows keep
emitting v3 and are still held to the v3 rules exactly.
Posted dates and their provenance
Devex publishes a posting date on some jobs and none at all on others. Every
row now says which case it is, in postedAtProvenance:
| Value | postedAt means |
|---|---|
source_metadata | The Devex detail page published this date. |
listing_card | The Devex listing card published it; the detail page did not. |
inventory_admission | Devex published no date. This is the hour the job was first observed — a collection timestamp, not a posting date. |
No date is ever invented, and relative phrases such as "3 days ago" are never
converted into one. Filter on postedWithin knowing that an
inventory_admission value records first collection; the job may have been
published earlier.
Live alive-check description contract
When jobUrls requests a live check, the source page is accepted only when
all of these checks pass:
descriptionis exact live[data-partial="job-description"]innerTextunder one of two source-owned proofs: when a recognized top-level metadata child exists, it is the exact prefix ending immediately before that rendered label; when none exists, it is the entire selector-nodeinnerText.- A recognized metadata child that cannot be located as a rendered line rejects the page. It never falls back to selector-node-end.
- The section contains at least 500 characters and begins
Job Description. descriptionContractVersionisdevex-complete-source-v3.descriptionSourceUrlnormalizes to the same canonical URL asurl.descriptionCompleteis exactlytrue.descriptionBoundaryFoundis exactlytrueand the proof fields agree:top-level-source-metadatauses a recognized label plusdescriptionMetadataChildFound=trueanddescriptionMetadataLabelLineFound=true;selector-node-enduses the stableEND_OF_SELECTOR_NODElabel with both booleansfalse. A selector-end body containing a standalone recognized metadata label is independently rejected by the caller even if its evidence fields claim otherwise.descriptionTailexactly matches the final 80 source characters.descriptionHashis the SHA-256 of the exact description string.- The description is not the listing-card snippet, does not end in an isolated
dangling word fragment, and has no ellipsis,
truncated,read more, or equivalent clipping marker at its end. - HTTP status/redirect, challenge title/body, Career Account paywall, or a missing source selector rejects the detail page.
FindJobs independently repeats these checks before mapping a record into a job. A failed contract becomes a source error, not a healthy empty result.
Input
{"keyword": "migration policy","location": "remote","postedWithin": "7d","maxItems": 3}
postedWithin uses the shared job-search values 1h, 24h, 7d, 30d, and
any; the default is 7d. Selected windows use source dates when available,
or the preserved first-admission timestamp when Devex supplied no date.
custom.data.postedAtProvenance distinguishes the two; admission freshness
means first collection, not recent source publication. any also keeps unknown
dates eligible. Source calendar dates use day buckets: 24h includes the
current and previous UTC date, and 1h stays closed for date-only records.
Provenance-labelled timestamps use their stored time precision.
maxItems is caller-controlled from 1 to 10 (default: 3). Keyword and location
are conservative filters over source-supplied facts. Supplying jobUrls switches
to a live alive check; only exact numeric-id detail URLs are accepted, while
query and subpath URLs are rejected before navigation. That diagnostic mode
requires Residential proxy access.
Alive status is independent of description completeness. An explicit visible
Devex closed/expired message yields false even if an apply-looking control is
also present. An independently visible enabled apply control yields true.
When neither signal exists, isActive is null rather than guessed from page
existence.
Output
This Actor's job rows follow nomad-agent-job-row-v1. Each job row carries
every posting field; null means the source did not publish that fact, and
locations: [] means no
usable location was parsed from the posting. Nothing is guessed.
{"schemaVersion": "nomad-agent-job-row-v1","recordType": "posting","source": "devex","id": "1234567","url": "https://www.devex.com/jobs/example-role-1234567","title": "Senior Backend Engineer","company": "Example Company","locations": ["Bilbao","Spain"],"postedAt": "2026-09-02T00:00:00Z","deadline": "2026-10-15","description": "The complete posting body as plain text, exactly as the source published it — never truncated.","descriptionHtml": "<p>The complete posting body as the source's own markup.</p>","workType": "remote","custom": {"schemaId": "nomad-agent-job-custom-devex-v1","data": {"externalId": "1234567","descriptionContractVersion": "devex-complete-source-v4","descriptionSourceUrl": "https://www.devex.com/jobs/example-role-1234567"}}}
| Field | Meaning |
|---|---|
schemaVersion | Always "nomad-agent-job-row-v1". |
recordType | "posting" for a job, "diagnostic" for a row reporting something about the run itself. |
source | Which job source the posting came from, using the documented source vocabulary — not the Actor name. |
id | Stable identifier for the posting within source. |
url | Canonical public URL of the posting on the source site. |
title | Job title exactly as the source publishes it, untruncated. |
company | Employer name as published. |
locations | Places the role is based, most specific first — e.g. ["Bilbao", "Spain"]. |
postedAt | Source publication time when available; otherwise the original first-observed hour. See custom.data.postedAtProvenance. |
deadline | Closing date for applications as an ISO-8601 calendar date (YYYY-MM-DD). |
description | The complete posting body as plain text — never truncated, never summarised. |
descriptionHtml | The posting body as the source's own markup, preserving lists, headings and links. |
workType | Working arrangement: "remote", "hybrid" or "onsite". |
custom | Facts only this source publishes, as {"schemaId", "data"}. |
A run also emits diagnostic rows — recordType: "diagnostic" with a
warnings array — when it has something to report, such as a source
returning nothing. They are never billed and are easy to filter out on
recordType.
Diagnostics and charging
Unavailable job data produces a warning row and no Actor-start charge. Live alive checks require Residential access and exit before that charge if it is unavailable. Job records are charged only after they pass the complete description contract and are pushed. Treat warning-only datasets as failures rather than empty search results.
Transport diagnostics are bounded and non-sensitive: they record whether an HTTP response existed, its status, the canonical/raw final-URL class, safe Devex host/path/query flags, and proxy scheme/hostname/port/username class plus password presence. Proxy passwords, session identifiers, and query contents are never logged or emitted.
No deployment, live canary, billing verification, or Store publication is implied by this repository version.
Fast setup and source code
Public repository · Agent setup skill.
Use the Actor’s current input form for filters, or start with its documented API example. Select the latest build. Read the dataset together with the run summary: a successful status alone does not show that every source was reached.
Restrictive filters or repeat-delivery suppression can produce zero results.
Observed output example
Selected fields from a real source record inspected on 2026-10-03; consult the output schema for the full contract. Values change with the source.
{"source": "devex","id": "1399946","externalId": "1399946","url": "https://www.devex.com/jobs/public-information-intern-1399946","isActive": false,"checkedAt": "2026-09-16T14:43:12.064589+00:00","title": null,"company": null,"postedAt": null,"snippet": null}
Product guides and related tools
- Guide and starter input on nomadagent.dev
- Product overview and public links
- Public setup guide
- Job Atlas job-data tools
- Oink personal job alerts
- Ghost jobs: how to check a listing is still open
Current costs
Current Actor event rates, checked 2026-10-04. USD; use the Pricing tab for your plan and later changes.
| Event | Free | Bronze | Silver | Gold | Platinum | Diamond |
|---|---|---|---|---|---|---|
Actor start (actor-start) | $0.00005 | $0.00005 | $0.00005 | $0.00005 | $0.00005 | $0.00005 |
Job result (result) | $0.0001 | $0.0001 | $0.0001 | $0.0001 | $0.0001 | $0.0001 |
For example, 1 × actor-start, 100 × result totals $0.01005 in Actor event charges on Free. This is an arithmetic example, before any waiver; actual charged events depend on the run and selected options. It is not a promise of output or a charge for simply setting an item cap.
Your total is the charged Actor events, plus platform usage only if this Actor’s Pricing tab bills it separately, plus any external provider you use with your own key. Do not add platform usage twice when it is included. Apify credits and plan discounts affect your invoice. Set a run cost limit in Console before starting.
Independent tool. We built and run this Actor ourselves. Devex does not operate, sponsor or endorse it, and its name is used only to say which site the data comes from.