cyberjobs
Look up open cybersecurity jobs from Python or a terminal, straight from the 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
pip install cyberjobs
Use it from 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:
{
"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
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.
# 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 asrctag (pypi-packageunless you set another) and aUser-Agentshaped likecyberjobs-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.
Metadata
Release files for cyberjobs 1.0.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | Actions |
|---|---|---|---|---|
| cyberjobs-1.0.0.tar.gz | 11.4 kB | Without provenance | Details for cyberjobs-1.0.0.tar.gz |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Actions Reset |
|---|---|---|---|---|
| cyberjobs-1.0.0-py3-none-any.whl | Python 3 | none | any | Details for cyberjobs-1.0.0-py3-none-any.whl |
Total release size: 22.9 kB
Release files / cyberjobs-1.0.0.tar.gz
| Download URL | cyberjobs-1.0.0.tar.gz |
|---|---|
| Size | 11.4 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
b02bd80b5041cd75c13a8ab0d416c335021ac623fca775974326542de7609e78
|
|
BLAKE2b-256 checksum How to use checksums |
424ec747d683cfc740fcf75383ee48d3c9aebc4c4a0c9817035a55ca8bc40717
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.12.3
|
Release files / cyberjobs-1.0.0-py3-none-any.whl
| Download URL | cyberjobs-1.0.0-py3-none-any.whl |
|---|---|
| Size | 11.6 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
8ee6b32659891c8877e14e898b665f312aed46cfeb61e5eaba35074035b4358b
|
|
BLAKE2b-256 checksum How to use checksums |
0967e16aa4acf84051ab70524848d8a522bb9a5f5a0eabfc03172190ebd9e917
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.12.3
|
Security for cyberjobs 1.0.0
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
No provenance found
None of the files in this release were uploaded with provenance metadata.
A note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.