apple-jobs
A lightweight Python client for Apple job listings on jobs.apple.com. No API key, no browser automation.
Install
# From GitHub (recommended for now)
pip install git+https://github.com/Mikedan37/apple-jobs.git
# Or clone and install locally
git clone https://github.com/Mikedan37/apple-jobs.git
cd apple-jobs
pip install -e .
Requires Python 3.10+ and httpx.
Quick example
from apple_jobs import AppleJobsClient
client = AppleJobsClient()
for job in client.search(query="iOS engineer", limit=5):
print(f"{job.title} — {job.team.name}")
print(f" {job.location} · {job.posting_date}")
print(f" {job.url}")
print()
client.close()
CLI
~6,000+ live positions across Apple teams and locations.
apple-jobs count # total open positions
apple-jobs search "Swift" # search by keyword
apple-jobs search --team "Software" # filter by team
apple-jobs search "iOS" --location "US" # combine filters
apple-jobs page 5 # fetch a specific page
apple-jobs dump > jobs.jsonl # all jobs as JSON lines
Or via module: python -m apple_jobs count
Why this exists
Apple does not provide a public jobs API.
This package gives you a clean, stable interface over the public job listings so you can:
- search roles programmatically
- build job matching pipelines
- automate job discovery workflows
One dependency (httpx). No Selenium. No API key.
What this does
- Fetches Apple job listings from
jobs.apple.com - Parses structured job data from server-rendered HTML (no headless browser)
- Returns typed Python models (
AppleJob,AppleJobsPage) - Handles pagination, retries, and rate limiting
- Provides a small CLI for quick lookups and bulk export
What this does NOT do
- Does not apply to jobs on your behalf
- Does not bypass authentication or access controls
- Does not scrape aggressively or circumvent rate limits
- Does not cover job boards other than Apple
- Does not enrich, score, or rank jobs
Responsible use
This library parses data already served to standard browser requests. Built-in safeguards:
- 0.5s default delay between page requests. Do not set it to zero.
- 3 retries max on transient failures. No infinite loops.
- Honest User-Agent with a project URL. Do not spoof it.
If Apple changes their site structure or blocks automated access, this library will stop working. That is their right. File an issue and we will adapt.
API reference
AppleJobsClient
client = AppleJobsClient(delay=0.5, retries=3, timeout=30.0)
| Method | Returns | Description |
|---|---|---|
search(query=, location=, team=, limit=) |
list[AppleJob] |
Search with client-side filtering |
search_page(page=1) |
AppleJobsPage |
Fetch a single page (20 jobs) |
iter_jobs(max_pages=300) |
Iterator[AppleJob] |
Auto-paginate all jobs |
get_total_count() |
int |
Total open positions |
close() |
— | Close HTTP client |
Supports context manager: with AppleJobsClient() as client: ...
AppleJob
| Field | Type | Description |
|---|---|---|
position_id |
str |
Apple's unique position ID |
title |
str |
Job title |
summary |
str |
2-3 paragraph description |
url |
str |
Direct link to posting |
posted_at |
datetime? |
UTC timestamp |
posting_date |
str |
Human-readable date |
team |
AppleJobTeam |
Department (name, code) |
locations |
list[AppleJobLocation] |
One or more locations |
home_office |
bool |
Remote-eligible |
weekly_hours |
int |
40 = full-time |
Properties: location (primary as string), is_remote, is_part_time
AppleJobsPage
| Field | Type | Description |
|---|---|---|
jobs |
list[AppleJob] |
Up to 20 jobs |
total_records |
int |
Total matching jobs |
page |
int |
Current page (1-indexed) |
Properties: total_pages, has_next
Development
git clone https://github.com/Mikedan37/apple-jobs.git
cd apple-jobs
pip install -e ".[dev]"
pytest tests/ -v # 32 tests, ~0.5s, fully offline
Tests parse saved HTML fixtures. No network calls. If Apple changes their site and tests break, re-capture:
curl -s "https://jobs.apple.com/en-us/search?page=1" \
-H "user-agent: apple-jobs-python-client/0.1" \
-o tests/fixtures/search_page_1.html
Limitations
- Client-side filtering. Apple's search page does not support server-side text queries via URL params.
search()fetches pages and filters locally. - Summaries only. The
summaryfield is from the search listing (2-3 paragraphs). Full detail pages exist at eachurlbut are not fetched. - HTML parsing is inherently fragile. If Apple redesigns their career site, the parser will break. File an issue.
Maintained by
Maintained by Danylchuk Studios, LLC (Seeker project).
This project is not affiliated with or endorsed by Apple Inc. Intended for personal use, research, and tooling. Not for high-volume scraping or commercial redistribution of Apple job listings.
License
MIT
Metadata
Release files for apple-jobs 0.1.1
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 | |
|---|---|---|---|---|
| apple_jobs-0.1.1.tar.gz | 16.6 kB | Without provenance | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| apple_jobs-0.1.1-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 31.8 kB
Release files / apple_jobs-0.1.1.tar.gz
| Download URL | apple_jobs-0.1.1.tar.gz |
|---|---|
| Size | 16.6 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
dafcea1637d0e9e8c3472a1efc15dfd42fded023f673db56468e72b8f69a8106
|
|
BLAKE2b-256 checksum How to use checksums |
f1e805c0992c4749386efbc604ec720c4264f15c7cfff54c085ecae7adeaafb8
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/5.1.1 CPython/3.9.6
|
Release files / apple_jobs-0.1.1-py3-none-any.whl
| Download URL | apple_jobs-0.1.1-py3-none-any.whl |
|---|---|
| Size | 15.2 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
e05939dc79754e48ac30fe323c0f20ccee2ebd623f43badd36f2219222a6ecd9
|
|
BLAKE2b-256 checksum How to use checksums |
3dbadbcd849a8f1d03739ce410e6acfa3e2c2d0be153bcd820d125220c420b66
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/5.1.1 CPython/3.9.6
|
Security for apple-jobs 0.1.1
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.