# ✅ 🌐 visa-sponsorship-jobs-scraper 🚀 (`alireza.nezami/visa-sponsorship-jobs-scraper`) Actor

Find jobs that can sponsor a work visa. Scrapes public ATS boards (Greenhouse, Lever, Ashby) and matches employers to the UK Skilled Worker sponsor register and US H-1B filing signals. Filter by country, seniority, salary, and remote. Optional AI relevance scoring. Evidence of sponsorship capability

- **URL**: https://apify.com/alireza.nezami/visa-sponsorship-jobs-scraper.md
- **Developed by:** [Alireza Nezami](https://apify.com/alireza.nezami) (community)
- **Categories:** Jobs, Lead generation
- **Stats:** 1 total users, 0 monthly users, 100.0% runs succeeded, 1 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.00 / 1,000 results

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/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
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.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — 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

## Visa Sponsorship Jobs Intelligence Feed

> Cross-referenced directly with official immigration registries (UK Home Office & US DOL LCA). Filter out noise, avoid unverified listings, and automate daily job tracking with zero duplicate charges.

Stop wasting time on job listings that secretly require existing citizenship or permanent residency. Most job scrapers return thousands of listings that explicitly require work authorization. This Actor cross-references employer names against **official government sponsor registers** (UK Home Office Skilled Worker Register & US Department of Labor LCA disclosure filings) and verified global tech sponsor programs with **atomic Pay-Per-Event (PPE) monetization**.

> \[!NOTE]
> **Data Sources & Limitations Disclaimer**:
> This Actor checks employer eligibility against official government sponsor registries and confirmed corporate sponsorship programs. **Registration on a sponsor list signifies legal capacity and license to sponsor, not a guarantee that a specific individual opening will offer visa sponsorship or relocation assistance.** Job seekers should always verify specific sponsorship terms directly with the employer.

***

### ⚡ Memory & Execution Sizing

- **Standard Runs (Default ATS & Public Boards)**: **1024 MB** memory is recommended.
- **Overseas Expansion with Detail Fetching (`overseasFetchDetails: true`)**: **2048 MB** memory and `maxRuntimeSecs ≥ 900` is recommended.

***

### 🎟️ Pay-Per-Event (PPE) Pricing

You only pay for verified, delivered results matching your search criteria:

| Event | Description | Price |
| :--- | :--- | :--- |
| `apify-actor-start` | Actor start fee *(Configured in Apify Console)* | $0.05 / run |
| `job-result` | Per normalized job returned | $2.00 / 1,000 jobs |
| `visa-enriched-job` | Per job verified against official government registers or known sponsor allowlists | +$1.00 / 1,000 jobs |
| `ai-classified-job` | Per job analyzed with AI technical scoring *(Requires user-supplied LLM API key)* | +$3.00 / 1,000 jobs |
| `overseas-job` | Per job from the overseas expansion pack | +$1.50 / 1,000 jobs |

#### Cost Estimation Matrix

| Mode / Permutation | Typical Cost (per 1,000 Jobs) | Included Events | Recommended Use Case |
| :--- | :--- | :--- | :--- |
| **Standard Mode** | **$3.00 – $4.00** | `job-result` | General tech & remote job scraping from ATS platforms. |
| **Visa Verified** | **$5.00 – $6.50** | `job-result` + `visa-enriched-job` | Candidates seeking verified UK/US visa sponsorship eligibility. |
| **Global Corridor** | **$6.50 – $8.00** | `job-result` + `visa-enriched-job` + `overseas-job` | International relocations and agency-sponsored corridors. |
| **Full Intelligence** | **$9.00 – $11.00** | `job-result` + `visa-enriched-job` + `overseas-job` + `ai-classified-job` | High-precision screening with deep AI role relevance scoring. |

*Filtered-out and duplicate listings are NEVER charged.*

***

### 🛡️ Anti-Duplicate & Zero-Liability Guarantees

1. **Atomic Charge-Before-Push**: Every record is charged before push. If your Apify Actor spending limit is reached, uncharged records are discarded immediately.
2. **Cross-Run Deduplication**: When `deduplicationAcrossRuns: true` is enabled, repeat scheduled runs remember previously seen job fingerprints in a persistent Named Key-Value store (`visa-jobs-dedup-state`). You are never double-billed for identical jobs.
3. **Zero Operator LLM Liabilities**: AI classification uses a Zero-Liability model requiring a user-supplied API key (`llmApiKey`). If omitted, AI evaluation gracefully bypasses without error, and 0 `ai-classified-job` charges occur.

***

### ⚡ Enriched Visa Intelligence Output (camelCase)

Every dataset record delivers clean, normalized camelCase JSON:

```json
{
  "id": "gh-stripe-4921049",
  "title": "Senior Machine Learning Infrastructure Engineer",
  "company": "Stripe",
  "companyNormalized": "stripe",
  "location": "London, United Kingdom",
  "locations": ["London, United Kingdom"],
  "remote": true,
  "remoteType": "region_restricted",
  "employmentType": "full_time",
  "seniority": "senior",
  "salaryMin": 110000,
  "salaryMax": 150000,
  "salaryCurrency": "GBP",
  "postedAt": "2026-08-22T08:30:00Z",
  "applyUrl": "https://boards.greenhouse.io/stripe/jobs/4921049",
  "jobUrl": "https://boards.greenhouse.io/stripe/jobs/4921049",
  "source": "greenhouse",
  "ats": "greenhouse",
  "technologies": ["Python", "PyTorch", "Kubernetes", "Ray", "CUDA"],
  
  "visaSignal": "on_sponsor_list",
  "visaConfidence": 0.85,
  "visaType": "UK Skilled Worker",
  "visaSponsorMeta": {
    "matched_sponsor": "Stripe Payments UK Limited",
    "country": "GB",
    "rating": "A",
    "routes": ["Skilled Worker"]
  },
  "authFit": "sponsor_required_and_plausible",

  "relevanceScore": 0.94,
  "compositeScore": 0.91,
  "opportunityScore": 91,
  "classificationReason": "Core ML platform engineering role managing distributed GPU training clusters.",
  "isAiRole": true
}
```

***

### 📦 Run Output & Reports

Every run produces a **machine-readable Dataset** *and* a set of **human-friendly reports**, so you get both an API-ready feed and a polished intelligence summary.

**Output tab links** (defined in the Actor output schema):

| Output | What it is |
|---|---|
| 📊 **Jobs Dataset** | All normalized, visa-enriched jobs. Canonical output for APIs, automation, and CSV/Excel/JSON export. Ordered by `opportunityScore` in the Console table. |
| 🌐 **HTML Report** | Beautiful standalone report: key statistics, top opportunities, country / company / visa / source breakdowns, methodology, and disclaimers. Opens directly in the Output tab. |
| 📄 **Run Summary (JSON)** | Machine-readable run summary — search criteria, statistics, top matches, and aggregations. Useful for downstream agents and pipelines. |
| 📈 **Run Statistics** | Low-level pipeline execution statistics (fetched, filtered, deduplicated, enriched, duration, source health). |

**New dataset column — `opportunityScore` (0–100):** a single transparent ranking number (`compositeScore × 100`) combining visa evidence, relevance, recency, seniority fit, salary, and source trust. Sort the Dataset by it descending to surface the strongest opportunities first.

**Top-opportunity cards** in the HTML report show, per job: opportunity score, title, company, location + country, visa evidence badge with explanation, seniority/employment, remote/hybrid, salary, technologies, posted date, the data-backed reasons it is recommended, and a direct **Apply** link.

**Empty runs are still useful:** if no jobs match, the report explains how many jobs and sources were scanned and gives concrete suggestions to broaden the search.

> Reports are generated from the already-produced pipeline results — no extra fetching, no extra billing.

***

### 🛡️ What Makes This Different?

- **🛂 Official Visa Intelligence**: Checks company names against confirmed visa sponsor allowlists, official UK Skilled Worker sponsor registers, and US DOL LCA historical filings.
- **📊 7-Tier Signal Model**:
  - `stated_in_jd` (1.00): Job description explicitly mentions visa sponsorship or relocation support.
  - `known_sponsor` (0.95): Confirmed top employer with large-scale global visa sponsorship programs (Google, Amazon, Meta, Microsoft, Stripe, OpenAI, Anthropic, etc.).
  - `on_sponsor_list` (0.85): Company is an active licensed sponsor on official government registers.
  - `employer_sponsored_region` (0.70): Destination uses an employer-sponsored work-permit model (Gulf/EPS/SSW) — overseas pack only, not a registry match.
  - `historical_filings` (0.65): Company has certified US DOL LCA filings in the past 12 months.
  - `unknown` (0.25): No explicit signal either way.
  - `explicit_no` (0.00): Job explicitly states no sponsorship is available (filtered out by default).
- **📡 Multi-ATS Coverage**: Public API endpoints for Greenhouse, Lever, Ashby, Workable, SmartRecruiters, Personio, RemoteOK, Remotive, Arbeitnow, Himalayas, HN Who's Hiring, and Jobicy.
- **🤖 Optional AI Classification**: Provider-agnostic LLM relevance evaluation (Gemini, Groq, OpenRouter) scoring tech stack match quality.
- **⚡ Fast, HTTP-First Architecture**: Lightweight API requests without heavy headless browser overhead.

***

### ⚙️ Input Parameters

| Parameter | Type | Default | Description |
|---|---|---|---|
| `keywords` | `array` | `[]` | Job titles, skills, or stack terms (e.g. `["Machine Learning", "Kotlin", "Python"]`). Supports permissive synonyms (e.g. SWE ↔ Software Engineer). |
| `countries` | `array` | `[]` | Country filter (supports 69+ countries across Europe, East Asia, Americas, Arab countries, and more). |
| `visaSponsorshipOnly` | `boolean` | `true` | When true, returns jobs with confirmed sponsorship signals (`known_sponsor`, `on_sponsor_list`, `stated_in_jd`, `historical_filings`, `employer_sponsored_region`). |
| `includeUnknownVisa` | `boolean` | `false` | When `visaSponsorshipOnly` is enabled, set to true to also include unknown visa status jobs. |
| `minVisaConfidence` | `string` | `"unknown"` | Minimum required confidence (`"unknown"`, `"historical_filings"`, `"employer_sponsored_region"`, `"on_sponsor_list"`, `"known_sponsor"`, `"stated_in_jd"`). |
| `sources` | `array` | `["greenhouse", "lever", ...]` | Target ATS endpoints and job boards to query. |
| `companyUrls` | `array` | `[]` | Specific ATS career page URLs to auto-extract. |
| `postedWithinDays` | `integer` | `60` | Maximum posting age in days. |
| `enableAIClassification` | `boolean` | `false` | Enable LLM technical relevance scoring. |
| `maxResults` | `integer` | `500` | Maximum jobs to return. |

***

### 🔌 Integration Example (Python SDK)

```python
from apify_client import ApifyClient

client = ApifyClient("YOUR_APIFY_TOKEN")
run = client.actor("alireza_nezami/visa-sponsorship-jobs-scraper").call(
    run_input={
        "keywords": ["Machine Learning", "Python"],
        "countries": ["United Kingdom"],
        "visaSponsorshipOnly": True,
        "includeUnknownVisa": False,
        "maxResults": 100
    }
)

for job in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(f"{job['company']} - {job['title']} (Signal: {job['visaSignal']}, Score: {job['visaConfidence']}) -> {job['applyUrl']}")
```

***

### 🌍 Overseas Expansion (Optional)

> **Off by default.** Nothing changes unless you set `enableOverseasSources: true`.

This optional pack adds **248 build-time-verified overseas sources** for the India/Pakistan/Bangladesh → Gulf, Europe, East Asia, Canada and Australia migration corridors: government labor portals, licensed manpower agencies, niche job boards, aggregators, and visa-specialist sites. Sources were DNS+HTTP probed before inclusion and are shipped as a curated data file — they are never invented or auto-discovered at runtime. This Actor does not scrape LinkedIn, Indeed, or Glassdoor; those domains (plus ZipRecruiter, Monster, CareerBuilder, SimplyHired, Snagajob, Ladders and Dice) are hard-blacklisted and unfetchable. Overseas sources are public pages fetched with robots.txt respect and per-host rate limits.

**Categories** (selectable via `overseasCategories`): `government`, `manpower_agency`, `aggregator`, `remote_board`, `visa_specialist`, `unknown_board`.

#### An honest visa signal: `employer_sponsored_region`

Jobs from Gulf and East-Asia destinations can never match the UK/US sponsor registries. The destination-country employment model (UAE/Saudi/Qatar/Kuwait/Oman/Bahrain work permits, Japan SSW, Korea EPS E-9) is **employer-sponsored by construction**, so these jobs get their own confidence level instead of being dropped:

- `employer_sponsored_region` (0.70): destination uses an employer-sponsored work-permit model. **This is NOT a verified registry match** — it records the destination's employment model honestly. If the job description itself mentions sponsorship, the stronger `stated_in_jd` signal is kept instead; `explicit_no` always wins and the job is excluded.

#### Overseas input parameters

| Parameter | Type | Default | Description |
|---|---|---|---|
| `enableOverseasSources` | `boolean` | `false` | Include the 248 verified overseas sources. Raise `maxRuntimeSecs` to ≥ 900 when enabling. |
| `overseasCategories` | `array` | all six | Source categories to include. |
| `overseasDestinationCountries` | `array` | `[]` (all) | Keep only jobs for these destinations (jobs with unknown destination are kept). |
| `overseasMaxSourcesPerRun` | `integer` | `150` | Max sources fetched per run (10–573). |
| `overseasConcurrency` | `integer` | `20` | Concurrent overseas page fetches (5–40). |
| `overseasBudgetSecs` | `integer` | `600` | Time budget in seconds (60–3000, auto-clamped to 80% of `maxRuntimeSecs`). |
| `overseasFetchDetails` | `boolean` | `false` | Fetch job detail pages for richer descriptions and better dedup (slower, more requests). |
| `overseasMaxDetailFetches` | `integer` | `300` | Max detail-page fetches per run (0–2000). |
| `overseasSimhashDedup` | `boolean` | `true` | SimHash near-duplicate removal for copy-pasted agency JDs. |
| `respectRobotsTxt` | `boolean` | `true` | Honor robots.txt on overseas domains. |

#### Sample overseas record

```json
{
  "id": "ov-gulfagency.example-8f2c1a9b3e4d5c67",
  "title": "Mason – Dubai construction vacancy",
  "company": "Al Rashid Manpower",
  "location": "Dubai",
  "country": "UAE",
  "salaryMin": 2500,
  "salaryCurrency": "AED",
  "salaryPeriod": "month",
  "applyUrl": "https://gulfagency.example/vacancies/mason-dubai/",
  "source": "overseas",
  "ats": "gulfagency.example",
  "sourceCategory": "manpower_agency",
  "destinationCountry": "UAE",
  "visaSignal": "employer_sponsored_region",
  "visaConfidence": 0.7,
  "visaType": "UAE Work Permit"
}
```

*When enabling overseas in the Actor UI: set `maxRuntimeSecs ≥ 900` and consider raising memory to 2048 MB if also enabling `overseasFetchDetails`.*

# Actor input Schema

## `visaSponsorshipOnly` (type: `boolean`):

Only return jobs with confirmed sponsorship signals (official sponsor lists, historical filings, or explicit JD statements).

## `keywords` (type: `array`):

Job titles or skills to search for (e.g., Software Engineer, Machine Learning, Android, Python).

## `countries` (type: `array`):

Filter by target countries (Europe, East Asia, Americas, Arab countries, and more).

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

Only return fully remote positions.

## `seniorityLevels` (type: `array`):

Filter by seniority level (leave empty for all).

## `maxResults` (type: `integer`):

Maximum number of jobs to return.

## `postedWithinDays` (type: `integer`):

Only include jobs posted in the last N days.

## `enableAIClassification` (type: `boolean`):

Use AI to score job relevance (0-100). Requires your own LLM API key (Zero-Liability model).

## `llmProvider` (type: `string`):

AI provider to evaluate candidate jobs.

## `llmApiKey` (type: `string`):

Your Google Gemini or Groq API key. If omitted when AI is enabled, AI evaluation is gracefully skipped without errors or extra charges.

## `maxAICalls` (type: `integer`):

Maximum candidate jobs to score with AI per run.

## `sources` (type: `array`):

Select specific ATS platforms and job boards to query (leave empty to search all 12 available sources by default).

## `visaRegistryCountries` (type: `array`):

Official sponsor registries to check against.

## `minVisaConfidence` (type: `string`):

Minimum confidence level required.

## `includeUnknownVisa` (type: `boolean`):

Include jobs where sponsorship status is unknown (only when Visa Sponsorship Only is enabled).

## `deduplicationAcrossRuns` (type: `boolean`):

Remember seen job postings in a persistent Key-Value Store to avoid duplicate charges on scheduled runs.

## `deduplicationTtlDays` (type: `integer`):

Number of days to remember previously seen job postings.

## `resetDedupState` (type: `boolean`):

Wipe historical job fingerprint memory and start fresh on this run.

## `proxyConfiguration` (type: `object`):

Use Apify Standard Proxy to prevent geo-blocking and rate limits.

## `refreshRegistries` (type: `boolean`):

Attempt downloading the latest UK Home Office live register on startup (falls back to bundled database on timeout).

## `employmentTypes` (type: `array`):

Filter by contract type.

## `sortBy` (type: `string`):

How to sort results.

## `includeDescription` (type: `boolean`):

Include full job description text in output.

## `concurrency` (type: `integer`):

Number of sources to fetch in parallel (advanced).

## `maxRuntimeSecs` (type: `integer`):

Maximum run time in seconds before timeout.

## Actor input object example

```json
{
  "visaSponsorshipOnly": true,
  "keywords": [
    "Software Engineer",
    "Machine Learning"
  ],
  "countries": [
    "United Kingdom",
    "Germany",
    "United States",
    "United Arab Emirates"
  ],
  "remoteOnly": false,
  "seniorityLevels": [],
  "maxResults": 500,
  "postedWithinDays": 60,
  "enableAIClassification": false,
  "llmProvider": "gemini",
  "maxAICalls": 50,
  "sources": [],
  "visaRegistryCountries": [
    "UK",
    "US"
  ],
  "minVisaConfidence": "unknown",
  "includeUnknownVisa": false,
  "deduplicationAcrossRuns": true,
  "deduplicationTtlDays": 30,
  "resetDedupState": false,
  "proxyConfiguration": {
    "useApifyProxy": true
  },
  "refreshRegistries": false,
  "employmentTypes": [],
  "sortBy": "composite_score",
  "includeDescription": true,
  "concurrency": 10,
  "maxRuntimeSecs": 300
}
```

# Actor output Schema

## `results` (type: `string`):

All normalized visa-enriched jobs as JSON. Canonical machine-readable output; exportable to CSV/Excel/JSON via the Dataset API.

## `reportHtml` (type: `string`):

Beautiful standalone run report: key statistics, top opportunities, country / company / visa / source breakdowns, and methodology.

## `reportJson` (type: `string`):

Machine-readable run summary: search criteria, statistics, top matches, and aggregations. Useful for API consumers and AI agents.

## `runStats` (type: `string`):

Low-level pipeline execution statistics (fetched, filtered, deduplicated, enriched, duration, source health).

# 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 = {
    "keywords": [
        "Software Engineer",
        "Machine Learning"
    ],
    "countries": [
        "United Kingdom",
        "Germany",
        "United States",
        "United Arab Emirates"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("alireza.nezami/visa-sponsorship-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 = {
    "keywords": [
        "Software Engineer",
        "Machine Learning",
    ],
    "countries": [
        "United Kingdom",
        "Germany",
        "United States",
        "United Arab Emirates",
    ],
}

# Run the Actor and wait for it to finish
run = client.actor("alireza.nezami/visa-sponsorship-jobs-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "keywords": [
    "Software Engineer",
    "Machine Learning"
  ],
  "countries": [
    "United Kingdom",
    "Germany",
    "United States",
    "United Arab Emirates"
  ]
}' |
apify call alireza.nezami/visa-sponsorship-jobs-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,alireza.nezami/visa-sponsorship-jobs-scraper"
        }
    }
}

```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/jkSQ6boQek7d8LJWY/builds/ck329UY6YFXT0Ldfd/openapi.json
