All platforms

CareerPuck Jobs API.

Modern ATS platform that provides a public JSON API with full job descriptions in a single request.

CareerPuck
Live
20K+jobs indexed monthly
<3haverage discovery time
1hrefresh interval
Companies using CareerPuck
EarnestLyft
Developer tools

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.

Data fields
  • Public JSON API
  • Full job descriptions
  • ATS proxy/aggregator
  • No authentication required
  • CORS enabled
  • Single endpoint for all data
Use cases
  1. 01Job board aggregation
  2. 02ATS migration tracking
  3. 03Multi-platform job monitoring
  4. 04Career page enrichment
Trusted by
EarnestLyft
DIY GUIDE

How to scrape CareerPuck.

Step-by-step guide to extracting jobs from CareerPuck-powered career pages—endpoints, authentication, and working code.

RESTbeginnerNo rate limiting observedNo auth

Discover company job boards

Use the public sitemap to discover all available company job boards on CareerPuck. Extract the company identifier from each URL for API access.

Step 1: Discover company job boards
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]}")

Fetch all job listings

Use the public job board API endpoint to retrieve all active jobs with full descriptions in a single request. The API requires specific headers for origin and referer.

Step 2: Fetch all job listings
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")

Parse job details from the response

Extract the fields you need from each job object. The API returns full HTML descriptions, location, department, and workplace type information. Remember to HTML-decode the content field.

Step 3: Parse job details from the response
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],
    })

Extract company profile information

The API response includes employer profile data such as company name, logo, and website which can be useful for enriching your job data.

Step 4: Extract company profile information
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,
})

Handle errors and edge cases

Implement proper error handling for 404 responses when a company is not found, and handle empty job arrays gracefully.

Step 5: Handle errors and edge cases
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")
Common issues
mediumHTML-encoded content field

The 'content' field contains HTML-encoded text (e.g., &lt;div&gt;). Use Python's html.unescape() or equivalent to decode before processing.

highMissing Origin/Referer headers

The API requires 'origin: https://app.careerpuck.com' and 'referer: https://app.careerpuck.com/' headers. Requests without these may fail.

mediumCompany not found (404 error)

Verify the company identifier from the job board URL. The identifier in 'app.careerpuck.com/job-board/{company}' must match the API parameter.

lowEmpty jobs array

Some companies may have no active job postings. Check if the 'jobs' array is empty and handle this case gracefully in your code.

lowJobs proxy to other ATS platforms

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.

lowSitemap changes affect company discovery

The sitemap structure may change over time. Implement fallback mechanisms and validate extracted company identifiers before API calls.

Best practices
  1. 1Use the listings API for complete job data - no need to fetch individual job details
  2. 2Always HTML-decode the 'content' field before parsing or displaying
  3. 3Include origin and referer headers to ensure successful API requests
  4. 4Cache results - job boards typically update daily
  5. 5Check the 'atsSourcePlatform' field to understand the underlying ATS
  6. 6Use the sitemap at app.careerpuck.com/sitemap.xml for company discovery
Or skip the complexity

One endpoint. All CareerPuck jobs. No scraping, no sessions, no maintenance.

Get API access
cURL
curl "https://enterprise.jobo.world/api/jobs?sources=careerpuck" \
  -H "X-Api-Key: YOUR_KEY"
Ready to integrate

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.

99.9%API uptime
<200msAvg response
50M+Jobs processed