# Government & Public Job Boards Aggregator (USAJobs API) (`snappytools/usajobs-public-job-search`) Actor

This Actor searches the official, public USAJobs Historic Job Opportunity Announcement (JOA) open-data API published by the US Office of Personnel Management at data.usajobs.gov. It requires no API key, login or credentials.

- **URL**: https://apify.com/snappytools/usajobs-public-job-search.md
- **Developed by:** [Snappy](https://apify.com/snappytools) (community)
- **Categories:** Jobs, SEO tools
- **Security:** Limited permissions
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$10.40 / 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?

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 job announcements export (data.usajobs.gov)

Give it a keyword, such as "analyst", and optionally an occupational series, agency codes, a state or a minimum salary. You get back one row per US federal job announcement, with the title, agency, department, salary range, open and close dates, appointment type, work schedule and a link to the announcement on usajobs.gov.

It reads the official public USAJobs Historic Job Opportunity Announcement (JOA) open-data API from the US Office of Personnel Management. You don't need an API key or a login.

Turn on **Monitor mode** and schedule the Actor, and each run returns only announcements you haven't seen before.

### Why this one

- **Official open data.** It uses the public USAJobs Historic JOA API at data.usajobs.gov, not scraped web pages.
- **No credentials.** You don't need an API key, an account or a login.
- **Filters that matter.** Narrow by keyword, occupational series, agency code, state, minimum salary and how recently the job opened.
- **Only new jobs.** **Monitor mode** remembers announcement IDs between runs, so scheduled runs output only new postings.
- **Stops cleanly.** A **Time budget (seconds)** setting saves the records found so far instead of timing out.
- **Simple pricing.** $10.40 per 1,000 results, and runs with no results cost nothing.

### Quick start

```json
{
  "keyword": "analyst",
  "maxResults": 5,
  "maxRunSeconds": 30,
  "minSalary": 0,
  "monitorMode": false,
  "openedWithinDays": 14
}
```

This returns up to 5 federal job announcements opened in the last 14 days that match "analyst". In a test run on 5 Nov 2026 it returned 5 results.

### What you can use it for

| Who | What for |
| --- | --- |
| Recruiters and staffing firms | Track new federal openings in a given occupational series. |
| Career coaches and veteran transition programs | Build curated job feeds for clients. |
| Labour market analysts | Measure federal hiring volume and salary ranges by agency or state. |
| Government contractors | Watch which agencies are hiring in their field. |
| Job boards and newsletters | Fill a feed with public-sector listings from an official source. |

### How to use it

1. Click **Try for free**.
2. Enter a **Keyword**, for example `analyst`. It is matched against position title, agency and department names.
3. Optionally set an **Occupational series code**, for example `2210` for IT management.
4. Optionally enter **Hiring agency codes**, comma-separated, for example `VATA`.
5. Optionally set a **State**, such as `VA` or `Virginia`.
6. Set a **Minimum salary (USD)** to keep only announcements whose maximum advertised salary is at least that amount.
7. Set **Opened within days** (1 to 365, default 14) and **Maximum results** (1 to 1,000, default 50).
8. Click **Start**.
9. To get only new jobs, turn on **Monitor mode** and schedule the Actor from **Schedules**.

### What data you get

Each row is one job announcement, with these fields.

| Field | What it is | Example |
| --- | --- | --- |
| `id` | USAJobs control number | `846876200` |
| `url` | Link to the announcement on usajobs.gov | `https://www.usajobs.gov/job/846876200` |
| `title` | Position title | `Strategic Analyst` |
| `agency` | Hiring agency | `United States Fleet Forces Command` |
| `department` | Parent department | `Department of Homeland Security` |
| `positionSeries` | OPM occupational series code (can be empty) | `null` |
| `locations` | Job locations (can be empty) | `[]` |
| `states` | US states for the job locations (can be empty) | `[]` |
| `minSalary` | Lowest advertised salary in USD | `121785` |
| `maxSalary` | Highest advertised salary in USD | `158322` |
| `payScale` | Pay plan | `GS` |
| `openDate` | Date the announcement opened | `2026-10-29` |
| `closeDate` | Date the announcement closes | `2027-04-28` |
| `appointmentType` | Type of appointment | `Detail` |
| `workSchedule` | Work schedule | `Full-time` |
| `teleworkEligible` | Whether telework is allowed | `false` |
| `source` | Where the record came from | `data.usajobs.gov historicjoa` |
| `scrapedAt` | When the record was collected | `2026-11-05T01:02:25.385Z` |

### Pricing

| Event | Price |
| --- | --- |
| Result (each result written to the dataset) | $0.01 |

There is no start fee. The price is $10.40 per 1,000 results.

| Run | Cost |
| --- | --- |
| 100 results | $1.04 |
| 1,000 results | $10.40 |
| 10,000 results | $104.00 |

### Good to know

- **Limits.** One run returns at most 1,000 results, scans up to 50 pages, and stops at your time budget (30 to 3,600 seconds, default 240).
- **Filtering.** Date, series and agency filters are applied by the API. Keyword and state filters are applied afterwards, so broad searches may scan many pages. Narrow by series, agency codes or a shorter **Opened within days** to run faster.
- **State matching.** `VA` and `Virginia` are treated the same, and `VA` never matches West Virginia or Nevada.
- **Data source.** All data comes from the public USAJobs Historic JOA API. It lists positions, not people.
- **Freshness.** The historic dataset may lag the live USAJobs site by a short period. Check the linked announcement before applying or reporting.
- **Reliability.** Requests are made one at a time, and temporary errors are retried. If a later page fails, the records already collected are saved.
- **Not affiliated.** This tool isn't affiliated with or endorsed by the US Office of Personnel Management or USAJobs.

### FAQ

**Do I need a USAJobs API key?** No. The open-data endpoint it uses needs no key or login.

**How do I get only new jobs?** Turn on **Monitor mode** and schedule the Actor. Seen IDs are stored in a named key-value store.

**What if nothing matches?** The run ends with an empty dataset and you aren't charged.

### Getting the data out

Download the results as Excel, CSV or JSON from the Output tab. Send them to Google Sheets, Slack, Zapier, Make or webhooks from the **Integrations** tab. Every run is available through the Apify API, and you can schedule runs from **Schedules**.

### Questions or problems

Open an issue on the **Issues** tab and include the run link. I reply within one business day.

### Related tools

- [Public RSS Feed Monitor](https://apify.com/snappytools/rss-feed-monitor): watch public RSS feeds for new items
- [Workday Career Site Jobs Scraper](https://apify.com/snappytools/workday-jobs-monitor): pull jobs from Workday career sites
- [Hacker News Search and Who-is-Hiring Extractor](https://apify.com/snappytools/hackernews-algolia-scraper): search Hacker News and Who-is-Hiring threads

# Actor input Schema

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

Case-insensitive keyword matched against position title, agency and department names.

## `positionSeries` (type: `string`):

Optional four-digit OPM occupational series code, e.g. 2210 for IT management. Leave empty for all series.

## `hiringAgencyCodes` (type: `string`):

Optional comma-separated USAJobs agency subelement codes, e.g. VATA. Leave empty for all agencies.

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

Optional US state name or two-letter abbreviation (e.g. VA or Virginia) used to filter job locations client-side.

## `minSalary` (type: `integer`):

Only keep announcements whose maximum advertised salary is at least this amount.

## `openedWithinDays` (type: `integer`):

Only search announcements whose position open date falls within this many past days.

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

Hard cap on the number of records pushed to the dataset in one run (1-1000).

## `maxRunSeconds` (type: `integer`):

Maximum time spent paging the USAJobs API. When reached, the Actor stops and saves the records found so far instead of timing out. Also capped by the run timeout.

## `monitorMode` (type: `boolean`):

When enabled, only announcements not seen in previous runs are output; seen IDs are stored in a named key-value store.

## Actor input object example

```json
{
  "keyword": "analyst",
  "minSalary": 0,
  "openedWithinDays": 14,
  "maxResults": 20,
  "maxRunSeconds": 240,
  "monitorMode": 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 = {
    "keyword": "analyst",
    "openedWithinDays": 14,
    "maxResults": 20
};

// Run the Actor and wait for it to finish
const run = await client.actor("snappytools/usajobs-public-job-search").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 = {
    "keyword": "analyst",
    "openedWithinDays": 14,
    "maxResults": 20,
}

# Run the Actor and wait for it to finish
run = client.actor("snappytools/usajobs-public-job-search").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 '{
  "keyword": "analyst",
  "openedWithinDays": 14,
  "maxResults": 20
}' |
apify call snappytools/usajobs-public-job-search --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,snappytools/usajobs-public-job-search"
        }
    }
}
```

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/jO8Aa2QYnwykIpA1R/builds/v0ZIkckPzWTkXb4Xm/openapi.json
