Apple APIjobs.apple.com ↗
Search Apple job listings by keyword, location, and team. Retrieve full job descriptions, pay ranges, and location data via 4 structured endpoints.
What is the Apple API?
The Apple Jobs API provides 4 endpoints for querying open positions on jobs.apple.com, returning structured data including job titles, team assignments, posting dates, full descriptions, and pay ranges. The search_jobs endpoint supports keyword search, location filtering, and three sort modes, returning up to 20 results per page with total record counts. Companion endpoints handle location lookup, job detail retrieval, and title autocomplete.
curl -X GET 'https://api.parse.bot/scraper/fe01b80a-ae55-44cf-beb0-5e8df44d30c8/search_jobs?page=1&sort=relevance&query=software+engineer&locale=en-us' \ -H 'X-API-Key: $PARSE_API_KEY'
Typed, relational, agent-ready
A generated client with real types, enums, and the links between objects — the structure a flat JSON response can't carry. Autocompletes in your editor and reads cleanly to coding agents.
- Fully typed · autocompletes
- Objects link to objects
- Typed errors & pagination
Typed Python client. Set up the SDK in your uv project, then pull this API’s typed client:
uv add parse-sdk uv run parse init uv run parse add --marketplace jobs-apple-com-api
uv run parse add --marketplace pulls a pinned snapshot of this canonical API — it won’t change underneath you. To customize it, subscribe and swap to your own copy.
from parse_apis.apple_jobs_api import AppleJobs, Sort, JobNotFound
client = AppleJobs()
# Search for locations to get filter IDs
for loc in client.locations.search(query="San Francisco"):
print(loc.name, loc.code, loc.display_name)
# Search jobs with sorting and location filter
for job in client.jobs.search(query="machine learning", sort=Sort.NEWEST, location="SFMETRO", limit=5):
print(job.title, job.posting_date, job.team.name)
for loc in job.locations:
print(loc.name, loc.country)
# Drill into full details
detail = job.details()
print(detail.description, detail.employment_type, detail.minimum_qualifications)
# Autocomplete job titles
for title in client.jobs.quickfind(query="data sci"):
print(title)
Full-text search over Apple job listings. `query` matches title and summary; `sort` orders results by relevance, newest, or oldest. Location filtering uses IDs from search_locations (e.g. 'SFMETRO'). Returns 20 results per page. Each job summary includes title, team, posting date, and locations but not full description — use get_job_details for that.
| Param | Type | Description |
|---|---|---|
| page | integer | Page number (1-based). |
| sort | string | Sort order. |
| query | string | Search keyword (e.g. 'machine learning', 'software engineer'). Empty string returns all jobs. |
| locale | string | Locale code (e.g. 'en-us'). |
| location | string | Location filter ID(s), comma-separated. Use search_locations to find valid IDs. Can use full ID like 'postLocation-SFMETRO' or short code like 'SFMETRO'. |
{
"type": "object",
"fields": {
"jobs": "array of job summary objects with id, position_id, title, summary, posting_date, type, team, locations",
"per_page": "integer - results per page (20)",
"total_pages": "integer - total pages available",
"current_page": "integer - current page number",
"total_records": "integer - total matching jobs"
},
"sample": {
"data": {
"jobs": [
{
"id": "200665352-0351",
"team": {
"teamID": "teamsAndSubTeams-MLAI",
"teamCode": "MLAI",
"teamName": "Machine Learning and AI"
},
"type": "PIPE",
"title": "Machine Learning Engineer",
"summary": "Are you passionate about frontier AI technology...",
"locations": [
{
"city": "",
"name": "Beijing",
"level": 5,
"metro": "",
"region": "",
"countryID": "iso-country-CHN",
"countryName": "China",
"stateProvince": "",
"postLocationId": "postLocation-BJS"
}
],
"home_office": false,
"position_id": "200665352",
"posting_date": "May 27, 2026",
"weekly_hours": 40,
"posting_date_gmt": "2026-05-27T02:16:33.082Z",
"is_multi_location": false,
"transformed_title": "machine-learning-engineer"
}
],
"per_page": 20,
"total_pages": 133,
"current_page": 1,
"total_records": 2656
},
"status": "success"
}
}About the Apple API
Search and Filter Job Listings
The search_jobs endpoint accepts a query string matched against job titles and summaries, a location filter using IDs sourced from search_locations, and a sort parameter accepting relevance, newest, or oldest ordering. Results are paginated at 20 per page; the response includes total_records, total_pages, and current_page fields for cursor management. Each job summary object carries id, position_id, title, summary, posting_date, type, team, and locations.
Full Job Detail
The get_job_details endpoint takes a composite job_id (e.g. 200657324-0836) from search results and returns the complete posting: full description text, teams array with code/name/id, detailed locations with city/state/country/metro/region breakdowns, a home_office boolean, and eeo_content as raw HTML when present. Pay range data is also included at this level and is absent from search summaries.
Location and Title Discovery
search_locations resolves a plain-language place name (e.g. San Francisco, London) into location objects containing id, code, name, display_name, city, state_province, and level. The returned id or code values feed directly into search_jobs as the location parameter. The quickfind endpoint accepts a partial job title string and returns up to 10 autocomplete suggestions from active listings — useful for normalizing title strings before running a full search.
The Apple API is a managed, monitored endpoint for jobs.apple.com — not a raw scraper you maintain. Every endpoint is automatically health-checked on a schedule, and when jobs.apple.com changes and a check fails, the API is automatically queued for repair and re-verified. It is built to keep working as the site underneath it changes.
This isn't an official jobs.apple.com API — it's an independent, maintained REST wrapper over public data. Where the source has no official API (or only a limited one), Parse gives you a stable contract over a source that never promised one, and keeps it current. Need a new endpoint or field? You can revise it yourself in plain English and the agent rebuilds it against the live site in minutes — contributing the change back to the shared API is free.
Will this API break when the source site changes?+
Is this an official API from the source site?+
Can I fix or extend this API myself if I need a new endpoint or field?+
What happens if I call an endpoint that has an issue?+
- Monitor new Apple job postings by team or location using
search_jobswithsort=newestand a team keyword - Build a job alert system that tracks
total_recordschanges for a saved query over time - Aggregate Apple hiring trends by parsing
teamandposting_datefields across paginated results - Extract full job descriptions and qualifications via
get_job_detailsfor skills analysis or resume matching - Resolve city or metro names to valid location IDs using
search_locationsbefore constructing filtered searches - Autocomplete job title inputs in a search UI using the
quickfindendpoint against live Apple listings - Identify whether specific roles (e.g. machine learning, computer vision) are hiring remotely via the
home_officefield
| Tier | Price | Credits/month | Rate limit |
|---|---|---|---|
| Free | $0/mo | 100 | 5 req/min |
| Hobby | $30/mo | 1,000 | 20 req/min |
| Developer | $100/mo | 5,000 | 100 req/min |
One credit = one API call regardless of which marketplace API you call. Exceeding the rate limit returns a 429 response. Authenticate with the X-API-Key header.
Does Apple provide an official public API for its job listings?+
What does `get_job_details` return that `search_jobs` does not?+
get_job_details adds the full description text, a home_office boolean, structured teams objects with code and id, granular location fields (city, state_province, country, metro, region), eeo_content as HTML, and pay range information. The search_jobs response includes only summary-level fields: title, team name, posting date, type, and coarse location.How does pagination work in `search_jobs`?+
total_records, total_pages, and current_page integers. Pass the page parameter (1-based) to step through results. There is no cursor or offset parameter — only integer page numbers are supported.Does the API cover Apple job listings outside the United States?+
search_jobs endpoint accepts location IDs for international offices returned by search_locations, so non-US postings are reachable when a valid international location ID is supplied. However, the locale parameter influences which regional listings appear, and coverage depth for non-US regions may vary. You can fork this API on Parse and revise it to add region-specific defaults or locale presets for international coverage.