# JSfirm Scraper \[$1/1K💰] | Aviation Jobs & Salaries (`ahmed_jasarevic/jsfirm-scraper`) Actor

Scrape JSfirm aviation jobs for pilots, A\&P mechanics, ATC and ground roles. Get company, location, salary, certificates, flight hours and apply links. $1 per 1,000 jobs.

- **URL**: https://apify.com/ahmed_jasarevic/jsfirm-scraper.md
- **Developed by:** [Ahmed Jasarevic](https://apify.com/ahmed_jasarevic) (community)
- **Security:** Limited permissions
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.90 / 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.
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

## JSfirm Scraper – Aviation Jobs, Salaries & Requirements

Scrape **JSfirm** aviation jobs for pilots, A\&P mechanics, ATC, flight instructors and ground-operations roles. Get company, location, salary, certificates, flight-hour minimums, benefits, schedule and application links. **$1 per 1,000 jobs.**

### Track Aviation Hiring By Role, State And Company

JSfirm is a large aviation-specific job board. This Actor turns public postings into structured records for recruiters, staffing agencies, flight schools and salary researchers.

- **Pilot recruiting** — find ATP, commercial, CFI and type-rated openings.
- **Maintenance hiring** — track A\&P, avionics and inspection roles.
- **Market research** — compare salaries, schedules and benefits by region.
- **Job-board enrichment** — feed aviation openings into your own product.

### How It Works

![How the JSfirm Scraper works: from an aviation-job search to structured pilot and mechanic job records.](https://api.apify.com/v2/key-value-stores/oeuA0kLOyhbRM4fzt/records/how-it-works-jsfirm-scraper.webp)

The Actor searches JSfirm by keyword, category, state, company or employment type, then reads each job detail. Every posting becomes one row with role, location, pay and requirement signals.

- Search one or more keywords, or browse all jobs.
- Filter by state, location, company and employment type.
- Detail records include the full description and employer apply link.

### Scrape Pilot, Maintenance, ATC And Ground Jobs

Use keywords such as `helicopter pilot`, `A&P mechanic`, `flight instructor` or `ATC`, then narrow by category and state. Common categories include:

- Flight Operations
- Maintenance & Engineering
- Ground & Logistics
- Business Operations
- Flight Training

`state` expects full state names such as `Texas` or `California`; two-letter codes return no results.

### Certificates, Flight Hours And Salary Signals

JSfirm postings often describe requirements in free text. The Actor extracts common certificates, hour minimums, aircraft types, benefits and schedules so you can filter and compare more easily.

- ATP, Commercial, Instrument, CFI/CFII/MEI and type ratings
- A\&P, ATC, FCC and NDT signals
- Total flight-hour minimums and PIC references
- Aircraft types and supported manufacturers
- Salary range, benefits and shift schedule
- External apply URL and application method

These derived fields are best-effort; always verify critical requirements on the original posting.

### Input – Configure A JSfirm Search

| Field | Type | Default | Notes |
|---|---|---|---|
| `keywords` | array | `["pilot"]` | Search terms such as `helicopter pilot`, `A&P mechanic` or `flight instructor`; empty browses all jobs |
| `category` | string | — | JSfirm category such as `Flight Operations` or `Maintenance & Engineering` |
| `state` | string | — | Full US state name, e.g. `Texas`; not a two-letter code |
| `location` | string | — | Free-text location such as `Dallas, TX` |
| `company` | string | — | Company name filter |
| `employmentType` | string | `all` | `all`, `permanent` or `contractor` |
| `sort` | string | `updated_desc` | `updated_desc`, `posted_desc`, `posted_asc`, `updated_asc`, `title_asc` or `title_desc` |
| `postedWithin` | string | — | `7`, `30` or `90` days |
| `maxJobs` | integer | `50` | Maximum full job records; hard cap: 1,000 |
| `proxy` | object | Apify Proxy off | Standard Apify proxy configuration |

### Output – Aviation Job Fields

Each dataset item contains:

- `jobId`, `jobTitle`
- `company`, `companyId`, `companyWebsite`
- `aircraftType`, `aircraftModels`, `supportedManufacturers`
- `baseLocation`, `city`, `state`, `country`, `lat`, `lng`
- `airportCodes`
- `certificates`, `hoursMinimums`, `totalFlightHoursMin`
- `salaryRange`, `salaryText`
- `benefits`, `schedule`
- `employmentType`, `position`, `postedAt`, `isNew`, `isEnhanced`
- `url`, `applyUrl`, `applicationMethod`
- `descriptionText`, `descriptionHtml`, `requirementsText`
- `scrapedAt`

### Example Input – Texas Helicopter Pilot Jobs

```json
{
  "keywords": ["helicopter pilot"],
  "state": "Texas",
  "employmentType": "permanent",
  "maxJobs": 100
}
```

### Example Output – One Pilot Job

```json
{
  "jobId": "1284506",
  "jobTitle": "Helicopter Pilot - HAA",
  "company": "Air Methods",
  "city": "Dallas",
  "state": "Texas",
  "country": "US",
  "aircraftType": "Helicopter",
  "certificates": ["Commercial", "Instrument", "CFI"],
  "totalFlightHoursMin": 2000,
  "salaryRange": { "min": 95000, "max": 120000, "currency": "USD" },
  "salaryText": "$95,000 - $120,000 / year",
  "employmentType": "permanent",
  "postedAt": "2026-10-28T14:22:00.000Z",
  "applyUrl": "https://careers.example.com/jobs/1284506",
  "url": "https://www.jsfirm.com/jobs/1284506",
  "scrapedAt": "2026-10-30T09:45:00.000Z"
}
```

### Export Aviation Job Data To JSON, CSV Or Excel And Schedule Runs

Download results as JSON, CSV, Excel or XML from the run page or through the Apify API. Schedule daily runs to catch new aviation openings, or trigger a run when a role or state needs fresh coverage.

### Related Actors

- [Indeed Job Scraper](https://apify.com/ahmed_jasarevic/indeed-job-scraper) — broad job-market coverage
- [ClearanceJobs Scraper](https://apify.com/ahmed_jasarevic/clearancejobs-scraper) — cleared defense and aerospace roles
- [HigherEdJobs Scraper](https://apify.com/ahmed_jasarevic/higheredjobs-scraper) — aviation-program and university jobs
- [Google Maps Scraper](https://apify.com/apify/google-maps-scraper) — verify airports, MROs and employer locations

### FAQ

#### What is JSfirm?

JSfirm is an aviation-specific job board for pilots, maintenance technicians, air traffic controllers, flight instructors and ground staff.

#### Do I need an account?

No. The Actor reads public job postings and does not require a JSfirm account or login.

#### Why does `state` need a full name?

JSfirm's public filters use full state names such as `Texas`. Two-letter codes such as `TX` return no results.

#### Are certificates and flight hours official?

No. They are extracted from the job description and company profile as best-effort signals. Verify critical requirements on the original posting.

#### Can I browse all aviation jobs?

Yes. Leave `keywords` empty and optionally add a category, state or company filter.

#### How many jobs can I scrape?

Up to **1,000** per run with `maxJobs`. Free Apify users get a 10-job preview.

### For AI Agents & LLM Apps

Returns one row per JSfirm posting with role, location, salary, certificates and application data.

Minimal working input:

```json
{ "keywords": ["helicopter pilot"], "state": "Texas", "maxJobs": 24 }
```

Output fields: `jobId, jobTitle, company, city, state, country, aircraftType, certificates, totalFlightHoursMin, salaryRange, salaryText, benefits, schedule, employmentType, postedAt, applyUrl, url, scrapedAt`.

Behaviors an agent should know:

- `maxJobs` is capped at **1,000**.
- Free users are capped at **10** saved jobs.
- `state` requires a full state name.
- `keywords` is an array; empty means browse all.
- Derived fields such as `certificates` and `totalFlightHoursMin` are heuristic.
- Missing salary fields stay `null` when the posting does not publish pay.

Billing: **$0.001 per saved job** on FREE/BRONZE ($1 per 1,000), $0.00095 on SILVER and $0.0009 on GOLD+, plus a small actor-start event.

### Legal & Compliance Disclaimer

This Actor is an independent tool. It is not affiliated with, endorsed by or sponsored by JSfirm.

It collects publicly available job postings — no login and no private account. Job data may be subject to JSfirm's terms and applicable law. Users are responsible for how they use employer contact and application information. Nothing here is legal advice.

### SEO Keywords

jsfirm scraper, aviation jobs, pilot jobs, helicopter pilot jobs, airplane pilot jobs, a\&p mechanic jobs, aviation maintenance jobs, atc jobs, flight instructor jobs, aviation job board, pilot salary data, aviation staffing, aircraft mechanic jobs, aviation careers, pilot hiring, aviation job listings, jsfirm data, aviation jobs api

# Actor input Schema

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

One or more search terms, e.g. "helicopter pilot", "A\&P mechanic", "flight instructor". Leave empty to browse all jobs (subject to the other filters).

## `category` (type: `string`):

Optional JSfirm category filter. Common values: Flight Operations, Maintenance & Engineering, Ground & Logistics, Business Operations, Learning & Development.

## `state` (type: `string`):

Optional full state name filter, e.g. Texas, California, Florida (use full names, not 2-letter codes).

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

Optional free-text location filter, e.g. Dallas, TX or Denver.

## `company` (type: `string`):

Optional company name filter.

## `employmentType` (type: `string`):

Filter by employment type.

## `sort` (type: `string`):

How results are ordered.

## `postedWithin` (type: `string`):

Only include jobs posted within the selected window.

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

Maximum number of job detail records to save. Free users are capped at 10.

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

Select proxies to be used by your crawler.

## Actor input object example

```json
{
  "keywords": [
    "pilot"
  ],
  "employmentType": "all",
  "sort": "updated_desc",
  "maxJobs": 50,
  "proxy": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

## `results` (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 = {
    "keywords": [
        "pilot"
    ],
    "proxy": {
        "useApifyProxy": false
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("ahmed_jasarevic/jsfirm-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": ["pilot"],
    "proxy": { "useApifyProxy": False },
}

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

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,ahmed_jasarevic/jsfirm-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/s9sWg8YdiI9MmOdGv/builds/8ptSQvkf6bWF5CnoB/openapi.json
