Devex Job Search Scraper (No Login) + Open-Job Check avatar

Devex Job Search Scraper (No Login) + Open-Job Check

Pricing

from $0.05 / 1,000 job results

Go to Apify Store
Devex Job Search Scraper (No Login) + Open-Job Check

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

Nomad.Devs

Maintained by Community

Actor 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.

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

  1. 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 is 7d.
  2. Set how many jobs you want with maxItems, from 1 to 10.
  3. 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.postedAtProvenance says whether postedAt is a date Devex published or the hour we first observed the job.
  • Open-job check: for each URL you supply, isActive is true, false or null when the page does not say.
  • Terms: workType was null on all 10 rows in our test run.
  • Links and identity: the Devex job URL, plus a stable id and source.

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 &amp; 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:

ValuepostedAt means
source_metadataThe Devex detail page published this date.
listing_cardThe Devex listing card published it; the detail page did not.
inventory_admissionDevex 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:

  • description is exact live [data-partial="job-description"] innerText under 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-node innerText.
  • 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.
  • descriptionContractVersion is devex-complete-source-v3.
  • descriptionSourceUrl normalizes to the same canonical URL as url.
  • descriptionComplete is exactly true.
  • descriptionBoundaryFound is exactly true and the proof fields agree: top-level-source-metadata uses a recognized label plus descriptionMetadataChildFound=true and descriptionMetadataLabelLineFound=true; selector-node-end uses the stable END_OF_SELECTOR_NODE label with both booleans false. A selector-end body containing a standalone recognized metadata label is independently rejected by the caller even if its evidence fields claim otherwise.
  • descriptionTail exactly matches the final 80 source characters.
  • descriptionHash is 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"
}
}
}
FieldMeaning
schemaVersionAlways "nomad-agent-job-row-v1".
recordType"posting" for a job, "diagnostic" for a row reporting something about the run itself.
sourceWhich job source the posting came from, using the documented source vocabulary — not the Actor name.
idStable identifier for the posting within source.
urlCanonical public URL of the posting on the source site.
titleJob title exactly as the source publishes it, untruncated.
companyEmployer name as published.
locationsPlaces the role is based, most specific first — e.g. ["Bilbao", "Spain"].
postedAtSource publication time when available; otherwise the original first-observed hour. See custom.data.postedAtProvenance.
deadlineClosing date for applications as an ISO-8601 calendar date (YYYY-MM-DD).
descriptionThe complete posting body as plain text — never truncated, never summarised.
descriptionHtmlThe posting body as the source's own markup, preserving lists, headings and links.
workTypeWorking arrangement: "remote", "hybrid" or "onsite".
customFacts 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
}

Current costs

Current Actor event rates, checked 2026-10-04. USD; use the Pricing tab for your plan and later changes.

EventFreeBronzeSilverGoldPlatinumDiamond
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.