# Visa Sponsorship Jobs: H-1B & Relocation Jobs with Evidence (`data-done-right/visa-sponsorship-jobs`) Actor

Find visa sponsorship jobs on company career pages. Each job is classified from its text (yes, likely, unclear, no) with the exact sentence as evidence. Lists H-1B and other visa types, relocation support and jobs that sponsor visas, from Greenhouse, Lever and Ashby.

- **URL**: https://apify.com/data-done-right/visa-sponsorship-jobs.md
- **Developed by:** [Data Done Right](https://apify.com/data-done-right) (community)
- **Categories:** Jobs, Lead generation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.96 / 1,000 job delivereds

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

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

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
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.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

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

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## Visa Sponsorship Jobs: H-1B & Relocation Jobs with Evidence

Find **visa sponsorship jobs** straight from company career pages. This Actor reads the public job-board APIs of **Greenhouse, Lever, Ashby, Workable, Recruitee and Workday**, reads the full text of every posting, and classifies what the posting says about **H-1B and other visa sponsorship** and **relocation**. Every job comes with the **exact sentence** the verdict is based on, so you can check it in seconds instead of trusting a keyword match.

It is a different product from the *ATS Jobs Scraper* (which lists all jobs of a company): this one answers one question, "does this posting say they sponsor?", and filters on the answer.

### What you get for each job

- **`sponsorship`**: `yes` (the post says it sponsors), `likely` (hedged or indirect: "may", "case by case", "for the right candidate"), `unclear` (no clear statement) or `no` (the post says it cannot sponsor).
- **`sponsorshipEvidence`**: the sentence behind the verdict (max 300 characters). If a post says both things, the verdict is `unclear` and the evidence shows both: `+ positive sentence || - negative sentence`.
- **`visaTypes`**: H-1B, H-1B1, E-3, TN, O-1, L-1, J-1, F-1/OPT, Green Card, PERM, Skilled Worker, Blue Card, Global Talent, LMIA, Employment Pass, 482 and more, when the post names them next to its sponsorship or support statement.
- **`relocationSupport`**: `true` when the post offers relocation help (assistance, package, bonus). "No relocation assistance" gives `false`.
- Company, title, location, **country** (when it can be derived reliably), remote, department, employment type, posted date, salary fields when the board publishes them, `applyUrl`, `jobUrl`, `source` (greenhouse, lever, ashby, ...), `jobId`, `scrapedAt`.

### How to find visa sponsorship jobs

1. Paste the career-page URLs of the companies you care about into **Companies** (`https://boards.greenhouse.io/verkada`, `https://jobs.lever.co/zoox`, `https://jobs.ashbyhq.com/sentry`, Workday, Workable and Recruitee URLs work too). A plain company name also works: the Actor tries to find the board.
2. Optionally set **Job title keywords**, **Locations or countries** and **Posted within (days)**.
3. Choose the **Sponsorship filter** (default: positive only) and run it. Turn on **Only jobs new since my last run** and schedule it daily for alerts.

### Jobs that sponsor visas: filter modes

| Sponsorship filter | Delivers |
|---|---|
| `positive` (default) | `yes` + `likely` |
| `positive-and-unclear` | `yes` + `likely` + `unclear` |
| `all` | every job, including `no` |

Tick **Also include jobs that say they cannot sponsor** to add `no` rows to any mode. **Max jobs** is a global cap across all companies and also caps your cost.

### Input example

```json
{
  "companies": ["https://boards.greenhouse.io/verkada", "https://jobs.lever.co/zoox", "https://jobs.ashbyhq.com/sentry"],
  "keywords": ["engineer"],
  "locations": ["Germany", "United Kingdom"],
  "sponsorshipFilter": "positive",
  "postedWithinDays": 30,
  "maxJobs": 200,
  "onlyNew": false
}
```

### Output example

```json
{
  "company": "Verkada",
  "title": "Account Executive, Benelux",
  "location": "London",
  "country": null,
  "remote": null,
  "department": "International",
  "employmentType": null,
  "postedAt": "2026-10-07T05:33:51-04:00",
  "sponsorship": "yes",
  "sponsorshipEvidence": "We do sponsor and take over sponsorship of employment visas for this role.",
  "visaTypes": [],
  "relocationSupport": false,
  "salaryMin": null, "salaryMax": null, "salaryCurrency": null, "salaryPeriod": null, "salaryText": null,
  "applyUrl": "https://job-boards.greenhouse.io/verkada/jobs/...",
  "jobUrl": "https://job-boards.greenhouse.io/verkada/jobs/...",
  "source": "greenhouse",
  "jobId": "...",
  "scrapedAt": "2026-10-25T15:39:28Z"
}
```

### How the sponsorship classifier works

It is a fixed set of text rules, not a language model, so the same text always gets the same answer.

- It splits the post into sentences and only looks at sentences where "sponsor" is used in a **visa or employment sense**. Event sponsorship, executive sponsors, sponsor banks, clinical-trial sponsors, "sponsored by" and "Sponsorship Manager" job titles are ignored.
- **Positive**: "we will sponsor", "visa sponsorship available / provided / offered", "we sponsor H-1B", "H-1B transfers", "sponsorship for qualified candidates", "relocation and visa support", "Skilled Worker visa", "Blue Card", TN / E-3 / O-1 sponsorship.
- **Negative**: "unable to sponsor", "do not sponsor", "will not provide visa sponsorship", "without sponsorship", "must be authorized to work ... without sponsorship now or in the future", "no visa sponsorship", "sponsorship is not available".
- **Neutral**: equal-opportunity boilerplate, questions ("Will you now or in the future require sponsorship?"), and plain "must be authorized to work in the US" lines are not counted either way.
- **Negative beats positive** inside one sentence. A positive sentence about *other* roles ("we sponsor for many other roles") never overrides "this role does not offer sponsorship". Real conflicts give `unclear` with both sentences in the evidence.

### Accuracy and limits (please read)

- **This classifies the text of the job post. It is not legal advice and not a guarantee.** `yes` means the posting says so; the employer decides case by case, and visa rules change. Always confirm with the employer.
- **Most postings say nothing about sponsorship.** In our own check of about 12,800 postings on 64 public Greenhouse, Lever and Ashby boards (mostly large US tech companies), about 1.3% were `yes`/`likely`, about 4.7% were `no` and about 94% were `unclear`. Expect few rows per company with the default `positive` filter; add more companies or use `positive-and-unclear`.
- **English text only.** Postings in other languages are usually `unclear`.
- A sponsorship statement that sits in a separate PDF, an image or a different web page is not seen. Only the text the board publishes is read.
- Rare wording will be missed (`unclear`), and a few unusual double negatives can be read the wrong way. The evidence sentence is there so you can verify a row quickly.
- `country` is only filled when the board gives a country or the location text ends in a country name or US state; otherwise it is `null`. The **Locations** filter also matches the raw location text.
- **SmartRecruiters** boards are skipped (their public API has no job text, so nothing can be classified) and a note says so. **Workday** list pages carry no description, so at most 500 jobs per Workday board (and at most 5 times Max jobs) are read; narrow with keywords or locations on huge tenants.
- You choose the companies. The Actor does not discover every employer that sponsors.
- It reads public job-board APIs only: no login, no private data, no LinkedIn or Indeed.

### How much does it cost

Pay per event: **$1.20 per 1,000 delivered jobs** ($0.0012 per job), plus the small standard Actor start fee. You are charged only for jobs that are actually delivered (after the sponsorship filter), never for jobs that were read and filtered out. **Max jobs** caps the cost of a run. Apify's free monthly credit covers thousands of jobs.

### FAQ

#### How do I find jobs that sponsor H-1B visas?

Add the career pages of companies you want, keep the default filter (`positive`) and read `sponsorshipEvidence` for the exact sentence. Use `visaTypes` to see which visas (H-1B, E-3, TN, O-1...) the posting names.

#### Does `sponsorship: "yes"` mean I will get sponsored?

No. It means the job posting states that the company sponsors or supports visas. Hiring and sponsorship decisions are the employer's, and the statement may only cover some locations or candidates.

#### Why are so many jobs `unclear`?

Most employers write nothing about sponsorship except an equal-opportunity paragraph. We do not guess: no clear statement means `unclear`.

#### What is the difference between `yes` and `likely`?

`yes` is an unconditional statement ("we sponsor", "visa sponsorship available"). `likely` is hedged ("may be available", "case by case", "for the right candidate", "we will make every reasonable effort").

#### Can it find relocation jobs?

Yes. `relocationSupport` is `true` when the post offers relocation assistance, a package or a bonus. Combine it with the sponsorship filter to find roles with both.

#### Is this legal and do I need a login?

It reads the public job-board APIs that Greenhouse, Lever, Ashby, Workable, Recruitee and Workday expose for career sites. No login and no API key. This is not legal advice; check the rules that apply to you if you republish job data.

### Use with AI agents / MCP

Connect Apify's MCP server (mcp.apify.com) to Claude, ChatGPT or Cursor and the agent can call this Actor itself. Example prompt: "Which of Verkada's and Flexport's open jobs in Europe say they sponsor visas? Quote the sentence." The only required input is `companies`; ask for `sponsorshipFilter: "positive"` and the agent gets structured rows with the evidence sentence it can quote. The output is flat JSON, so it also works with the Apify API, Python and JavaScript clients, Make, Zapier and n8n.

### Related tools

- **ATS Jobs Scraper**: lists every open job of a company from Greenhouse, Lever, Ashby, Workday and more, without any sponsorship classification.
- **Remote Jobs Scraper**: remote jobs from several public job boards in one feed.

# Actor input Schema

## `companies` (type: `array`):

Careers page URLs (boards.greenhouse.io/x, jobs.lever.co/x, jobs.ashbyhq.com/x, apply.workable.com/x, x.recruitee.com, x.wd5.myworkdayjobs.com/Site) or plain company names (we probe Greenhouse, Lever, Ashby, Workable and Recruitee for a matching board). SmartRecruiters boards are skipped because their public API has no job text.

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

Optional. Keep only jobs whose title contains any of these words (for example engineer, data, designer).

## `locations` (type: `array`):

Optional. Keep only jobs whose location text or detected country contains any of these (for example Germany, London, United States, remote).

## `sponsorshipFilter` (type: `string`):

positive = jobs whose text says they sponsor (yes) or probably do (likely). positive-and-unclear also keeps jobs with no clear statement. all keeps every job, including those that say they cannot sponsor.

## `includeNegative` (type: `boolean`):

Adds jobs classified sponsorship = no (for example 'we are unable to sponsor') to any filter mode. Off by default.

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

Keep only jobs posted in the last N days. Jobs without a posted date are kept.

## `maxJobs` (type: `integer`):

Total number of jobs delivered across all companies. Also caps your cost (you pay per delivered job).

## `onlyNew` (type: `boolean`):

Remembers delivered jobs and returns only new ones next time. Perfect for daily schedules and alerts.

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

Not needed for these public job-board APIs. Enable only if you scan hundreds of Workday sites.

## Actor input object example

```json
{
  "companies": [
    "https://boards.greenhouse.io/verkada",
    "https://boards.greenhouse.io/affirm",
    "https://boards.greenhouse.io/flexport",
    "https://boards.greenhouse.io/scaleai",
    "https://jobs.lever.co/zoox",
    "https://jobs.ashbyhq.com/sentry"
  ],
  "sponsorshipFilter": "positive",
  "includeNegative": false,
  "maxJobs": 25,
  "onlyNew": false,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

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

All delivered jobs (the default dataset) with sponsorship class and evidence, as JSON, CSV, Excel and more.

## `records` (type: `string`):

Key-value store records: SUMMARY (counts per class), NOTES (boards that failed or were skipped) and files.

# 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 = {
    "companies": [
        "https://boards.greenhouse.io/verkada",
        "https://boards.greenhouse.io/affirm",
        "https://boards.greenhouse.io/flexport",
        "https://boards.greenhouse.io/scaleai",
        "https://jobs.lever.co/zoox",
        "https://jobs.ashbyhq.com/sentry"
    ],
    "maxJobs": 25
};

// Run the Actor and wait for it to finish
const run = await client.actor("data-done-right/visa-sponsorship-jobs").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 = {
    "companies": [
        "https://boards.greenhouse.io/verkada",
        "https://boards.greenhouse.io/affirm",
        "https://boards.greenhouse.io/flexport",
        "https://boards.greenhouse.io/scaleai",
        "https://jobs.lever.co/zoox",
        "https://jobs.ashbyhq.com/sentry",
    ],
    "maxJobs": 25,
}

# Run the Actor and wait for it to finish
run = client.actor("data-done-right/visa-sponsorship-jobs").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 '{
  "companies": [
    "https://boards.greenhouse.io/verkada",
    "https://boards.greenhouse.io/affirm",
    "https://boards.greenhouse.io/flexport",
    "https://boards.greenhouse.io/scaleai",
    "https://jobs.lever.co/zoox",
    "https://jobs.ashbyhq.com/sentry"
  ],
  "maxJobs": 25
}' |
apify call data-done-right/visa-sponsorship-jobs --silent --output-dataset

```

## MCP server setup

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

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/vGmzz6HzFMjcr4NBo/builds/hfO4lcOhc6ye0njQl/openapi.json
