Devex Jobs Scraper — NGO & International Development Jobs
Pricing
from $3.00 / 1,000 job results
Devex Jobs Scraper — NGO & International Development Jobs
Scrape international-development, NGO, humanitarian and UN jobs from Devex.com — donor-funded programmes, consultancies, INGO and multilateral roles. An AI step (bring your own Anthropic or Mistral key) returns clean records: title, organisation, location, salary, deadline, URL.
Devex Jobs Scraper — Complete Source Descriptions
Discover public Devex job postings through Camoufox and Apify Residential and return only records with the exact canonical source-page narrative. The listing page supplies candidate URLs; no model, search engine, or API key is used for discovery or extraction.
The Actor reads unauthenticated public pages. It does not use a Devex login, paywall access, CAPTCHA bypass, or an authenticated Devex session.
Complete-description contract
A discovery record is emitted 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","maxItems": 3,"proxyConfiguration": {"useApifyProxy": true,"apifyProxyGroups": ["RESIDENTIAL"]}}
maxItems is capped at 3. Keyword and location are conservative filters over
visible source listing-card text. The Actor harvests more than three candidate
URLs so a blocked/paywalled detail does not starve later public records, then
stops after three complete jobs. Supplying jobUrls switches to alive-check;
only exact numeric-id detail URLs are accepted, while query and subpath URLs
are rejected before navigation.
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
{"source": "devex","id": "1234567","title": "Policy Analyst","company": "Example Organization","location": "Remote","url": "https://www.devex.com/jobs/policy-analyst-1234567","description": "Complete canonical position narrative ending cleanly...","descriptionContractVersion": "devex-complete-source-v3","descriptionSourceUrl": "https://www.devex.com/jobs/policy-analyst-1234567","descriptionComplete": true,"descriptionBoundaryFound": true,"descriptionBoundaryLabel": "Seniority Level","descriptionBoundaryType": "top-level-source-metadata","descriptionMetadataChildFound": true,"descriptionMetadataLabelLineFound": true,"descriptionTail": "exact final 80 source characters of the complete body","descriptionHash": "sha256:...","snippet": "Visible source listing-card text","postedAt": null,"deadline": null}
Unknown dates, salary, contract type, workplace, and employer website remain
null; they are never inferred from prose or location.
Diagnostics and charging
Unavailable Residential access exits before the Actor-start charge. Listing or
detail transport failures emit a warning row with warning and docs. Job records are charged only
after they pass the complete-description contract and are pushed. Callers must
treat warning-only datasets as source failures rather than empty inventory.
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.