# FlexJobs Jobs Scraper (`parsebird/flexjobs-jobs-scraper`) Actor

Scrape remote and flexible job listings from FlexJobs by keyword, location, and country. Get job title, location, salary, schedule, remote type, posting date, and apply URL. Export as JSON, CSV, or Excel.

- **URL**: https://apify.com/parsebird/flexjobs-jobs-scraper.md
- **Developed by:** [ParseBird](https://apify.com/parsebird) (community)
- **Categories:**
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 1 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.79 / 1,000 job scrapeds

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?

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

### FlexJobs Jobs Scraper

Scrape remote and flexible job listings from **[FlexJobs](https://www.flexjobs.com)** — the curated job board for remote, hybrid, freelance, and part-time work — into clean, structured JSON. The FlexJobs Jobs Scraper searches by keyword, location, and country and pulls the job title, location, salary range, schedule, remote type, career level, benefits, categories, posting date, and a direct link to each listing, without a FlexJobs login or the FlexJobs API.

<table><tr>
<td style="border-left:4px solid #1C1917;padding:12px 16px;font-weight:600">
Search any keyword across any location, filter by job type, employer, and posting date, then walk as many result pages as you need — 50 jobs per page — and get 25+ structured fields per listing ready for analysis, monitoring, or integration.
</td>
</tr></table>

##### Copy to your AI assistant

Copy this block into ChatGPT, Claude, Cursor, or any LLM to start using this actor.

```
Actor: parsebird/flexjobs-jobs-scraper (Apify). Scrapes remote/flexible job listings from flexjobs.com by keyword, location, and country. Call with ApifyClient.
Input JSON fields: includeKeyword: string (required) — job title/skill/search term, e.g. "software engineer, python" (commas = OR); locationName: string — city/state/region, e.g. "New York, NY"; countryName: string (default "all") — "usa", "uk", "india", "all", or any country name; pagesToFetch: int (default 1) — result pages to walk, 50 jobs each; companyName: string — restrict to one employer (note: FlexJobs hides employer names from non-members); jobType: "FULLTIME" | "PARTTIME" | "CONTRACTOR" | "INTERN"; datePosted: "all" | "today" | "3days" | "week" | "month"; proxyConfiguration: object — UNBLOCKER proxy group is required and set by default.
Output: one dataset item per job — job_title, company_name, location, posted_via, salary, date, job_type, URL, job_id, slug, description, remote_option, is_fully_remote, schedule, employment_category, career_level, education_levels, job_benefits, categories, salary_min, salary_max, salary_currency, salary_period, allowed_candidate_locations, travel_required, posted_at, expire_at, scraped_at.
Example: { "includeKeyword": "software engineer, python", "locationName": "new york", "countryName": "usa", "jobType": "FULLTIME", "datePosted": "week", "pagesToFetch": 3 }
API: https://api.apify.com/v2/acts/parsebird~flexjobs-jobs-scraper  ·  Token: https://console.apify.com/account/integrations
```

### What does FlexJobs Jobs Scraper do?

[FlexJobs](https://www.flexjobs.com) hand-screens listings for remote, hybrid, freelance, and part-time roles across 50+ career categories. There is no public FlexJobs API — this scraper reads the site's own job-search results instead, so you get the same jobs you would see on flexjobs.com, as structured data. For every keyword, location, and country combination it extracts:

- 🏷️ **Job identity** — title, location(s), remote type (100% remote, hybrid, or option for remote), and a direct `flexjobs.com/publicjobs/...` link.
- 💰 **Pay and terms** — salary range as shown on the site, plus parsed `salary_min` / `salary_max` / currency / period, schedule (full-time, part-time, flexible), employment category (employee vs. freelance), and career level.
- 📋 **Context** — a short role summary, listed benefits, education requirements, travel requirement, and the FlexJobs categories the job is filed under.
- 📅 **Dates** — when the job was posted and when the listing expires.

The scraper accepts the same inputs as a normal FlexJobs search — keyword, location, country, job type, employer, and "date posted" window — and paginates automatically, 50 jobs per page.

> **Note on employer names:** FlexJobs shows the hiring company only to logged-in members. For public search results the `company_name` field is usually empty. Every other field (title, salary, location, schedule, remote type, link) is available.

### What data can you extract from FlexJobs?

| Field | Description |
|-------|-------------|
| `job_title` | Role title as published on FlexJobs |
| `company_name` | Employer name (usually empty — FlexJobs hides this from non-members) |
| `location` | City / state / region, or `Remote` / `US National` where stated |
| `posted_via` | Always `FlexJobs` |
| `salary` | Pay range string exactly as shown, e.g. `120,000.00 - 150,000.00 USD Annually` |
| `salary_min` / `salary_max` | Numeric salary bounds parsed from the range |
| `salary_currency` / `salary_period` | e.g. `USD`, `yearly` / `hourly` |
| `date` | Posting date (`YYYY-MM-DD`) |
| `job_type` | Full-time, Part-time, or Contract, when stated |
| `schedule` | Raw FlexJobs schedule label(s) |
| `remote_option` | `100% Remote Work`, `Hybrid Remote Work`, or `Option for Remote Work` |
| `career_level` | Entry-Level, Experienced, Manager, etc. |
| `job_benefits` | List of benefits mentioned in the listing |
| `categories` | FlexJobs career categories the job is filed under |
| `education_levels` | Education requirements, when stated |
| `URL` | Direct link to the public job listing |
| `job_id` / `slug` | Stable identifiers for deduplication and monitoring |
| `posted_at` / `expire_at` | Full ISO timestamps |

Not every FlexJobs listing includes every field — salary, exact date, and job type vary by posting — so handle optional fields gracefully in your integration.

### Input parameters

| Parameter | Type | Required | Default | Description |
|-----------|------|----------|---------|-------------|
| includeKeyword | string | **Yes** | — | Job title, skill, or search term. Comma-separated values are supported (`React, Node.js`). |
| locationName | string | No | — | City, state, or region, e.g. `New York, NY` or `London`. |
| countryName | string | No | `all` | Country context: `usa`, `uk`, `india`, `all`, or any country name. |
| pagesToFetch | integer | No | 1 | Number of result pages to walk (50 jobs per page). |
| companyName | string | No | — | Restrict to a single employer, e.g. `Dell`. |
| jobType | string | No | — | `FULLTIME`, `PARTTIME`, `CONTRACTOR`, or `INTERN`. |
| datePosted | string | No | `all` | `all`, `today`, `3days`, `week`, or `month`. |
| proxyConfiguration | object | No | UNBLOCKER | Apify Proxy settings. FlexJobs blocks datacenter and residential proxies; the UNBLOCKER group is required and set by default. |

### Example input

```json
{
  "includeKeyword": "software engineer, python",
  "locationName": "new york",
  "countryName": "usa",
  "companyName": "Dell",
  "jobType": "FULLTIME",
  "datePosted": "week",
  "pagesToFetch": 3
}
```

### Output example

```json
[
  {
    "job_title": "Senior Frontend Developer",
    "company_name": "",
    "location": "New York, NY",
    "posted_via": "FlexJobs",
    "salary": "120,000.00 - 150,000.00 USD Annually",
    "salary_min": 120000.0,
    "salary_max": 150000.0,
    "salary_currency": "USD",
    "salary_period": "yearly",
    "date": "2026-03-25",
    "job_type": "Full-time",
    "schedule": "Full-Time",
    "remote_option": "Hybrid Remote Work",
    "career_level": "Experienced",
    "job_benefits": ["Health Insurance", "401k Matching/Retirement Savings", "Paid Vacation"],
    "categories": ["Computer & IT", "Software Development"],
    "education_levels": ["Bachelor's/Undergraduate Degree"],
    "URL": "https://www.flexjobs.com/publicjobs/senior-frontend-developer-1a2b3c4d",
    "job_id": "1a2b3c4d-5e6f-7a8b-9c0d-1e2f3a4b5c6d",
    "posted_at": "2026-03-25T14:02:11Z",
    "expire_at": "2026-05-01T00:00:00Z",
    "scraped_at": "2026-03-26T09:00:00Z"
  }
]
```

Download the dataset as JSON, CSV, Excel, XML, or HTML from the **Storage** tab or the [Apify API](https://docs.apify.com/api/v2).

### How to scrape FlexJobs

1. Open the **Input** tab of the FlexJobs Jobs Scraper.
2. Enter a **search keyword** — a job title or skill such as `Product Manager` or `data analyst`.
3. Optionally set a **location** (`New York, NY`), a **country** (`usa`), a **job type**, an **employer**, and a **"date posted"** window.
4. Set **Pages to fetch** — start with 1–3 pages (50 jobs each) to keep the first run fast and cheap.
5. Click **Start**. Results stream into the dataset as they are scraped.
6. Export from the **Storage** tab, or pull the data via API, or connect an [integration](https://docs.apify.com/platform/integrations) (Google Sheets, Slack, Zapier, Make, webhooks).

To run FlexJobs scraping on a schedule (daily, hourly, weekly), use Apify's [Schedules](https://docs.apify.com/platform/schedules) feature and point it at this actor.

### How much does it cost to scrape FlexJobs?

This actor uses **pay-per-result** pricing:

| Plan | Price per 1,000 jobs |
|------|----------------------|
| Free | **$0.99** |
| Bronze | $0.89 |
| Silver | $0.89 |
| Gold | $0.79 |

One event is charged per job saved to the dataset. Scraping 3 pages (~150 jobs) costs about **$0.15** on the Free plan. Your Apify platform usage (compute + proxy) is billed separately according to your plan; the UNBLOCKER proxy required for FlexJobs is the main platform cost, so keep `pagesToFetch` to what you actually need.

### Use cases

- 📊 **Remote job-market research** — track how many remote/hybrid roles exist for a skill, and how pay ranges shift over time.
- 🧭 **Recruiting and sourcing** — monitor new listings in a category and location every day.
- 💵 **Salary benchmarking** — aggregate `salary_min` / `salary_max` by role, seniority, and remote type.
- 🔁 **Job-board aggregation** — feed FlexJobs listings into your own job search product alongside other sources.
- 🔔 **Alerting** — schedule the actor with `datePosted: "today"` and push new jobs to Slack or email.

### How it works

1. The actor loads a FlexJobs search results page for your keyword, location, and country through Apify's UNBLOCKER proxy (FlexJobs is protected by Akamai Bot Manager).
2. It reads the listing data embedded in the page and maps each job to a structured record.
3. It follows pagination up to `pagesToFetch`, deduplicating jobs by ID across pages.
4. `datePosted` and `jobType` are applied as filters; jobs outside the window or type are skipped.
5. Each job is pushed to the dataset and one `job-scraped` event is charged.

### FAQ

**Do I need a FlexJobs account or subscription?**
No. The scraper reads public FlexJobs search results. A FlexJobs membership is only needed to see employer names and apply directly on flexjobs.com.

**Why is `company_name` empty?**
FlexJobs deliberately hides the hiring company from non-members on public search results. The scraper returns every other field. If you need the employer, open the job `URL` while logged in to FlexJobs.

**How many jobs can I get per search?**
FlexJobs returns 50 jobs per page and often hundreds of pages per query. Set `pagesToFetch` to control how deep to go.

**Can I filter by "posted today" or "this week"?**
Yes — use `datePosted` (`today`, `3days`, `week`, `month`). Jobs older than the window are skipped.

**Can I scrape a specific FlexJobs category or remote level?**
Use a keyword that matches the category (e.g. `accounting`, `customer service`) plus the `jobType` filter. Remote level is returned in `remote_option` for every job.

**Can I run this on a schedule?**
Yes. Use Apify [Schedules](https://docs.apify.com/platform/schedules) for recurring runs, and [integrations](https://docs.apify.com/platform/integrations) or [webhooks](https://docs.apify.com/platform/integrations/webhooks) to route new jobs into your tools.

**Something looks wrong or a field is missing.**
Open an issue on the **Issues** tab with your input and the run ID — happy to fix it.

### Is it legal to scrape FlexJobs?

Scraping publicly available data is legal in most jurisdictions, and this actor only reads pages that any visitor can load without logging in. It does not bypass authentication and does not collect personal data about individuals. You are responsible for how you use the scraped data — review FlexJobs' Terms of Use and consult Apify's guide on [the legality of web scraping](https://blog.apify.com/is-web-scraping-legal/) before large-scale or commercial use.

### Related actors

- [Indeed Jobs Scraper](https://apify.com/parsebird/indeed-jobs-scraper) — jobs from Indeed across 60+ countries
- [MeineStadt.de Jobs Scraper](https://apify.com/parsebird/meinestadt-de-jobs-scraper) — German local job board
- [NHS UK Jobs Scraper](https://apify.com/parsebird/nhs-uk-jobs-scraper) — UK healthcare jobs
- [Hiring.cafe Scraper](https://apify.com/parsebird/hiring-cafe-scraper) — aggregated job listings with 20+ filters

Browse all [ParseBird actors](https://apify.com/parsebird) for more job boards and data sources.

# Actor input Schema

## `includeKeyword` (type: `string`):

Job title, skill, or search term to look for, e.g. `Product Manager` or `data analyst`. Comma-separated values are supported (`React, Node.js`).

## `locationName` (type: `string`):

City, state, or region to search in, e.g. `New York, NY` or `London`. Leave empty to search all locations. Note: many FlexJobs roles are listed as `Remote` or `US National` rather than tied to a city.

## `countryName` (type: `string`):

Country context for the search, e.g. `usa`, `uk`, `india`, or `all`. Use `all` (default) for no country restriction.

## `pagesToFetch` (type: `integer`):

Number of result pages to walk. FlexJobs returns 50 jobs per page, so 3 pages ≈ 150 jobs.

## `companyName` (type: `string`):

Restrict results to a single employer, e.g. `Dell`. Note: FlexJobs hides employer names from non-members, so the `company_name` output field is usually empty even when this filter is applied.

## `jobType` (type: `string`):

Filter by employment type.

## `datePosted` (type: `string`):

Only return jobs posted within this window.

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

FlexJobs is protected by Akamai Bot Manager and blocks datacenter and residential proxies. Apify's UNBLOCKER proxy group is required and is set as the default.

## Actor input object example

```json
{
  "includeKeyword": "software engineer",
  "locationName": "new york",
  "countryName": "usa",
  "pagesToFetch": 1,
  "jobType": "",
  "datePosted": "all",
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "UNBLOCKER"
    ]
  }
}
```

# Actor output Schema

## `dataset` (type: `string`):

No description

# 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 = {
    "includeKeyword": "software engineer",
    "locationName": "new york",
    "countryName": "usa",
    "pagesToFetch": 1,
    "companyName": "",
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "UNBLOCKER"
        ]
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("parsebird/flexjobs-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 = {
    "includeKeyword": "software engineer",
    "locationName": "new york",
    "countryName": "usa",
    "pagesToFetch": 1,
    "companyName": "",
    "proxyConfiguration": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["UNBLOCKER"],
    },
}

# Run the Actor and wait for it to finish
run = client.actor("parsebird/flexjobs-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 '{
  "includeKeyword": "software engineer",
  "locationName": "new york",
  "countryName": "usa",
  "pagesToFetch": 1,
  "companyName": "",
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "UNBLOCKER"
    ]
  }
}' |
apify call parsebird/flexjobs-jobs-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,parsebird/flexjobs-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/uBD2jHLktaLza9rLB/builds/gTnNcwBMWkKSydPOn/openapi.json
