Metadata-Version: 2.5
Name: cyberjobs
Version: 1.0.0
Summary: Find open cybersecurity jobs with stated salaries from Python or a terminal. No API key, standard library only.
Project-URL: Homepage, https://cyberjobs.cc/apps
Project-URL: Job board, https://cyberjobs.cc
Project-URL: MCP server, https://cyberjobs.cc/api/mcp
Author-email: "CyberJobs.cc" <hello@cyberjobs.cc>
License-Expression: MIT
License-File: LICENSE
Keywords: appsec,cli,cloud-security,cybersecurity,cybersecurity-jobs,grc,infosec,job-search,jobs,mcp,pentest,salary,security-jobs,soc
Classifier: Development Status :: 5 - Production/Stable
Classifier: Environment :: Console
Classifier: Intended Audience :: Developers
Classifier: Intended Audience :: End Users/Desktop
Classifier: Operating System :: OS Independent
Classifier: Programming Language :: Python :: 3
Classifier: Programming Language :: Python :: 3 :: Only
Classifier: Programming Language :: Python :: 3.9
Classifier: Programming Language :: Python :: 3.10
Classifier: Programming Language :: Python :: 3.11
Classifier: Programming Language :: Python :: 3.12
Classifier: Programming Language :: Python :: 3.13
Classifier: Topic :: Internet :: WWW/HTTP
Classifier: Topic :: Software Development :: Libraries :: Python Modules
Classifier: Typing :: Typed
Requires-Python: >=3.9
Description-Content-Type: text/markdown

# cyberjobs

