{
  "openapi": "3.0.1",
  "info": {
    "title": "eFinancialCareers Jobs Scraper - Finance & Banking Leads",
    "description": "Scrape eFinancialCareers finance & banking jobs worldwide by keyword, city, sector, seniority, employer or date. Every row carries the full job description, employer, location and sector - plus the employer's own ATS apply link, turning a job ad into a company lead. 71,000+ live jobs.",
    "version": "0.1",
    "x-build-id": "L5iZ8H3WFnmoqLKrQ"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/scrapersdelight~efinancialcareers-jobs-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-scrapersdelight-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/scrapersdelight~efinancialcareers-jobs-scraper/runs": {
      "post": {
        "operationId": "runs-sync-scrapersdelight-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/scrapersdelight~efinancialcareers-jobs-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-scrapersdelight-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": {
          "searchQueries": {
            "title": "Search keywords",
            "type": "array",
            "description": "Keyword searches to run, e.g. 'compliance', 'equity research', 'KYC analyst'. Each one is a separate search; results are merged and de-duplicated. Leave empty to sweep every live job (71,000+ worldwide) — with an empty keyword the site's index is already ordered newest-first.",
            "items": {
              "type": "string"
            }
          },
          "locations": {
            "title": "Locations",
            "type": "array",
            "description": "Cities or regions to search, e.g. 'London', 'Frankfurt', 'Singapore', 'Zurich', 'Dubai'. VERIFIED to genuinely filter, not just relabel: London 7,629 jobs, Frankfurt 1,708, Singapore 2,320, New York 4,346, Zurich 764, Dubai 395, Sydney 753, Tokyo 436, Mumbai 503 (measured 2026-09-03).",
            "items": {
              "type": "string"
            }
          },
          "radius": {
            "title": "Search radius",
            "minimum": 0,
            "maximum": 500,
            "type": "integer",
            "description": "Distance around each location to include. Real effect measured: Frankfurt at 40 km also pulls Darmstadt and Bad Nauheim. Ignored when no location is set.",
            "default": 40
          },
          "radiusUnit": {
            "title": "Radius unit",
            "enum": [
              "km",
              "miles"
            ],
            "type": "string",
            "description": "Unit for the search radius.",
            "default": "km"
          },
          "startUrls": {
            "title": "Start URLs (paste from the site)",
            "type": "array",
            "description": "Paste eFinancialCareers listing or job URLs from any of the 31 locale domains (.co.uk, .com, .de, .ch, .fr, .sg, .hk, .com.au, -gulf.com …). Listing URLs are TRANSLATED into API filters and job URLs (….id24700409) are resolved directly — the www site is never crawled. Note: the old /jobs-UK.London.s001 style URLs 301 to /jobs on the real site and silently lose their location, so this actor reads the filters out of the URL itself instead of following it. BILLING: a pasted JOB url is billed as ONE 'Per job returned' row. Resolving it goes through the job-detail endpoint (that is the only way to turn a URL into a row), so its deep-detail fields come back at no extra charge — 'Per deep enrichment' is still only charged when you switch deep enrichment on yourself.",
            "items": {
              "type": "string"
            }
          },
          "locationPaths": {
            "title": "Region paths",
            "type": "array",
            "description": "Whole-region filter using the site's own location tree. Live counts measured 2026-09-04. For a deeper path such as 'Europe/United Kingdom/England/London', paste the listing URL into Start URLs instead — this picker holds the seven roots the site's facet returns.",
            "items": {
              "type": "string",
              "enum": [
                "Europe",
                "North America",
                "Asia",
                "Australasia",
                "Gulf",
                "Africa",
                "South America"
              ],
              "enumTitles": [
                "Europe (40,088 live)",
                "North America (17,982)",
                "Asia (10,696)",
                "Australasia (1,380)",
                "Gulf (877)",
                "Africa (16)",
                "South America (2)"
              ]
            }
          },
          "sectors": {
            "title": "Sectors",
            "type": "array",
            "description": "Finance sectors, straight from the site's own facet (36 values, read live 2026-09-04). Live counts: INFORMATION_TECHNOLOGY 34,625 · ACCOUNTING_FINANCE 14,783 · INSURANCE 3,640 · COMPLIANCE_LEGAL 3,055 · OPERATIONS 2,731 · ASSET_MANAGEMENT 2,708 · PRIVATE_BANKING_WEALTH_MANAGEMENT 2,281 · SALES_MARKETING 2,244. The live list for your own search is also written to FILTER_VOCABULARY in the key-value store on every run.",
            "items": {
              "type": "string",
              "enum": [
                "INFORMATION_TECHNOLOGY",
                "ACCOUNTING_FINANCE",
                "INSURANCE",
                "COMPLIANCE_LEGAL",
                "ASSET_MANAGEMENT",
                "OPERATIONS",
                "PRIVATE_BANKING_WEALTH_MANAGEMENT",
                "SALES_MARKETING",
                "RISK_MANAGEMENT",
                "CONSULTANCY",
                "CORPORATE_BANKING",
                "HR_RECRUITMENT",
                "RETAIL_BANKING",
                "INVESTMENT_BANKING_M_A",
                "REAL_ESTATE",
                "TRADING",
                "QUANTITATIVE_ANALYTICS",
                "INFORMATION_SERVICES",
                "GRADUATES_INTERNSHIPS",
                "PRIVATE_EQUITY_VENTURE_CAPITAL",
                "FINTECH",
                "CREDIT",
                "HEDGE_FUNDS",
                "EQUITIES",
                "INVESTOR_RELATIONS_PR",
                "CAPITAL_MARKETS",
                "COMMODITIES",
                "DEBT_FIXED_INCOME",
                "FX_MONEY_MARKETS",
                "DERIVATIVES",
                "INVESTMENT_CONSULTING",
                "GLOBAL_CUSTODY",
                "RESEARCH",
                "INDUSTRY_COMMERCE",
                "PUBLIC_SECTOR",
                "ISLAMIC_FINANCE"
              ],
              "enumTitles": [
                "Information technology",
                "Accounting & finance",
                "Insurance",
                "Compliance & legal",
                "Asset management",
                "Operations",
                "Private banking & wealth management",
                "Sales & marketing",
                "Risk management",
                "Consultancy",
                "Corporate banking",
                "HR & recruitment",
                "Retail banking",
                "Investment banking & M&A",
                "Real estate",
                "Trading",
                "Quantitative analytics",
                "Information services",
                "Graduates & internships",
                "Private equity & venture capital",
                "Fintech",
                "Credit",
                "Hedge funds",
                "Equities",
                "Investor relations & PR",
                "Capital markets",
                "Commodities",
                "Debt & fixed income",
                "FX & money markets",
                "Derivatives",
                "Investment consulting",
                "Global custody",
                "Research",
                "Industry & commerce",
                "Public sector",
                "Islamic finance"
              ]
            }
          },
          "seniority": {
            "title": "Seniority",
            "type": "array",
            "description": "Seniority bands. Live counts: INTERN_GRADUATE 3,709 · JUNIOR 1,077 · ANALYST 2,738 · ASSOCIATE_MID_LEVEL 38,021 · AVP_SENIOR 14,332 · VP_PRINCIPAL 3,614 · SVP_HEAD_OF 2,144 · DIRECTOR 2,128, plus MANAGING_DIRECTOR and C_SUITE.",
            "items": {
              "type": "string",
              "enum": [
                "INTERN_GRADUATE",
                "JUNIOR",
                "ANALYST",
                "ASSOCIATE_MID_LEVEL",
                "AVP_SENIOR",
                "VP_PRINCIPAL",
                "SVP_HEAD_OF",
                "DIRECTOR",
                "MANAGING_DIRECTOR",
                "C_SUITE"
              ],
              "enumTitles": [
                "Intern / graduate",
                "Junior",
                "Analyst",
                "Associate / mid-level",
                "AVP / senior",
                "VP / principal",
                "SVP / head of",
                "Director",
                "Managing director",
                "C-suite"
              ]
            }
          },
          "experienceLevel": {
            "title": "Experience level",
            "type": "array",
            "description": "Years of experience the ad asks for, as the site bands it.",
            "items": {
              "type": "string",
              "enum": [
                "NO_EXPERIENCE",
                "ONE_THREE_YEARS_EXPERIENCE",
                "THREE_FIVE_YEARS_EXPERIENCE",
                "FIVE_SEVEN_YEARS_EXPERIENCE",
                "SEVEN_TEN_YEARS_EXPERIENCE",
                "TEN_FIFTEEN_YEARS_EXPERIENCE",
                "MORE_THAN_FIFTEEN_YEARS_EXPERIENCE"
              ],
              "enumTitles": [
                "No experience",
                "1-3 years",
                "3-5 years",
                "5-7 years",
                "7-10 years",
                "10-15 years",
                "15+ years"
              ]
            }
          },
          "employmentType": {
            "title": "Employment type",
            "type": "array",
            "description": "Full-time or part-time, as stated on the ad.",
            "items": {
              "type": "string",
              "enum": [
                "FULL_TIME",
                "PART_TIME"
              ],
              "enumTitles": [
                "Full time (70,127 live)",
                "Part time (914 live)"
              ]
            }
          },
          "positionType": {
            "title": "Position type",
            "type": "array",
            "description": "Permanent, contract, temporary, self-employed or an internship / graduate trainee scheme.",
            "items": {
              "type": "string",
              "enum": [
                "PERMANENT",
                "CONTRACT",
                "INTERNSHIPS_AND_GRADUATE_TRAINEE",
                "TEMPORARY",
                "SELF_EMPLOYED"
              ],
              "enumTitles": [
                "Permanent (67,331 live)",
                "Contract (1,558)",
                "Internship / graduate trainee (1,074)",
                "Temporary (992)",
                "Self-employed (86)"
              ]
            }
          },
          "workArrangementType": {
            "title": "Work arrangement",
            "type": "array",
            "description": "Remote, hybrid or in-office. Note this field is only stated on 9-27% of ads, so the filter is narrow by nature.",
            "items": {
              "type": "string",
              "enum": [
                "HYBRID",
                "IN_OFFICE",
                "REMOTE",
                "FLEXIBLE",
                "TEMPORARILY_REMOTE"
              ],
              "enumTitles": [
                "Hybrid (1,796 live)",
                "In office (834)",
                "Remote (220)",
                "Flexible (96)",
                "Temporarily remote (13)"
              ]
            }
          },
          "companies": {
            "title": "Companies / employers",
            "type": "array",
            "description": "Restrict to named employers, e.g. 'Deloitte' (998 live jobs), 'Citi', 'JPMorgan'. The lever for executive-search and competitive-intel buyers: every desk a bank is staffing, in one dataset.",
            "items": {
              "type": "string"
            }
          },
          "normalizedJobTitles": {
            "title": "Normalised job titles",
            "type": "array",
            "description": "The site's own normalised title taxonomy — cleaner than a keyword search. Values are EXACT, case-sensitive strings from that taxonomy (1,000 of them in the live facet, too many to list here); anything outside it returns zero rows, and every run writes the live list for your search to FILTER_VOCABULARY in the key-value store. Live counts: Accountant 1,135 · Sales Representative Specialist 1,038 · Engineer 1,035 · Consultant 898 · Lawyer 793 · Account Manager 718 · Manager 702 · Internship 476.",
            "items": {
              "type": "string"
            }
          },
          "postedWithin": {
            "title": "Posted within",
            "enum": [
              "ANY",
              "ONE",
              "THREE",
              "SEVEN"
            ],
            "type": "string",
            "description": "Server-side freshness window. ONE = last 24h (4,172 live), THREE = last 3 days (11,051), SEVEN = last 7 days (19,033). These are the ONLY windows the site's API supports — for 14 or 30 days use the exact date fields below, which this actor applies itself.",
            "default": "ANY"
          },
          "postedAfter": {
            "title": "Posted on/after (date)",
            "type": "string",
            "description": "ISO date or timestamp, e.g. 2026-08-01. Applied by this actor over the posted date, which is filled on 100% of rows — so you can express the 14- and 30-day windows the site's own API refuses."
          },
          "postedBefore": {
            "title": "Posted on/before (date)",
            "type": "string",
            "description": "ISO date or timestamp. Use with 'Posted on/after' for an exact date window."
          },
          "salaryCurrency": {
            "title": "Salary currency",
            "type": "array",
            "description": "The 23 currencies the site's own facet returns (read live 2026-09-04). Set this when using the salary bounds below — a bare number means nothing without its currency.",
            "items": {
              "type": "string",
              "enum": [
                "EUR",
                "USD",
                "GBP",
                "INR",
                "HKD",
                "SGD",
                "CHF",
                "AUD",
                "MYR",
                "AED",
                "JPY",
                "SAR",
                "CNY",
                "BHD",
                "QAR",
                "CAD",
                "KWD",
                "ZAR",
                "SEK",
                "DKK",
                "NOK",
                "NZD",
                "OMR"
              ],
              "enumTitles": [
                "EUR (24,838 live)",
                "USD (21,601)",
                "GBP (11,611)",
                "INR",
                "HKD",
                "SGD",
                "CHF",
                "AUD",
                "MYR",
                "AED",
                "JPY",
                "SAR",
                "CNY",
                "BHD",
                "QAR",
                "CAD",
                "KWD",
                "ZAR",
                "SEK",
                "DKK",
                "NOK",
                "NZD",
                "OMR"
              ]
            }
          },
          "minSalary": {
            "title": "Minimum salary",
            "minimum": 0,
            "type": "integer",
            "description": "Server-side floor. Only meaningful together with a salary currency (verified: minSalary 100000 + GBP = 10,440 jobs)."
          },
          "maxSalary": {
            "title": "Maximum salary",
            "minimum": 0,
            "type": "integer",
            "description": "Server-side ceiling. Use with a salary currency."
          },
          "onlyWithNumericSalary": {
            "title": "Only jobs with a numeric salary",
            "type": "boolean",
            "description": "Keep only rows carrying a real minimum/maximum salary number. Expect this to keep roughly 9 rows in 100. Rows removed here are never billed.",
            "default": false
          },
          "includeUnspecifiedSalary": {
            "title": "Include jobs with no stated salary",
            "type": "boolean",
            "description": "Turn OFF to drop rows whose salary text is empty or the literal 'Competitive' — looser than the numeric filter above, because it keeps day-rate and text salaries like '£500 - 550p/d' (roughly 19 rows in 100 survive). Applied by this actor: the API parameter of the same name is inert, so exposing it as a server-side knob would be a lie.",
            "default": true
          },
          "fetchApplyUrl": {
            "title": "Resolve the employer's real apply URL",
            "type": "boolean",
            "description": "Adds one request per job to the site's own apply-information endpoint and returns external_apply_url — the EMPLOYER'S OWN ATS link (lseg.wd3.myworkdayjobs.com, jobs.smartrecruiters.com/Wise, portal.emagine.org …). This is the field that turns a job ad into a company lead. INCLUDED in the per-job price, no surcharge.",
            "default": true
          },
          "fetchJobDetail": {
            "title": "Fetch deep job detail (extra charge)",
            "type": "boolean",
            "description": "One extra request per job: the employer's real ATS requisition number (job_reference, 83% fill), the deeper sub-sector taxonomy, recruiter_id — which separates AGENCY-POSTED from DIRECT-EMPLOYER ads (33% fill) — the ad's allocation date, the blind-ad flag, lat/long, canonical and brand URLs, and the same job's URL on all 31 locale domains. Billed as 'Per deep enrichment'.",
            "default": false
          },
          "fetchCompanyProfile": {
            "title": "Fetch the employer's company profile (extra charge)",
            "type": "boolean",
            "description": "Adds the hiring company's industry, year founded, HQ city/country, benefits list, profile URL and the named recruiters on its profile. Cached per company, so 50 jobs at one bank cost ONE profile request. Requires (and switches on) deep job detail, because the company id lives there. Billed under the same 'Per deep enrichment' event.",
            "default": false
          },
          "descriptionMode": {
            "title": "Job description",
            "enum": [
              "text",
              "html",
              "none"
            ],
            "type": "string",
            "description": "'Plain text' is free — the full description is already on the listing response. 'HTML' comes from the detail endpoint and therefore costs a deep-enrichment charge per row. 'None' drops it, which is the right choice for wide CSV exports.",
            "default": "text"
          },
          "maxItems": {
            "title": "Max jobs per run",
            "minimum": 0,
            "type": "integer",
            "description": "Hard cap on jobs returned — and therefore on what you are billed. Defaults to 50 for a fast, cheap first run. Set 0 for no cap (bounded at 200,000).",
            "default": 50
          },
          "maxCostUsd": {
            "title": "Max cost this run (USD)",
            "minimum": 0,
            "type": "number",
            "description": "Budget guard. The run stops cleanly once the rows it has already delivered add up to this much, so it never charges past your number. 0 = no guard (the row cap above still applies).",
            "default": 0
          },
          "maxPagesPerQuery": {
            "title": "Max pages per search",
            "minimum": 0,
            "type": "integer",
            "description": "Stop each individual search after this many pages. 0 = no per-search limit (the row cap still applies). Useful when you want a shallow slice of many searches rather than a deep dive into one.",
            "default": 0
          },
          "pageSize": {
            "title": "Rows per request",
            "minimum": 1,
            "maximum": 1000,
            "type": "integer",
            "description": "Jobs fetched per API call. Verified working at 15, 25, 50, 100, 200, 500 and 1000 — a single call really does return 1,000 rows. Larger pages mean fewer requests but slower cold-cache responses; 100 is the measured sweet spot.",
            "default": 100
          },
          "startPage": {
            "title": "Start at page",
            "minimum": 1,
            "type": "integer",
            "description": "Begin each search at this page instead of page 1 — for resuming an interrupted deep crawl.",
            "default": 1
          },
          "resumeFromOffset": {
            "title": "Resume from row offset",
            "minimum": 0,
            "type": "integer",
            "description": "Alternative to 'Start at page': resume at this row offset (converted using the page size above). Overrides 'Start at page' when greater than 0.",
            "default": 0
          },
          "depthGuard": {
            "title": "Deep-paging guard (row offset)",
            "minimum": 0,
            "maximum": 59900,
            "type": "integer",
            "description": "The site itself stops serving results past a row offset of about 60,000 per search: offset 59,950 returns rows, 62,450 returns HTTP 500 (bisected live at two page sizes). This actor stops cleanly at the guard and tells you to narrow the search, instead of surfacing the site's 500 as a failed run. Lower it if you want a shallower crawl.",
            "default": 59900
          },
          "sortBy": {
            "title": "Sort results by",
            "enum": [
              "relevance",
              "date"
            ],
            "type": "string",
            "description": "'Newest first' is applied by this actor: the site accepts and echoes a sort parameter but never actually reorders (16 spellings tested), so ordering it server-side would be fiction. Choosing it makes the run collect everything before writing, so the dataset comes out ordered.",
            "default": "relevance"
          },
          "onlyNewSince": {
            "title": "Only jobs posted after (delta feed)",
            "type": "string",
            "description": "ISO timestamp — rows posted at or before it are dropped and never billed. Set this to your last run's finish time and schedule the actor daily or weekly for a pure new-jobs feed."
          },
          "dedupeBy": {
            "title": "De-duplicate by",
            "enum": [
              "id",
              "job_id",
              "none"
            ],
            "type": "string",
            "description": "Which key identifies a job. 'id' is the site's stable job hash and is the safe default. Measured overlap on real crawls: 0.13% within one contiguous band, 1.00% across contiguous pages, 1.5% across overlapping keyword searches — all removed BEFORE anything is billed.",
            "default": "id"
          },
          "deduplicateAcrossQueries": {
            "title": "De-duplicate across searches",
            "type": "boolean",
            "description": "On: a job found by two different searches is returned (and billed) once. Off: each search keeps its own copy, so you can see which search found what — duplicates are still charged only once per search.",
            "default": true
          },
          "flattenLocation": {
            "title": "Flat location columns",
            "type": "boolean",
            "description": "On: city / state / country / region as separate top-level columns, which is what CSV and Google Sheets want. Off: one nested location object.",
            "default": true
          },
          "descriptionMaxChars": {
            "title": "Truncate long text at",
            "minimum": 0,
            "type": "integer",
            "description": "Cut description, summary and company-about text to this many characters — keeps rows small enough for spreadsheets. 0 = keep the full text.",
            "default": 0
          },
          "outputFields": {
            "title": "Output columns",
            "type": "array",
            "description": "Whitelist of column names to keep, e.g. title, company_name, location_city, external_apply_url, posted_date, job_url. Leave empty for every field. The 'id' column is always kept so runs can be joined.",
            "items": {
              "type": "string"
            }
          },
          "includeRawJson": {
            "title": "Attach the raw API object",
            "type": "boolean",
            "description": "Adds a 'raw' column holding the untouched object the site's API returned, for anyone who wants a field this actor does not map.",
            "default": false
          },
          "localeDomain": {
            "title": "Job-URL locale domain",
            "enum": [
              "en_GB",
              "us_US",
              "en_IE",
              "de_DE",
              "en_DE",
              "de_CH",
              "en_CH",
              "fr_CH",
              "fr_FR",
              "en_FR",
              "fr_BE",
              "en_BE",
              "de_LU",
              "en_LU",
              "fr_LU",
              "en_NL",
              "en_IT",
              "en_DK",
              "en_FI",
              "en_SE",
              "en_NO",
              "en_RU",
              "en_ZA",
              "en_GULF",
              "en_HK",
              "en_SG",
              "en_MY",
              "en_CN",
              "us_JP",
              "en_AU",
              "us_CA"
            ],
            "type": "string",
            "description": "Which eFinancialCareers domain the job_url column should point at. All 31 locale domains serve the same job. With deep enrichment on, the exact published URL for the chosen locale is used instead of a constructed one.",
            "default": "en_GB"
          },
          "proxyConfiguration": {
            "title": "Proxy",
            "type": "object",
            "description": "Apify datacenter proxy is the right setting and the default. Measured on one identical URL: direct 766 ms, datacenter 1,125 ms, residential GB 2,403 ms, residential US 4,749 ms — all returning the same rows. Residential costs 2-4x the latency for zero benefit here.",
            "default": {
              "useApifyProxy": true
            }
          },
          "proxyCountry": {
            "title": "Proxy country (optional)",
            "type": "string",
            "description": "Two-letter country code to pin the proxy exit to, e.g. GB or US. Country pinning is only offered by proxy groups that have per-country exits - Apify's shared DATACENTER pool does not. If the group you picked cannot honour the code, the actor says so and carries on without the pin rather than losing your run; switch the proxy group to RESIDENTIAL if you truly need a fixed country. Leave empty for the fastest path."
          },
          "maxConcurrency": {
            "title": "Max parallel requests",
            "minimum": 1,
            "maximum": 20,
            "type": "integer",
            "description": "Parallelism for the enrichment requests. Search pages are always fetched one at a time, in order. Keep this modest: the site's CDN answers cold-cache requests in up to 32 seconds and hammering it buys nothing.",
            "default": 5
          },
          "requestTimeoutSecs": {
            "title": "Request timeout (seconds)",
            "minimum": 10,
            "maximum": 300,
            "type": "integer",
            "description": "Per-request timeout. 60 is deliberate — a 45-second timeout tripped on genuinely-working cold-cache responses during testing.",
            "default": 60
          },
          "maxRetriesPerRequest": {
            "title": "Retries per request",
            "minimum": 1,
            "maximum": 10,
            "type": "integer",
            "description": "Not optional. Measured over 53 sustained calls: 90.6% succeeded first try and 100% within 3 tries. Every single miss was a transient CDN fault (connection reset, truncated body, cold-cache timeout) — there were no blocks, no 403s and no CAPTCHAs at any point.",
            "default": 3
          },
          "crawlDelaySecs": {
            "title": "Delay between requests (seconds)",
            "minimum": 0,
            "maximum": 60,
            "type": "number",
            "description": "Politeness pause between consecutive search pages. Default 0: the robots.txt asking for crawl-delay 10 belongs to www.efinancialcareers.*, a host this actor never fetches — all data comes from the site's own JSON API host, whose robots.txt returns 404 with no directives. Raise it to throttle anyway.",
            "default": 0
          }
        }
      },
      "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}