# USAJOBS Scraper \[$0.9/1K💰] | Federal Jobs | GS Pay | Clearance (`ahmed_jasarevic/usajobs-scraper`) Actor

Extract USAJOBS federal job announcements without an API key — agency, salary range, GS pay grade, security clearance, remote & telework flags, hiring paths, duty locations and closing dates. Built for job boards, federal recruiters and hiring research.

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

## Pricing

from $0.87 / 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

## USAJOBS Scraper — Federal Government Jobs Data Without an API Key

Extract **USAJOBS federal job announcements** from [USAJOBS.gov](https://www.usajobs.gov/) — the official U.S. government job board — without an API key, at **$0.9 per 1,000 results**. Get job title, agency, salary range, GS pay grade, security clearance, remote and telework eligibility, hiring paths, duty locations and closing dates in one clean dataset, ready for job boards, federal recruiters, staffing firms and labor market research.

### Main Use Cases

- **Federal job postings monitoring** — track new announcements by keyword, agency or occupational series as they open
- **Remote and telework federal jobs research** — find work-from-home federal positions across departments
- **Federal salary data & GS pay grade benchmarks** — build compensation datasets for pay scale research
- **Security clearance job search** — surface Secret, Top Secret and SCI announcements for cleared talent
- **Federal hiring trend analysis** — capture volumes, agencies, locations and closing patterns over time
- **Job board aggregation** — power federal job listings on career portals and newsletters

### How It Works

1. Set optional filters (keyword, location, hiring path, occupational series, department, clearance, remote, schedule, travel and more) — all fields have defaults, so you can also just press **Run**.
2. The actor opens a **single short headless-Chromium session** (~5 seconds) to pass the Akamai anti-bot challenge, then replays the cookie over plain HTTP — **no proxy required**.
3. It searches USAJOBS with the same internal search endpoint the USAJOBS website itself uses, paginates through results, then visits each job announcement (JOA) detail page to extract ~30 structured fields with Cheerio.
4. Download the dataset as JSON, HTML, CSV or Excel.

Because the browser runs for only seconds, a run scraping hundreds of announcements costs well under one compute unit.

### Extract Federal Job Data Without a USAJOBS API Key

The official free USAJOBS Search API requires a **manual key request with ~1 business-day approval**. This actor skips that entirely: it uses the search endpoint the USAJOBS website itself uses, so you can pull federal job announcements immediately — no signup form, no approval wait, no key rotation. It also works around Akamai with its own bundled Chromium, which means **no proxy traffic is charged** in the default configuration.

### Monitor Remote & Telework Federal Jobs

The `remoteIndicator` and `teleworkIndicator` filters let you isolate positions that can be done from home. Combine `remoteIndicator: true` with `maxItems` and a schedule to maintain an always-fresh dataset of remote federal jobs — a strong content play for remote-work job boards and newsletters.

### Research GS Pay Scales & Federal Salaries

Every announcement returns `salaryMin`, `salaryMax`, `salary`, `payPlan`, `payScaleGrade`, `gradeLow` and `gradeHigh`. Filter by occupational series (e.g. `2210` for IT Management, `0610` for Nursing) or department to build federal salary benchmarks by role, agency and location.

### Track Security Clearance & Closing Dates

- Use `securityClearance` (0–8) to target Not Required, Confidential, Secret, Top Secret, SCI and more.
- Set `sortField: "closedate"` with `sortDirection: "Asc"` to prioritize announcements closing soon — ideal for recruiters pushing candidates to apply.

### Input

All input fields are optional and have defaults. Full reference:

| Field | Type | Required | Default | Notes |
|---|---|---|---|---|
| `keyword` | string | No | — | Searches full announcement text (e.g. `nurse`, `engineer`) |
| `location` | string | No | — | City, state, ZIP or military installation (e.g. `Washington DC`, `Texas`) |
| `hiringPaths` | string\[] | No | `[]` | `public`, `vet`, `nguard`, `disability`, `native`, `mspouse`, `student`, `ses`, `peace`, `overseas`, `fed-internal-search`, `graduates`, `fed-excepted`, `fed-competitive`, `fed-transition`, `land`, `special-authorities` |
| `jobCategoryCodes` | string\[] | No | `[]` | Occupational series codes (e.g. `2210` IT Management, `0801` General Engineering) |
| `departments` | string\[] | No | `[]` | Department codes (e.g. `AF` Air Force, `HE` HHS) |
| `agencies` | string\[] | No | `[]` | Agency sub-element codes (e.g. `AF00`) |
| `securityClearance` | string | No | — | `0` Not Required, `1` Confidential, `2` Secret, `3` Top Secret, `4` SCI, `5` Q, `7` L, `8` Other |
| `remoteIndicator` | boolean | No | unset | `true` = remote only, `false` = exclude remote, unset = all |
| `teleworkIndicator` | boolean | No | unset | `true` = telework-eligible only |
| `workSchedule` | string | No | — | `1` Full-time, `2` Part-time, `3` Shift work, `4` Intermittent, `5` Job Sharing, `6` Multiple |
| `appointmentType` | string | No | — | `15317` Permanent, `15337` Term, `15342` Detail, `15352` Temporary, `15368` Multiple |
| `travelPercentage` | string | No | — | `0` No travel, `25` Occasional, `50` <25%, `75` ≥25%, `100` Up to 100% |
| `supervisors` | string | No | — | `true` supervisory, `false` non-supervisory |
| `sortField` | string | No | — | `opendate`, `closedate`, `jobtitle`, `salarymin`, `location`, `organizationname`, etc. |
| `sortDirection` | string | No | — | `Asc` / `Desc` |
| `maxItems` | integer | No | `50` | Max announcements to scrape. Free users are capped at 10. |
| `resultsPerPage` | integer | No | `100` | Results per search page (max 500) |
| `maxSearchPages` | integer | No | `40` | Max search pages (max 400); paging stops early at `maxItems` |
| `startUrls` | array | No | `[]` | Direct JOA URLs (`https://www.usajobs.gov/job/<id>`) — skips search, no browser needed |
| `proxy` | object | No | off | Optional proxy for the short bootstrap step only, if your datacenter IP is blocked by Akamai |

### Output

Each dataset item is one federal job announcement with ~30 fields:

| Field | Description |
|---|---|
| `title` | Job announcement title |
| `agency` / `department` / `subAgency` | Hiring organization |
| `salaryMin` / `salaryMax` / `salary` | Salary range |
| `payScaleGrade` / `gradeLow` / `gradeHigh` / `payPlan` | Pay scale & GS grade |
| `occupationalSeries` | Occupational series codes + names |
| `securityClearance` | Clearance required |
| `teleworkEligible` / `remote` | Telework / remote flags |
| `workSchedule` / `workType` | Full-time / permanent, etc. |
| `travelPercentage` / `supervisoryStatus` | Travel & supervision level |
| `announcementNumber` | Announcement/control number |
| `hiringPaths` | Hiring paths (public, vet, etc.) |
| `dutyLocations` | Duty locations (city, state) |
| `openDate` / `closeDate` | Announcement open / close dates |
| `announcementUrl` | Link to the announcement |
| `jobSummary` / `duties` | Full job description text |

### Example Input

```json
{
  "keyword": "engineer",
  "location": "Washington DC",
  "remoteIndicator": true,
  "jobCategoryCodes": ["0801"],
  "sortField": "closedate",
  "sortDirection": "Asc",
  "maxItems": 100,
  "resultsPerPage": 100,
  "maxSearchPages": 10
}
```

### Example Output

```json
{
  "positionId": "865821500",
  "title": "THE LEGISLATIVE REGULATORY AND TECHNICAL SUPPORT DIVISION CHIEF - DIRECT HIRE AUTHORITY",
  "agency": "Department of the Air Force Headquarters",
  "department": "Department of the Air Force",
  "subAgency": "Air Force Civil Engineer Center (AFCEC)  MPCN: 010069071M",
  "announcementUrl": "https://www.usajobs.gov/job/865821500",
  "salaryMin": "107446.00",
  "salaryMax": "164301.00",
  "salary": "$107,446 - $164,301 per year",
  "payScaleGrade": "NH 4",
  "gradeLow": "4",
  "gradeHigh": "4",
  "payPlan": "NH",
  "occupationalSeries": ["0801 General Engineering", "0819 Environmental Engineering"],
  "securityClearance": "Other",
  "teleworkEligible": "Yes—as determined by the agency policy.",
  "remote": "No",
  "workSchedule": "Full-time",
  "workType": "Permanent",
  "travelPercentage": "Occasional travel - You may be expected to travel for this position.",
  "supervisoryStatus": "Yes",
  "announcementNumber": "AFMC-12937527-DLF-FLYER",
  "hiringPaths": ["The public"],
  "dutyLocations": ["Lackland AFB, TX"],
  "openDate": "04/20/2026",
  "closeDate": "08/17/2026",
  "jobSummary": "The Air Force offers qualified applicants opportunities to be hired for...",
  "duties": "Duties for this position typically include : Establishes, revises, or reviews policies..."
}
```

### Integrations & Automation

- **Apify API** — call the actor programmatically from your job board, CRM or data pipeline
- **Webhooks** — push new announcements to Slack, Google Sheets, Airtable or your own API as soon as they're scraped
- **Zapier / Make** — connect the dataset to thousands of apps without code
- **Scheduling** — run daily or hourly to keep a rolling dataset of new federal job postings; recurring runs also improve Apify Store recommendations for your account

### Related Actors

- [USAJOBS Jobs Search Scraper](https://apify.com/jobsapi/usajobs-jobs-search-scraper) — USAJOBS data via the jobs API (identity-verified)
- [USAJOBS Federal Jobs Feed](https://apify.com/curative_blanket/usajobs-federal-jobs-feed) — incremental federal job announcements feed
- [Careerbuilder Jobs Scraper](https://apify.com/ahmed_jasarevic/careerbuilder-scraper) — US civilian jobs with salaries & full descriptions
- [ZipRecruiter Scraper](https://apify.com/ahmed_jasarevic/ziprecruiter-scraper) — US jobs with salary & remote flags
- [SAM.gov Scraper](https://apify.com/ahmed_jasarevic/sam-scraper) — federal RFPs & GovCon leads

These actors form the US jobs & federal data cluster: USAJOBS covers federal civil service, SAM.gov covers government contracts, and Careerbuilder/ZipRecruiter cover the private sector — so you can research the whole US hiring market with a small, consistent stack.

### FAQ

#### Why use this actor instead of the official USAJOBS API?

The official free USAJOBS Search API requires a **manual key request with ~1 business-day approval** before you get access. This actor needs no key at all — it uses the same search endpoint the USAJOBS website uses and you can run it immediately. It also handles the Akamai anti-bot challenge itself, so you don't need to build a browser or proxy stack around the API.

#### What are alternatives to this actor / to USAJOBS data?

- The official [USAJOBS Search API](https://developer.usajobs.gov/) (requires key approval)
- Alternative USAJOBS actors like [USAJOBS Jobs Search Scraper](https://apify.com/jobsapi/usajobs-jobs-search-scraper) or [USAJOBS Federal Jobs Feed](https://apify.com/curative_blanket/usajobs-federal-jobs-feed)
- Federal data sets from OPM.gov for wider workforce statistics

#### Can I scrape USAJOBS without an API key?

Yes — that is exactly what this actor does. It scrapes the public search and announcement pages that USAJOBS serves to the website itself, without any developer key.

#### What is the best way to build a federal jobs database?

Combine this actor's dataset (title, agency, salary, GS grade, location, dates, URL) with a scheduled run and webhook export into your database or spreadsheet. The `announcementUrl` gives you a stable key for deduplication and re-checking.

#### What is occupational series 2210?

2210 is the USAJOBS occupational series code for **IT Management** — the largest federal IT job category. Other common codes: `0610` Nursing, `0801` General Engineering. You can filter by any series code via `jobCategoryCodes`.

#### How do I monitor new federal job postings as they open?

Set `sortField: "opendate"`, `sortDirection: "Desc"`, and schedule the actor to run daily or hourly. Every run returns the latest announcements first, and webhooks can notify you instantly.

#### Does USAJOBS have remote jobs?

Yes — many announcements carry a remote eligibility flag. Set `remoteIndicator: true` to return only remote federal jobs.

#### What does a GS pay grade mean?

GS (General Schedule) is the U.S. federal government's main pay scale. Each job lists a pay plan, grade band (e.g. `GS-12` to `GS-13`) and salary range — this actor returns all of them per announcement so you can benchmark federal salaries.

#### Is scraping USAJOBS legal?

This actor reads publicly accessible job announcement pages — no authentication, payment or access control is bypassed. Respect USAJOBS's terms of service and robots.txt, keep concurrency low, and use delays (pacing is already built in).

### For AI Agents & LLM Apps

- **Purpose:** Returns structured federal job announcements from USAJOBS.gov — one dataset row per announcement with ~30 fields (agency, salary, GS grade, clearance, remote/telework, hiring paths, locations, dates).
- **Minimal working input:**
  ```json
  { "maxItems": 10 }
  ```
  All filters are optional; this returns 10 announcements with the default sort.
- **Variant inputs:**
  ```json
  { "keyword": "nurse", "location": "Texas", "maxItems": 50 }
  ```
  ```json
  { "maxItems": 10, "startUrls": [{ "url": "https://www.usajobs.gov/job/865821500" }] }
  ```
- **Output field list:** `positionId`, `title`, `agency`, `department`, `subAgency`, `salaryMin`, `salaryMax`, `salary`, `payScaleGrade`, `gradeLow`, `gradeHigh`, `payPlan`, `occupationalSeries`, `securityClearance`, `teleworkEligible`, `remote`, `workSchedule`, `workType`, `travelPercentage`, `supervisoryStatus`, `announcementNumber`, `hiringPaths`, `dutyLocations`, `openDate`, `closeDate`, `announcementUrl`, `jobSummary`, `duties`.
- **Behaviors an agent should know:**
  - `remoteIndicator` has three states: `true` (remote only), `false` (exclude remote), unset (include all) — do not omit it when a caller says "remote jobs" unless "mixed" is acceptable.
  - `securityClearance` is a string code (`"3"` = Top Secret, not `3` as a number).
  - `sortField` accepts `opendate` / `closedate` / `jobtitle` / `salarymin` etc.; `sortDirection` is `Asc`/`Desc` (capitalized).
  - `startUrls` mode skips the search and the browser bootstrap entirely.
  - `maxItems` caps total results; free-tier runs are capped at 10 items.
- **Billing model:** pay-per-event — $0.0005 run start + $0.0009 per announcement result ($0.9 per 1K results). No proxy cost in default mode.

### Legal & Compliance Disclaimer

This actor is an independent tool and is **not affiliated with, endorsed by, or sponsored by the U.S. Office of Personnel Management (OPM) or USAJOBS.gov**. It only accesses publicly available job announcement pages and the public search endpoint — it does not bypass login, authentication, payment or access controls. Users are responsible for complying with USAJOBS's terms of service, robots.txt and applicable law; keep request rates moderate. This actor does not extract personal contact data.

### SEO Keywords

usajobs scraper, usajobs api alternative, federal job announcements, federal government jobs data, federal job posting scraper, usajobs without api key, federal jobs dataset, remote federal jobs, telework federal jobs, gs pay grade, federal salary data, security clearance jobs, top secret clearance jobs, federal it jobs 2210, occupational series 2210, federal hiring trends, government job board data, federal recruiter tools, labor market research, usajobs closing soon, federal jobs by agency, federal jobs by location, usajobs application deadlines, federal jobs veterans, federal workforce analytics

# Actor input Schema

## `keyword` (type: `string`):

Search keyword (e.g. 'nurse', 'engineer'). Searches the full announcement text.

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

City, state, ZIP code or military installation name (e.g. 'Washington DC', 'Texas').

## `hiringPaths` (type: `array`):

Hiring path filters. Values: public, vet, nguard, disability, native, mspouse, student, ses, peace, overseas, fed-internal-search, graduates, fed-excepted, fed-competitive, fed-transition, land, special-authorities.

## `jobCategoryCodes` (type: `array`):

Occupational series codes (e.g. '2210' for IT Management, '0801' for General Engineering). Multiple values allowed.

## `departments` (type: `array`):

Department codes (e.g. 'AF' for Air Force, 'HE' for HHS). Multiple values allowed.

## `agencies` (type: `array`):

Agency sub-element codes (e.g. 'AF00'). Multiple values allowed.

## `securityClearance` (type: `string`):

Security clearance filter. Values: 0=Not Required, 1=Confidential, 2=Secret, 3=Top Secret, 4=Sensitive Compartmented Information, 5=Q Access Authorization, 7=L Access Authorization, 8=Other.

## `remoteIndicator` (type: `boolean`):

If true, only return remote jobs. If false, exclude remote jobs. If unset, include all.

## `teleworkIndicator` (type: `boolean`):

If true, only return telework-eligible jobs. If unset, include all.

## `workSchedule` (type: `string`):

Work schedule filter. Values: 1=Full-time, 2=Part-time, 3=Shift work, 4=Intermittent, 5=Job Sharing, 6=Multiple Schedules.

## `appointmentType` (type: `string`):

Appointment/offering type filter. Values: 15317=Permanent, 15337=Term, 15342=Detail, 15352=Temporary, 15368=Multiple Appointment Types.

## `travelPercentage` (type: `string`):

Travel percentage filter. Values: 0=No travel, 25=Occasional travel, 50=Less than 25%, 75=25% or more, 100=Up to 100%.

## `supervisors` (type: `string`):

Supervisory status. Values: true = supervisory, false = non-supervisory.

## `sortField` (type: `string`):

Field to sort by. Values: opendate, closedate, organizationname, jobtitle, positiontitle, openingdate, closingdate, honame, salarymin, location, department, title, agency, salary.

## `sortDirection` (type: `string`):

Asc or desc.

## `maxItems` (type: `integer`):

Maximum number of job announcements to scrape. Free users are capped at 10.

## `resultsPerPage` (type: `integer`):

Number of results per search page (max 500).

## `maxSearchPages` (type: `integer`):

Maximum number of search-result pages to fetch (each page holds up to 'Results Per Page' jobs). Paging stops early once Max Items or a page with no new jobs is reached. Practical max 400 pages.

## `startUrls` (type: `array`):

Optional list of full job announcement URLs (https://www.usajobs.gov/job/<id>) to scrape directly, skipping the search step.

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

Optional proxy used only for the short browser-bootstrap step that passes the Akamai anti-bot check. By default the actor runs its own headless Chromium to harvest the Akamai session cookie, then reuses it over plain HTTP ΓÇö no proxy or UNBLOCKER API key required. Enable a proxy (e.g. RESIDENTIAL) only if your datacenter IP is blocked by Akamai. Detail pages are always scraped directly without a proxy.

## Actor input object example

```json
{
  "hiringPaths": [],
  "jobCategoryCodes": [],
  "departments": [],
  "agencies": [],
  "maxItems": 50,
  "resultsPerPage": 100,
  "maxSearchPages": 40,
  "startUrls": [],
  "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 = {};

// Run the Actor and wait for it to finish
const run = await client.actor("ahmed_jasarevic/usajobs-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 = {}

# Run the Actor and wait for it to finish
run = client.actor("ahmed_jasarevic/usajobs-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 '{}' |
apify call ahmed_jasarevic/usajobs-scraper --silent --output-dataset

```

## MCP server setup

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