CareerPuck Jobs API.
Modern ATS platform that provides a public JSON API with full job descriptions in a single request.
Try the API.
Test Jobs, Feed, and Auto-Apply endpoints against https://connect.jobo.world with live request/response examples, then copy ready-to-use curl commands.
What's in every response.
Data fields, real-world applications, and the companies already running on CareerPuck.
- Public JSON API
- Full job descriptions
- ATS proxy/aggregator
- No authentication required
- CORS enabled
- Single endpoint for all data
- 01Job board aggregation
- 02ATS migration tracking
- 03Multi-platform job monitoring
- 04Career page enrichment
How to scrape CareerPuck.
Step-by-step guide to extracting jobs from CareerPuck-powered career pages—endpoints, authentication, and working code.
import requests
import re
sitemap_url = "https://app.careerpuck.com/sitemap.xml"
response = requests.get(sitemap_url)
pattern = r'https://app\.careerpuck\.com/job-board/([^<]+)'
companies = re.findall(pattern, response.text)
print(f"Found {len(companies)} company job boards")
print(f"Sample companies: {companies[:5]}")import requests
company = "earnest"
url = f"https://api.careerpuck.com/v1/public/job-boards/{company}"
headers = {
"accept": "*/*",
"origin": "https://app.careerpuck.com",
"referer": "https://app.careerpuck.com/"
}
response = requests.get(url, headers=headers)
data = response.json()
jobs = data.get("jobs", [])
print(f"Found {len(jobs)} active jobs")import html
for job in jobs:
# HTML-decode the content field
description = html.unescape(job.get("content", ""))
print({
"id": job.get("permalink"),
"title": job.get("title"),
"location": job.get("location"),
"department": job.get("department"),
"team": job.get("team"),
"work_type": job.get("workType"),
"workplace_type": job.get("workplaceType"),
"url": job.get("publicUrl"),
"apply_url": job.get("applyUrl"),
"posted_at": job.get("postedAt"),
"source_platform": job.get("atsSourcePlatform"),
"description_html": description[:200],
})employer = data.get("employerProfile", {})
departments = data.get("departments", [])
print({
"company_name": employer.get("companyName"),
"logo_url": employer.get("logoUrl"),
"website": employer.get("website"),
"departments": departments,
})import requests
def fetch_careerpuck_jobs(company: str) -> list:
url = f"https://api.careerpuck.com/v1/public/job-boards/{company}"
headers = {
"accept": "*/*",
"origin": "https://app.careerpuck.com",
"referer": "https://app.careerpuck.com/"
}
try:
response = requests.get(url, headers=headers, timeout=10)
response.raise_for_status()
data = response.json()
return data.get("jobs", [])
except requests.exceptions.HTTPError as e:
if response.status_code == 404:
print(f"Company '{company}' not found")
else:
print(f"HTTP error: {e}")
return []
except requests.exceptions.RequestException as e:
print(f"Request failed: {e}")
return []
jobs = fetch_careerpuck_jobs("earnest")The 'content' field contains HTML-encoded text (e.g., <div>). Use Python's html.unescape() or equivalent to decode before processing.
The API requires 'origin: https://app.careerpuck.com' and 'referer: https://app.careerpuck.com/' headers. Requests without these may fail.
Verify the company identifier from the job board URL. The identifier in 'app.careerpuck.com/job-board/{company}' must match the API parameter.
Some companies may have no active job postings. Check if the 'jobs' array is empty and handle this case gracefully in your code.
CareerPuck often acts as a proxy for other ATS platforms. The 'atsSourcePlatform' field indicates the original ATS (greenhouse, lever, etc.). Use 'applyUrl' to redirect applicants correctly.
The sitemap structure may change over time. Implement fallback mechanisms and validate extracted company identifiers before API calls.
- 1Use the listings API for complete job data - no need to fetch individual job details
- 2Always HTML-decode the 'content' field before parsing or displaying
- 3Include origin and referer headers to ensure successful API requests
- 4Cache results - job boards typically update daily
- 5Check the 'atsSourcePlatform' field to understand the underlying ATS
- 6Use the sitemap at app.careerpuck.com/sitemap.xml for company discovery
One endpoint. All CareerPuck jobs. No scraping, no sessions, no maintenance.
Get API accesscurl "https://enterprise.jobo.world/api/jobs?sources=careerpuck" \
-H "X-Api-Key: YOUR_KEY" Access CareerPuck
job data today.
One API call. Structured data. No scraping infrastructure to build or maintain — start with the free tier and scale as you grow.