Look up open cybersecurity jobs from Python or a terminal, straight from the [CyberJobs.cc](https://cyberjobs.cc) board.

The board holds about 2,900 open security roles, refreshed every hour from the hiring systems of about 650 employers. Each listing shows the salary its posting states, and its link leads to the employer's own application.

- Free. No account, no API key.
- Python 3.9 or newer, standard library only.
- Ships type information (`py.typed`).

## Install

```sh
pip install cyberjobs
```

## Use it from Python

```python
from cyberjobs import search_jobs, KINDS

result = search_jobs(
    "detection engineer",           # words to find in the job title
    kind=["cloud-security", "security-operations"],  # or "cloud-security,security-operations"
    country="US",                   # roles open to people in the United States
    min_salary_usd=150000,          # stated yearly top of at least $150,000
    sort="pay",
    limit=5,
)

print(result["total"], "roles match")
for role in result["roles"]:
    print(role["title"], "|", role["platform"], "|", role["pay"], "|", role["url"])
```

The signature is `search_jobs(q=None, *, kind, platform, country, min_salary_usd, since, sort, limit, offset, src="pypi-package")`, and every argument can be left out:

| Argument | What it does |
| --- | --- |
| `q` | Words to find in role titles, for example `"penetration tester"` |
| `kind` | A specialty slug, several joined by commas, or a list (see `KINDS`) |
| `platform` | An employer slug, for example `"mongodb"` |
| `country` | ISO 3166-1 alpha-2 code, such as `"US"`: roles open to people there |
| `min_salary_usd` | Roles whose stated yearly top is at least this many dollars |
| `since` | Roles first listed on or after this date, `"YYYY-MM-DD"` |
| `sort` | `"balanced"` (default), `"recent"` or `"pay"` |
| `limit` | Page size, 1 to 50 (the API's default is 20) |
| `offset` | Roles to skip, for the next page |
| `src` | A short slug naming your app, carried by every role link. Defaults to `"pypi-package"` |

The reply is a dict:

```python
{
    "total": 42,
    "roles": [
        {
            "id": "...",
            "title": "Senior Cloud Security Engineer",
            "platform": "Altruist",
            "platform_slug": "altruist",
            "kind": "Cloud Security",
            "kind_slug": "cloud-security",
            "pay": "$200,000–$240,000/yr",
            "location": "San Francisco, CA",
            "remote": False,
            "listed": "2026-09-09",
            "first_seen_at": "2026-11-12T22:07:02.767181+00:00",
            "url": "https://cyberjobs.cc/jobs/senior-cloud-security-engineer-3866390c9b8a",
        }
    ],
    "more": "https://cyberjobs.cc/",
}
```

`pay` carries the salary range from the posting. When a posting states none, it is a sentence that begins "No salary".

If you build a tool on this package, pass your own `src` so the board can tell which tool a visit arrived from.

`KINDS` holds the ten specialty slugs and `KIND_LABELS` their names:

| Slug | Specialty |
| --- | --- |
| `security-engineering` | Security Engineering |
| `security-operations` | Security Operations & Incident Response |
| `cloud-security` | Cloud Security |
| `application-security` | Application & Product Security |
| `identity-access` | Identity & Access Management |
| `offensive-security` | Penetration Testing & Red Team |
| `threat-intelligence` | Threat Intelligence & Security Research |
| `governance-risk-compliance` | Governance, Risk & Compliance (GRC) |
| `security-architecture` | Security Architecture & Consulting |
| `security-leadership` | Security Leadership |

Problems surface as `CyberJobsError`, which has a `status` attribute set when the server replied (for instance an unknown `kind` gives 400) and `None` when it could not be reached. Brief network errors such as a timeout are retried twice first. A `limit`, `offset` or `min_salary_usd` outside its range raises `ValueError` before any request goes out.

The endpoint is `GET https://cyberjobs.cc/api/v1/jobs`.

## Terminal

```sh
cyberjobs search [keywords] [--kind cloud-security] [--country US] [--min-salary 150000] [--sort pay] [--limit 20] [--json]
cyberjobs kinds
python -m cyberjobs search "detection engineer"
```

Further options: `--platform <slug>`, `--since YYYY-MM-DD`, `--offset <n>`, `--version`, `--help`. Salaries are yearly dollars.

```sh
# Cloud security roles open in the US with a stated top of $150,000 or more, best paid first
cyberjobs search --kind cloud-security --country US --min-salary 150000 --sort pay --limit 10

# Two specialties at once, printed as JSON for scripts
cyberjobs search --kind application-security,offensive-security --limit 25 --json
```

The table looks like this:

```
TITLE                                        PAY                   EMPLOYER  LINK
-------------------------------------------  --------------------  --------  ------------------------------------------------------------------------------
Security Engineer III                        $205,920–$343,200/yr  Veeam     https://cyberjobs.cc/jobs/security-engineer-iii-1a116caaf2f9?src=pypi-package
Security Engineer, Cloud                     $270,000–$330,000/yr  Rogo      https://cyberjobs.cc/jobs/security-engineer-cloud-707a611d3a14?src=pypi-package
Senior Security Engineer, Platform Security  $217,800–$326,800/yr  Block     https://cyberjobs.cc/jobs/senior-security-engineer-platform-security-d422a6fb5444?src=pypi-package

Roles 1 to 3 of 40 open. Browse the board: https://cyberjobs.cc/?src=pypi-package
```

Every link opens the role's page on CyberJobs.cc, which sends you on to the employer's own application.

## For AI assistants (MCP)

An MCP server for the same data is hosted at no cost and needs no key. Its tools are `search_cybersecurity_jobs`, `get_cybersecurity_salaries`, `get_cybersecurity_job_market` and `get_cybersecurity_employer`:

```
https://cyberjobs.cc/api/mcp
```

In Claude Code, add it with `claude mcp add --transport http cyberjobs https://cyberjobs.cc/api/mcp`. A client that can only start local programs can use the npm package with the same name: `{"command": "npx", "args": ["-y", "cyberjobs", "mcp"]}`.

## Privacy

- **Nothing to sign up for.** No key, no account.
- **What leaves your machine.** Your filters travel as query parameters to `https://cyberjobs.cc/api/v1/jobs`, together with a `src` tag (`pypi-package` unless you set another) and a `User-Agent` shaped like `cyberjobs-pypi/<version>`. As with any web request, the server also sees your IP address.
- **What does not.** There is no telemetry, no file is read or written, and the only host contacted is `cyberjobs.cc`.
- **Read-only.** The package fetches public job data and never applies, posts or changes anything for you.
- **Who is behind it.** CyberJobs.cc is a job board. Job seekers pay nothing; the board earns a referral fee on some of its links.

## License

MIT. Copyright (c) 2026 O-mega Enterprise, Inc.
