eFinancialCareers [$1💰] Finance & Banking Jobs Scraper
Pricing
from $0.80 / 1,000 result (one job)s
eFinancialCareers [$1💰] Finance & Banking Jobs Scraper
Scrape 70,000+ finance and banking jobs from eFinancialCareers. Filter by sector, seniority, employer, salary and region, or paste any search URL. Each row has the employer's real ATS apply link, skills, and company data: industry, year founded, benefits and recruiters. No proxy cost.
Pricing
from $0.80 / 1,000 result (one job)s
Rating
5.0
(1)
Developer
Muhamed Didovic
Maintained by CommunityActor stats
0
Bookmarked
29
Total users
4
Monthly active users
19 hours ago
Last modified
Share
eFinancialCareers Jobs Scraper
Turn eFinancialCareers into structured finance-hiring data — across all 24 regional sites. Scrape every job from any eFinancialCareers search or listing URL — title, employer (with logo and profile), location, salary, sectors, contract type, posted/expiry dates, full HTML description, and the real external apply URL (the employer's own Workday / iCIMS / Greenhouse link, not the listing page) — pulled straight from eFinancialCareers' JSON APIs. JSON or CSV out, billed per result.
How it works

✨ Why use this scraper?
- Real ATS apply URLs — each job resolves the employer's actual application link (
myworkdayjobs.com,icims.com,taleo.net, …) intoexternalApplyUrl, not just the eFinancialCareers page. - Pure JSON, no HTML scraping — data comes from the site's own APIs, so fields don't break when the page layout changes.
- No proxy needed — the APIs are openly accessible; you pay nothing extra for residential proxy traffic.
- All 24 regional sites — .com, .co.uk, .de, .fr, .sg, .com.au, .co.za, efinancialcareers-canada.com, -gulf.com, and more, auto-detected from the URL.
- Full HTML job description plus a clean plain-text version, on every row.
- Every site filter as a dropdown: sector (36), seniority, experience level, position type, employment type, work arrangement, region, employer name and salary range with currency. The site applies them itself, so filtered-out jobs cost nothing.
- Only new jobs on scheduled runs: switch on
onlyNewJobsand each run skips the jobs earlier runs of the same search already delivered. Skipped jobs are never billed, so a daily schedule pays only for fresh postings. - Output shaped to fit: compact core-fields mode, description as HTML, text, both or none, long text cut at a length you choose, and empty fields dropped. Smaller rows for AI agents, MCP tools and spreadsheets.
- Spend cap:
maxCostUsdstops the run once the jobs delivered reach your budget, and Apify's own "Max cost per run" is honoured too, so a run never collects jobs it can't bill. - Many searches in one run: one keyword or location per line, every keyword runs in every location, results de-duplicated, with an optional cap per search.
- Company intelligence built in: each unique employer's public profile is fetched once and merged into every one of its jobs: description, industry, year founded, profile location, benefits, and the named recruiters with their work emails. When the profile has no website, the company domain comes from those recruiter emails.
- Skills, coordinates and repost detection on every row: the ad's skills list, latitude/longitude, sub-sectors, and
firstPostedDate/isRefreshedAdto spot ads that were re-dated rather than newly posted.
🎯 Use cases
| Who | What they do with it |
|---|---|
| Recruitment agencies | Track which banks, funds, and fintechs are hiring, in which cities, for which desks |
| HR / comp & ben teams | Benchmark salaries and contract types across finance hubs (London, NY, Singapore, Dubai) |
| Job aggregators | Ingest structured finance vacancies with dedupe-ready numeric IDs and real apply links |
| Market researchers | Measure hiring volume by sector (M&A, risk, compliance, quant) over time |
| Sales / lead-gen teams | Find employers actively hiring — each row carries the employer profile and optional contact-email enrichment |
| Data scientists | Train models on 70,000+ live structured job records with sector and seniority labels |
📥 Supported inputs
| Input | Example | What happens |
|---|---|---|
| Global or regional listing | https://www.efinancialcareers.com/jobs · https://www.efinancialcareers.co.uk/jobs | Walks the full search feed for that locale |
| Search with keyword/location | /jobs?q=trader&location=London | Filters pass straight to the search API |
| Country page | /jobs/in-united-kingdom · /jobs/in-singapore | Mapped to a location filter |
| Remote/hybrid pages | /jobs/remote · /jobs/hybrid | Mapped to work-arrangement filters |
| Direct job URL | /jobs-United_Kingdom-London-Analyst.id24313799 | Scraped as a single job |
| Keyword + location fields | keyword: "quant analyst\ntrader", location: "Singapore\nLondon" | One search per keyword × location; used when Start URLs is empty |
| Filters | sectors: ["RISK_MANAGEMENT"], seniority: ["DIRECTOR"], companies: ["Citi"] | Applied to keyword searches and added to listing Start URLs |
Not supported: company-profile listing pages (/companies/{slug}) as start URLs (company data is merged into job rows instead), news/editorial pages, and login-only candidate features.
🔄 How it works
- Classify each start URL — search/listing vs direct job (any regional domain).
- Stream the search API — up to 100 jobs per request; details start processing while later pages are still being fetched.
- Fetch the detail API per job: formatted HTML description, skills, coordinates, sub-sectors, job reference, work-arrangement type, first-placed date.
- Fetch the apply-information API per job — resolves the real external ATS apply URL and login-required flag.
- Fetch each unique company profile once (cached): description, industry, year founded, profile location, benefits, recruiters, website when published.
- Push one merged row per job to the dataset — capped exactly at
maxItems.
⚙️ Input parameters
| Field | Type | Default | Description |
|---|---|---|---|
startUrls | array | — | Listing/search and/or direct job URLs, any regional domain |
keyword | string | — | One keyword per line, one search each; used when startUrls is empty |
location | string | — | One free-text location per line; every keyword runs in every location |
remoteOnly | boolean | false | Only remote jobs |
includeRemote | boolean | false | Include remote jobs in location-filtered searches |
regions | array | — | Europe, North America, Asia, Australasia, Gulf, Africa |
sectors | array | — | Any of the site's 36 sectors, e.g. RISK_MANAGEMENT, TRADING, HEDGE_FUNDS |
seniority | array | — | INTERN_GRADUATE … C_SUITE |
experienceLevel | array | — | Years of experience the ad asks for |
positionType | array | — | PERMANENT, CONTRACT, TEMPORARY, SELF_EMPLOYED, INTERNSHIPS_AND_GRADUATE_TRAINEE |
employmentType | array | — | FULL_TIME, PART_TIME |
workArrangement | array | — | HYBRID, IN_OFFICE, REMOTE, FLEXIBLE, TEMPORARILY_REMOTE |
companies | array | — | Employer names, e.g. Deloitte, Citi |
salaryCurrency | string | — | Currency the salary is stated in (GBP, USD, EUR, …) |
minSalary / maxSalary | integer | — | Salary bounds in that currency |
includeJobsWithoutSalary | boolean | auto | Defaults to on, or off once a salary bound is set |
enrichJobDetails | boolean | true | Fetch HTML description + job reference + work arrangement (+1 API call/job) |
fetchApplyInfo | boolean | true | Resolve the real external ATS apply URL (+1 API call/job) |
enrichCompany | boolean | true | Fetch each unique company profile once (cached) |
enrichEmails | boolean | false | Experimental employer contact-email discovery |
postedWithinHours | integer | — | Only jobs posted in the last N hours (24 = last day) |
onlyNewJobs | boolean | false | Skip jobs earlier runs of the same search delivered (kept 90 days) |
stateKey | string | auto | Optional name for that memory; share it between tasks or change it to start fresh |
maxItems | integer | 1000 | Hard cap on jobs collected and billed |
maxItemsPerSearch | integer | 0 | Cap per keyword × location search or start URL (0 = none) |
maxCostUsd | number | 0 | Stop once the jobs delivered reach this amount (0 = no limit) |
descriptionFormat | string | both | both, text, html or none |
descriptionMaxLength | integer | 0 | Cut description, summary and company description at N characters |
compact | boolean | false | Keep only the core columns |
excludeEmptyFields | boolean | false | Drop null and empty fields from each row |
maxConcurrency | integer | 10 | Parallel job API calls |
proxy | object | none | Not needed — honoured as an explicit override only |
📊 Output overview
Each dataset row is one job with everything merged inline: identity (numeric + hash ID, canonical URL), employer (name, logo, profile description), location fields, salary (structured when the employer publishes numbers, raw text otherwise), sectors, contract/employment type, dates, both description formats, and the full apply flow (applyType, externalApplyUrl, applyLoginRequired). Fields the source doesn't provide are null — columns never disappear between rows.
📦 Output sample
{"type": "job","source": "efinancialcareers","jobId": "24313799","jobHashId": "LuhoFP4fukX8W5UM","jobUrl": "https://www.efinancialcareers.co.uk/jobs-United_Kingdom-London-Analyst.id24313799","title": "Analyst","companyName": "Apollo Global Management, Inc.","companyWebsite": null,"companyDomain": null,"location": "London, United Kingdom","addressLocality": "London","country": "United Kingdom","remote": false,"salary": null,"salaryRaw": "Competitive","categories": ["Accounting & Finance / Other"],"employmentTypes": ["Full time"],"contractType": "Permanent","postedDate": "2026-05-29T07:09:15.257Z","closingDate": "2050-01-01T23:45:00.000Z","description": "<b>Position Overview</b> <br /> <br /> The Apollo Capital Solutions Syndication team is seeking a detail-oriented Analyst…","descriptionText": "Position Overview\n\nThe Apollo Capital Solutions Syndication team is seeking a detail-oriented Analyst…","applyType": "external","applyUrl": "https://www.efinancialcareers.co.uk/jobs-United_Kingdom-London-Analyst.id24313799","externalApplyUrl": "https://athene.wd5.myworkdayjobs.com/apollononpubliccareersite/job/Analyst---Sub-IG-EU_R260189","applyLoginRequired": true,"jobReference": "R260189","companyProfileId": "IHbtb9VgLfctBz5q","scrapedAt": "2026-07-12T03:41:12.480Z"}
🗂 Key output fields
| Group | Fields |
|---|---|
| Identity | jobId (numeric), jobHashId, jobUrl, title, normalizedTitle, jobReference |
| Employer | companyName, logoUrl, companyProfileId, companyDescription, companyIndustry, companyYearFounded, companyProfileCity, companyProfileCountry, companyBenefits, companyRecruiters (name, title, email, profileUrl), companyWebsite, companyDomain, companyDomainSource, companyProfileImage, companyCoverImage, employerJobsUrl |
| Location | location, addressLocality, addressRegion, country, countryCode, worldRegion, latitude, longitude |
| Compensation | salary.{currency,min,max,raw} (structured when published), salaryRaw |
| Classification | categories (sectors, humanised), sectorTags (raw), subSectors, skills, contractType, employmentTypes, workArrangementType, permitRequirements |
| Dates | postedDate, firstPostedDate, isRefreshedAd, closingDate (ISO-8601) |
| Content | description (HTML), descriptionText (plain), summary |
| Apply flow | applyType (external/internal), applyUrl, externalApplyUrl (real ATS link), applyLoginRequired |
| Flags | isHighlighted, isAnonymousEmployer, recruiterId, language, canonicalUrl |
❓ FAQ
Do I need a proxy? No. The scraper reads eFinancialCareers' open JSON APIs, which work from any IP. A proxy config is honoured as an override if you ever see regional blocks, and a residential fallback is built into the retry chain.
Is externalApplyUrl always filled?
It's filled for externally-applied jobs (most of them) — the employer's own ATS link. Jobs using eFinancialCareers' internal apply flow get applyType: "internal" and externalApplyUrl: null; there is no external link to resolve for those.
Why is salary often null while salaryRaw says "Competitive"?
Most finance employers don't publish numbers. When they do, salary.min/salary.max/salary.currency are structured; otherwise salaryRaw carries the text label.
Can I scrape non-English regional sites?
Yes — pass any regional URL (efinancialcareers.de, .fr, .cn, …). The locale (language + currency context) is auto-detected from the domain and path.
How fresh are postedDate values?
They come from the API and are ISO-formatted. Employers can re-date an existing ad, so postedDate can be the latest refresh. firstPostedDate is when the ad was first placed, and isRefreshedAd is true when the two are more than a day apart. Use postedWithinHours for monitoring runs.
How does "Only new jobs" work?
Each run stores the IDs of the jobs it delivered in a key-value store named efinancialcareers-seen-jobs in your own Apify account, one record per search. The next run of the same search skips those IDs before fetching anything, so they cost nothing. IDs are forgotten after 90 days. An ad the employer re-dates keeps its ID, so it is not delivered again. Pair it with postedWithinHours to keep scheduled runs fast.
Why does a salary filter return fewer jobs than I expected?
Most finance ads don't state a salary, and once you set a minimum or maximum those ads are left out (otherwise every one of them would pass the bound). Set includeJobsWithoutSalary: true to keep them.
💬 Support
- For issues or feature requests, please use the Issues tab on the actor's Apify Console page.
- Author's website: https://muhamed-didovic.github.io/
- Email: muhamed.didovic@gmail.com
🛠 Additional services
- Custom output shape, additional fields, or one-off datasets: muhamed.didovic@gmail.com
- Need a similar scraper for other job boards (SimplyHired, TotalJobs, CharityJob, s1jobs, etc.)? Drop an email.
- For API access (no Apify fee, just a usage fee for the API): muhamed.didovic@gmail.com
🔎 Explore more scrapers
If this eFinancialCareers Scraper was useful, see other scrapers and actors at memo23's Apify profile — covering job boards, real estate, social media, and more.
🤖 For AI Agents & LLM Apps
Compact reference for AI agents calling this actor via the Apify MCP server or the Apify API (actor: memo23/efinancialcareers-jobs-scraper).
Purpose: Scrape finance jobs from any eFinancialCareers search, listing or direct job URL across all 24 regional sites, resolving each employer's real external ATS apply link.
Minimal input:
{ "startUrls": ["https://www.efinancialcareers.com/jobs"], "maxItems": 20 }
Or drive it with search fields and filters instead of a URL: { "keyword": "quant analyst", "location": "Singapore", "sectors": ["QUANTITATIVE_ANALYTICS"], "seniority": ["VP_PRINCIPAL"], "maxItems": 20 }.
Output: one row per job — type, source, jobId, jobHashId, jobUrl, title, companyName, companyWebsite, companyDomain, location, addressLocality, country, remote, salary, salaryRaw, categories, employmentTypes, contractType, postedDate, closingDate, description, descriptionText, applyType, applyUrl, externalApplyUrl, applyLoginRequired, jobReference, skills, subSectors, latitude, longitude, firstPostedDate, isRefreshedAd, companyProfileId, companyIndustry, companyYearFounded, companyProfileCountry, companyBenefits, companyRecruiters, scrapedAt.
Behaviors an agent should know:
startUrls(listing/search or direct job, any regional domain) take priority;keyword/locationare used only whenstartUrlsis empty. Filter fields (sectors,seniority,companies,minSalary, …) apply to both, unless a start URL already sets that filter.keywordandlocationtake one value per line; every keyword runs in every location. UsemaxItemsPerSearchso the first search can't use upmaxItems.- Always set
maxItems— eFinancialCareers lists ~70,000+ jobs globally; default cap is 1000. enrichJobDetails,fetchApplyInfo,enrichCompanydefaulttrueand each add one API call per job (fetchApplyInforesolvesexternalApplyUrl);enrichEmailsis experimental and off by default.postedWithinHoursfilters to recent postings for monitoring runs; no proxy needed (open JSON APIs).- For schedules, set
onlyNewJobs: true: jobs delivered by earlier runs of the same search are skipped and not billed. - For small payloads, set
compact: true(core columns only),descriptionFormat: "text"anddescriptionMaxLength(e.g. 1000).maxCostUsdcaps spend per run. - Billed per result (pay-per-event) — see the Pricing tab on the actor page.
⚠️ Disclaimer
This Actor is an independent tool and is not affiliated with, endorsed by, or sponsored by eFinancialCareers, the DHI Group, or any of their subsidiaries or affiliates. All trademarks mentioned are the property of their respective owners.
The scraper accesses only publicly available job listings and the public JSON endpoints that power the eFinancialCareers website — no authenticated endpoints, recruiter-only features, candidate data, or content behind a login. Users are responsible for ensuring their use complies with eFinancialCareers' Terms of Service, applicable data-protection law (GDPR, CCPA, etc.), and any contractual obligations of their own organisation.
SEO Keywords
efinancialcareers scraper, scrape efinancialcareers, efinancialcareers api, efinancialcareers jobs scraper, Apify efinancialcareers, finance jobs scraper, banking jobs api, investment banking jobs data, fintech jobs scraper, quant jobs scraper, hedge fund jobs data, finance recruitment data, finance salary benchmark, london finance jobs scraper, wall street jobs scraper, singapore finance jobs api, financial services hiring trends, ats apply url scraper, workday apply link scraper, finance job board scraper, dice alternative scraper, linkedin jobs alternative scraper