# Bay Area Gov Jobs Scraper — osgovjobportal.com (`studio-amba/osgovjobportal-scraper`) Actor

Scrape live SF Bay Area government job openings from osgovjobportal.com: title, agency, region, location, employment type, required experience, requisition ID, salary (when disclosed) and apply links. No login or cookies required.

- **URL**: https://apify.com/studio-amba/osgovjobportal-scraper.md
- **Developed by:** [Studio Amba](https://apify.com/studio-amba) (community)
- **Categories:** Jobs
- **Stats:** 2 total users, 1 monthly users, 90.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.20 / 1,000 result 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/platform/actors/running/actors-in-store#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

## Bay Area Gov Jobs Scraper

Extract live government job openings from [osgovjobportal.com](https://www.osgovjobportal.com/) ("Bay Area Gov Jobs"), a search aggregator covering roughly 20 SF Bay Area cities and counties — San Francisco, Oakland, San Jose, Berkeley, Santa Clara County, Contra Costa County, Sonoma County, and more. Get every currently live job as clean structured JSON: title, hiring government/department, region, location, employment type, required experience, requisition ID, salary (when disclosed) and direct apply links.

No login. No cookies. No browser automation. osgovjobportal.com is fully server-rendered — the actor talks directly to the same HTML the site itself renders, so it is fast, cheap and stable.

### What this actor does

Bay Area Gov Jobs pulls open positions from ~20 separate government hiring platforms (SmartRecruiters, governmentjobs.com, and each city/county's own ATS) into one searchable index with a map, skill-tag search, government/region picker and a required-years-of-experience filter. This actor fetches the site's live result set — 737 jobs at the time this actor was built — and lets you filter it down by keyword, skill tag, government, and required-experience range, then returns one row per job with:

- Job title and canonical URL
- Hiring government (e.g. San Francisco, Oakland, Santa Clara County) and Bay Area sub-region (SF, East Bay, North Bay, Peninsula, South Bay)
- Department, when disclosed
- Location and employment type (full-time, part-time, temporary, permanent)
- Posted date (raw text and parsed ISO)
- Required experience, as both the site's own text and a parsed year count
- Matched skill/category tags (e.g. Nursing, Public Safety, Legal, Software Engineering)
- Requisition ID and seniority/recruitment status (Open, Open & Promotional, Associate, Entry Level, etc.) — from each job's own detail page
- Salary range, when the government discloses it (most consistent for San Francisco's SmartRecruiters listings; many other governments don't publish a number)
- Direct apply link and a link to the original listing on the government's own hiring platform

### Why use it

- **Government job search automation** — track every open Bay Area public-sector role in one feed instead of checking ~20 separate city/county career sites.
- **Recruiting and workforce research** — see hiring volume and mix by government, region, department and skill category.
- **Salary benchmarking** — San Francisco discloses full salary ranges on essentially every listing; use this to benchmark public-sector pay by role and seniority.
- **Job alerts and lead generation** — filter by skill tag (e.g. nursing, legal, IT) or minimum required experience to build a targeted alert feed.
- **Civic/labor market research** — a repeatable snapshot of Bay Area public-sector hiring activity over time.

### How to scrape Bay Area Gov Jobs data

1. Open the actor and set a **Search Keyword** (for example `nurse`, `engineer`, `analyst`) or leave it empty to return all live jobs.
2. Optionally set a **Skill / Category Tag** (e.g. `nursing`, `python`, `legal`, `public_safety`) to match the site's own skill filter.
3. Optionally pick one or more **Governments** (city/county) to restrict results — leave empty for all ~20 covered governments.
4. Optionally adjust the **Minimum/Maximum Required Experience** range (0–10 years), matching the site's own experience slider.
5. Leave **Fetch Full Job Details** enabled to get requisition ID, salary (when disclosed), seniority/status and apply links — disable it for a faster, list-only run using only the fields visible on the search results page.
6. Set **Max Results** to how many jobs you want back.
7. Click **Start**.

The actor makes one request to osgovjobportal.com's search page, which returns every job matching your filters as static HTML in a single response (no pagination — the site renders the full result set every time). When **Fetch Full Job Details** is on, the actor then fetches each matched job's own detail page (bounded by Max Results, 5 requests in parallel) to fill in requisition ID, salary and apply links. Export as JSON, CSV or Excel.

### Input

| Field | Type | Description |
|-------|------|-------------|
| `searchQuery` | string | Free-text keyword matched against job titles/descriptions. Default: `nurse`. |
| `skillTag` | string | Filter by one of the site's built-in skill/category tag IDs (e.g. `nursing`, `legal`, `python`). Empty = all. |
| `governments` | array | Restrict to one or more government slugs (e.g. `sf`, `oakland`, `santa-clara-county`). Empty = all ~20 governments. |
| `minYearsExperience` | integer | Lower bound of the required-experience filter (0–10). Default: `0`. |
| `maxYearsExperience` | integer | Upper bound of the required-experience filter (0–10). Default: `10`. |
| `fetchJobDetails` | boolean | Fetch each job's detail page for requisition ID, salary, seniority and apply links. Default: `true`. |
| `maxResults` | integer | Maximum number of jobs to return. Default: `30`. |
| `proxyConfiguration` | object | Apify proxy settings. The site has no anti-bot protection, so any setting (including none) works. |

#### Example input

```json
{
    "searchQuery": "nurse",
    "skillTag": "",
    "governments": [],
    "minYearsExperience": 0,
    "maxYearsExperience": 10,
    "fetchJobDetails": true,
    "maxResults": 30
}
```

#### Example output

```json
{
    "title": "Economic Justice Center Impact Manager - Office of the Treasurer & Tax Collector (1823)",
    "url": "https://www.osgovjobportal.com/jobs/3743990014213356",
    "government": "San Francisco",
    "governmentSlug": "sf",
    "region": "SF",
    "department": "Treasurer-Tax Collector",
    "location": "San Francisco, CA, United States",
    "employmentType": "Full-time",
    "postedDate": "2026-07-20T22:00:00.000Z",
    "postedDateRaw": "Jul 21, 2026",
    "requiredExperienceText": "Required experience: 3 years",
    "requiredExperienceYears": 3,
    "skillTags": ["Administration", "Finance & Budget", "Legal", "Project Management"],
    "requisitionId": "RTF0165123-01154985",
    "seniorityLevel": "Associate",
    "salaryText": "$126,126 - $153,296",
    "salaryMin": 126126,
    "salaryMax": 153296,
    "applyUrl": "https://jobs.smartrecruiters.com/CityAndCountyOfSanFrancisco1/3743990014213356-...",
    "originalListingUrl": "https://jobs.smartrecruiters.com/CityAndCountyOfSanFrancisco1/3743990014213356-...",
    "scrapedAt": "2026-07-23T09:18:01.749Z"
}
```

### Governments covered

San Francisco, Oakland, Berkeley, City of Alameda, Fremont, Hayward, Richmond, Contra Costa County, San Jose, Santa Clara, Santa Clara County, Sunnyvale, Mountain View, Palo Alto, San Mateo County, Marin County, Napa County, Solano County, Sonoma County, Vallejo.

### Notes on data quality

- Salary is only reliably disclosed by San Francisco's SmartRecruiters-hosted listings — most other governments (governmentjobs.com and self-hosted ATS platforms) don't publish a number on the listing itself. Missing salary is expected, not a scraping error.
- Requisition ID, seniority/status and apply/original-listing links come from each job's detail page — they're only populated when **Fetch Full Job Details** is enabled.
- `requiredExperienceText` and `requiredExperienceYears` reflect the government's own stated requirement; roughly half of listings don't specify a number and will show `null`/"not specified" — that's the government's own disclosure, not a parsing gap.

### Is this legal?

Yes. This actor reads publicly available job listing pages — the same pages any visitor or job seeker can view without logging in. No paywalled or authenticated content is accessed.

# Actor input Schema

## `searchQuery` (type: `string`):

Free-text keyword matched against job titles and descriptions (e.g. 'nurse', 'engineer', 'analyst'). Leave empty to return all live jobs.

## `skillTag` (type: `string`):

Filter by one of the site's built-in skill/category tags, e.g. 'nursing', 'python', 'legal', 'public\_safety', 'facilities\_maintenance'. Leave empty for all.

## `governments` (type: `array`):

Restrict results to one or more Bay Area governments. Leave empty for all ~20 covered governments.

## `minYearsExperience` (type: `integer`):

Only return jobs whose stated required experience falls in this range. Matches the site's own 0-10 year filter slider.

## `maxYearsExperience` (type: `integer`):

Upper bound of the required-experience range.

## `fetchJobDetails` (type: `boolean`):

When enabled, fetches each job's own detail page for extra fields (requisition ID, salary when disclosed, seniority/status, apply link, original listing link). Adds one extra HTTP request per job. Disable for a faster, list-only run.

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

Maximum number of jobs to return.

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

osgovjobportal.com is server-rendered behind Cloudflare with no bot challenge observed — any proxy configuration works, including none at all.

## Actor input object example

```json
{
  "searchQuery": "nurse",
  "skillTag": "",
  "governments": [],
  "minYearsExperience": 0,
  "maxYearsExperience": 10,
  "fetchJobDetails": true,
  "maxResults": 30,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}
```

# 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 = {
    "searchQuery": "nurse",
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ]
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("studio-amba/osgovjobportal-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 = {
    "searchQuery": "nurse",
    "proxyConfiguration": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
    },
}

# Run the Actor and wait for it to finish
run = client.actor("studio-amba/osgovjobportal-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print("💾 Check your data here: https://console.apify.com/storage/datasets/" + run["defaultDatasetId"])
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "searchQuery": "nurse",
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}' |
apify call studio-amba/osgovjobportal-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=studio-amba/osgovjobportal-scraper",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/acts/P9KoqkOpWLEan4Mds/builds/0DEtQyiZDhU4nJmx9/openapi.json
