# eFinancialCareers \[$2💰] Finance & Banking Jobs Scraper (`memo23/efinancialcareers-jobs-scraper`) Actor

Turn eFinancialCareers into structured finance-hiring data. Pull 70,000+ jobs across banking, fintech, and funds from any regional site or search URL. Each row carries the employer's real ATS apply link and full HTML description. No proxy cost. JSON or CSV out, billed per result

- **URL**: https://apify.com/memo23/efinancialcareers-jobs-scraper.md
- **Developed by:** [Muhamed Didovic](https://apify.com/memo23) (community)
- **Categories:** Jobs, AI, Agents
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.00 / 1,000 result (one job)s

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

Learn more: https://docs.apify.com/platform/actors/running/actors-in-store#pay-per-event

## What's an Apify Actor?

Actors are a software tools running on the Apify platform, for all kinds of web data extraction and automation use cases.
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.

In JavaScript/TypeScript projects, use official [JavaScript/TypeScript client](https://docs.apify.com/api/client/js/docs.md):

```bash
npm install apify-client
```

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python/docs.md):

```bash
pip install apify-client
```

In shell scripts, use [Apify CLI](https://docs.apify.com/cli/docs.md):

````bash
# MacOS / Linux
curl -fsSL https://apify.com/install-cli.sh | bash
# Windows
irm https://apify.com/install-cli.ps1 | iex
```bash

In AI frameworks, you might use the [Apify MCP server](https://docs.apify.com/integrations/mcp.md).

If your project is in a different language, use 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

## 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

![How eFinancialCareers Jobs Scraper works](https://api.apify.com/v2/key-value-stores/kfhOjcH2i0WGbrGGn/records/how-it-works-efinancialcareers.png)

#### ✨ Why use this scraper?

- **Real ATS apply URLs** — each job resolves the employer's actual application link (`myworkdayjobs.com`, `icims.com`, `taleo.net`, …) into `externalApplyUrl`, 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.
- **Company enrichment built in** — each unique employer's public profile (description, images, website when published) is fetched once and merged into every one of its jobs.

#### 🎯 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"`, `location: "Singapore"` | Used when Start URLs is empty |

**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

1. **Classify** each start URL — search/listing vs direct job (any regional domain).
2. **Stream the search API** — up to 100 jobs per request; details start processing while later pages are still being fetched.
3. **Fetch the detail API** per job — formatted HTML description, job reference, work-arrangement type.
4. **Fetch the apply-information API** per job — resolves the real external ATS apply URL and login-required flag.
5. **Fetch each unique company profile once** (cached) — company description, images, website when published.
6. **Push one merged row per job** to the dataset — capped exactly at `maxItems`.

#### ⚙️ Input parameters

| Field | Type | Default | Description |
|---|---|---|---|
| `startUrls` | array | `["https://www.efinancialcareers.com/jobs"]` | Listing/search and/or direct job URLs, any regional domain |
| `keyword` | string | — | Keyword search; used when `startUrls` is empty |
| `location` | string | — | Free-text location filter; used when `startUrls` is empty |
| `remoteOnly` | boolean | `false` | Only remote jobs; used when `startUrls` is empty |
| `includeRemote` | boolean | `false` | Include remote jobs in location-filtered searches |
| `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) |
| `maxItems` | integer | `1000` | Hard cap on jobs collected |
| `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

```json
{
    "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`, `companyWebsite`, `companyDomain`, `companyProfileImage`, `companyCoverImage` |
| **Location** | `location`, `addressLocality`, `addressRegion`, `country`, `worldRegion` |
| **Compensation** | `salary.{currency,min,max,raw}` (structured when published), `salaryRaw` |
| **Classification** | `categories` (sectors, humanised), `sectorTags` (raw), `contractType`, `employmentTypes`, `workArrangementType` |
| **Dates** | `postedDate`, `closingDate` (ISO-8601) |
| **Content** | `description` (HTML), `descriptionText` (plain), `summary` |
| **Apply flow** | `applyType` (`external`/`internal`), `applyUrl`, `externalApplyUrl` (real ATS link), `applyLoginRequired` |
| **Flags** | `isHighlighted`, `isAnonymousEmployer`, `language` |

#### ❓ 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. Note that eFinancialCareers re-posts some inventory, so `postedDate` can reflect the latest re-post; use `postedWithinHours` for monitoring runs.

#### 💬 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](https://apify.com/memo23) — covering job boards, real estate, social media, and more.

***

### ⚠️ 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

# Actor input Schema

## `startUrls` (type: `array`):

Full eFinancialCareers URLs to crawl. Mix listing and job URLs in the same array if useful. Leave empty to use the keyword/location fields below instead.

## `keyword` (type: `string`):

Keyword search, e.g. `quant analyst`, `compliance`, `trader`. Only used when Start URLs is empty (add `?q=…` to a start URL otherwise).

## `location` (type: `string`):

Free-text location filter, e.g. `London`, `New York, NY, USA`, `Singapore`, `United Kingdom`. Only used when Start URLs is empty.

## `remoteOnly` (type: `boolean`):

Only return remote jobs. Only used when Start URLs is empty.

## `includeRemote` (type: `boolean`):

When filtering by location, also include remote jobs available for that location.

## `enrichJobDetails` (type: `boolean`):

When enabled, each job also fetches eFinancialCareers' detail API for the formatted HTML description, the employer's job reference number, and the work-arrangement type (remote / hybrid / office). Adds one fast API call per job. When disabled, rows still carry the full plain-text description from the search API.

## `fetchApplyInfo` (type: `boolean`):

When enabled, each job fetches the apply-information API to resolve the REAL external application URL — the employer's own ATS link (Workday, iCIMS, Greenhouse, …) — into `externalApplyUrl`. Adds one fast API call per job. Jobs using eFinancialCareers' internal apply flow get `applyType: "internal"` instead.

## `enrichCompany` (type: `boolean`):

When enabled, each unique employer's profile is fetched once (cached across jobs) to add `companyDescription`, `companyWebsite` + `companyDomain` when the employer publishes them, and profile/cover images. Requires 'Fetch full job detail'.

## `enrichEmails` (type: `boolean`):

If enabled, tries to find a contact email for each employer by discovering the company's website and reading its contact/about pages. Adds contactEmail + contactWebsite columns plus a detailed emailEnrichment object. Best-effort.

## `qualifyByPayment` (type: `boolean`):

Requires "Enrich with contact emails". Scans each business's website — reusing the pages already fetched for email discovery, so no extra cost or time — for payment processors and e-commerce platforms (Stripe, Shopify, PayPal, Paddle, Lemon Squeezy, WooCommerce, Square, Chargebee and more). Adds takesPayments (is this a real paying business?), paymentProcessors (which stack), stripeLiveKey (the public key if exposed) and paymentConfidence. Turn raw contacts into monetization-qualified leads. No extra charge — included with each enriched company.

## `postedWithinHours` (type: `integer`):

Filters on each job's posted date. Set 24 for the last day, 72 for the last 3 days, etc. Leave empty (or 0) to return everything regardless of age.

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

Hard cap on the number of jobs collected. eFinancialCareers lists ~70,000+ jobs globally; use this cap to limit billing.

## `maxConcurrency` (type: `integer`):

Maximum number of job API calls processed in parallel.

## `minConcurrency` (type: `integer`):

Minimum number of job API calls processed in parallel.

## `maxRequestRetries` (type: `integer`):

Number of retries before a failed request is given up.

## `proxy` (type: `object`):

NOT needed for eFinancialCareers — the scraper reads the site's open JSON APIs, which work without any proxy. Only configure one if you see blocks in your region; it is honoured as an explicit override.

## Actor input object example

```json
{
  "startUrls": [
    "https://www.efinancialcareers.com/jobs"
  ],
  "remoteOnly": false,
  "includeRemote": false,
  "enrichJobDetails": true,
  "fetchApplyInfo": true,
  "enrichCompany": true,
  "enrichEmails": false,
  "qualifyByPayment": false,
  "maxItems": 1000,
  "maxConcurrency": 10,
  "minConcurrency": 1,
  "maxRequestRetries": 5,
  "proxy": {
    "useApifyProxy": false
  }
}
```

# 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 = {
    "startUrls": [
        "https://www.efinancialcareers.com/jobs"
    ],
    "proxy": {
        "useApifyProxy": false
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("memo23/efinancialcareers-jobs-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 = {
    "startUrls": ["https://www.efinancialcareers.com/jobs"],
    "proxy": { "useApifyProxy": False },
}

# Run the Actor and wait for it to finish
run = client.actor("memo23/efinancialcareers-jobs-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 '{
  "startUrls": [
    "https://www.efinancialcareers.com/jobs"
  ],
  "proxy": {
    "useApifyProxy": false
  }
}' |
apify call memo23/efinancialcareers-jobs-scraper --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "eFinancialCareers [$2💰] Finance & Banking Jobs Scraper",
        "description": "Turn eFinancialCareers into structured finance-hiring data. Pull 70,000+ jobs across banking, fintech, and funds from any regional site or search URL. Each row carries the employer's real ATS apply link and full HTML description. No proxy cost. JSON or CSV out, billed per result",
        "version": "0.0",
        "x-build-id": "RzwP1w7q1MqfeaTSm"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/memo23~efinancialcareers-jobs-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-memo23-efinancialcareers-jobs-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        },
        "/acts/memo23~efinancialcareers-jobs-scraper/runs": {
            "post": {
                "operationId": "runs-sync-memo23-efinancialcareers-jobs-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor and returns information about the initiated run in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/runsResponseSchema"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/acts/memo23~efinancialcareers-jobs-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-memo23-efinancialcareers-jobs-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        }
    },
    "components": {
        "schemas": {
            "inputSchema": {
                "type": "object",
                "properties": {
                    "startUrls": {
                        "title": "eFinancialCareers URLs",
                        "type": "array",
                        "description": "Full eFinancialCareers URLs to crawl. Mix listing and job URLs in the same array if useful. Leave empty to use the keyword/location fields below instead.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "keyword": {
                        "title": "Keyword",
                        "type": "string",
                        "description": "Keyword search, e.g. `quant analyst`, `compliance`, `trader`. Only used when Start URLs is empty (add `?q=…` to a start URL otherwise)."
                    },
                    "location": {
                        "title": "Location",
                        "type": "string",
                        "description": "Free-text location filter, e.g. `London`, `New York, NY, USA`, `Singapore`, `United Kingdom`. Only used when Start URLs is empty."
                    },
                    "remoteOnly": {
                        "title": "Remote jobs only",
                        "type": "boolean",
                        "description": "Only return remote jobs. Only used when Start URLs is empty.",
                        "default": false
                    },
                    "includeRemote": {
                        "title": "Include remote jobs in location searches",
                        "type": "boolean",
                        "description": "When filtering by location, also include remote jobs available for that location.",
                        "default": false
                    },
                    "enrichJobDetails": {
                        "title": "Fetch full job detail (HTML description + job reference + work arrangement)",
                        "type": "boolean",
                        "description": "When enabled, each job also fetches eFinancialCareers' detail API for the formatted HTML description, the employer's job reference number, and the work-arrangement type (remote / hybrid / office). Adds one fast API call per job. When disabled, rows still carry the full plain-text description from the search API.",
                        "default": true
                    },
                    "fetchApplyInfo": {
                        "title": "Fetch the real external apply URL (ATS link)",
                        "type": "boolean",
                        "description": "When enabled, each job fetches the apply-information API to resolve the REAL external application URL — the employer's own ATS link (Workday, iCIMS, Greenhouse, …) — into `externalApplyUrl`. Adds one fast API call per job. Jobs using eFinancialCareers' internal apply flow get `applyType: \"internal\"` instead.",
                        "default": true
                    },
                    "enrichCompany": {
                        "title": "Fetch company profile (description + website when public)",
                        "type": "boolean",
                        "description": "When enabled, each unique employer's profile is fetched once (cached across jobs) to add `companyDescription`, `companyWebsite` + `companyDomain` when the employer publishes them, and profile/cover images. Requires 'Fetch full job detail'.",
                        "default": true
                    },
                    "enrichEmails": {
                        "title": "Enrich with employer contact emails (experimental)",
                        "type": "boolean",
                        "description": "If enabled, tries to find a contact email for each employer by discovering the company's website and reading its contact/about pages. Adds contactEmail + contactWebsite columns plus a detailed emailEnrichment object. Best-effort.",
                        "default": false
                    },
                    "qualifyByPayment": {
                        "title": "💳 Qualify by payment (flag businesses that take money online)",
                        "type": "boolean",
                        "description": "Requires \"Enrich with contact emails\". Scans each business's website — reusing the pages already fetched for email discovery, so no extra cost or time — for payment processors and e-commerce platforms (Stripe, Shopify, PayPal, Paddle, Lemon Squeezy, WooCommerce, Square, Chargebee and more). Adds takesPayments (is this a real paying business?), paymentProcessors (which stack), stripeLiveKey (the public key if exposed) and paymentConfidence. Turn raw contacts into monetization-qualified leads. No extra charge — included with each enriched company.",
                        "default": false
                    },
                    "postedWithinHours": {
                        "title": "Only jobs posted in the last N hours",
                        "minimum": 0,
                        "type": "integer",
                        "description": "Filters on each job's posted date. Set 24 for the last day, 72 for the last 3 days, etc. Leave empty (or 0) to return everything regardless of age."
                    },
                    "maxItems": {
                        "title": "Maximum items to scrape",
                        "minimum": 1,
                        "type": "integer",
                        "description": "Hard cap on the number of jobs collected. eFinancialCareers lists ~70,000+ jobs globally; use this cap to limit billing.",
                        "default": 1000
                    },
                    "maxConcurrency": {
                        "title": "Max concurrency",
                        "minimum": 1,
                        "type": "integer",
                        "description": "Maximum number of job API calls processed in parallel.",
                        "default": 10
                    },
                    "minConcurrency": {
                        "title": "Min concurrency",
                        "minimum": 1,
                        "type": "integer",
                        "description": "Minimum number of job API calls processed in parallel.",
                        "default": 1
                    },
                    "maxRequestRetries": {
                        "title": "Max request retries",
                        "minimum": 0,
                        "type": "integer",
                        "description": "Number of retries before a failed request is given up.",
                        "default": 5
                    },
                    "proxy": {
                        "title": "Proxy configuration",
                        "type": "object",
                        "description": "NOT needed for eFinancialCareers — the scraper reads the site's open JSON APIs, which work without any proxy. Only configure one if you see blocks in your region; it is honoured as an explicit override.",
                        "default": {
                            "useApifyProxy": false
                        }
                    }
                }
            },
            "runsResponseSchema": {
                "type": "object",
                "properties": {
                    "data": {
                        "type": "object",
                        "properties": {
                            "id": {
                                "type": "string"
                            },
                            "actId": {
                                "type": "string"
                            },
                            "userId": {
                                "type": "string"
                            },
                            "startedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "finishedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "status": {
                                "type": "string",
                                "example": "READY"
                            },
                            "meta": {
                                "type": "object",
                                "properties": {
                                    "origin": {
                                        "type": "string",
                                        "example": "API"
                                    },
                                    "userAgent": {
                                        "type": "string"
                                    }
                                }
                            },
                            "stats": {
                                "type": "object",
                                "properties": {
                                    "inputBodyLen": {
                                        "type": "integer",
                                        "example": 2000
                                    },
                                    "rebootCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "restartCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "resurrectCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "computeUnits": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "options": {
                                "type": "object",
                                "properties": {
                                    "build": {
                                        "type": "string",
                                        "example": "latest"
                                    },
                                    "timeoutSecs": {
                                        "type": "integer",
                                        "example": 300
                                    },
                                    "memoryMbytes": {
                                        "type": "integer",
                                        "example": 1024
                                    },
                                    "diskMbytes": {
                                        "type": "integer",
                                        "example": 2048
                                    }
                                }
                            },
                            "buildId": {
                                "type": "string"
                            },
                            "defaultKeyValueStoreId": {
                                "type": "string"
                            },
                            "defaultDatasetId": {
                                "type": "string"
                            },
                            "defaultRequestQueueId": {
                                "type": "string"
                            },
                            "buildNumber": {
                                "type": "string",
                                "example": "1.0.0"
                            },
                            "containerUrl": {
                                "type": "string"
                            },
                            "usage": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "integer",
                                        "example": 1
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "usageTotalUsd": {
                                "type": "number",
                                "example": 0.00005
                            },
                            "usageUsd": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "number",
                                        "example": 0.00005
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
