OfferZen APIofferzen.com ↗
Search and retrieve tech job listings from OfferZen. Access structured data on skills, company info, locations, workplace policy, and full job descriptions via 2 endpoints.
What is the OfferZen API?
The OfferZen API provides 2 endpoints to search and retrieve developer job listings from OfferZen's South African tech job marketplace. The search_jobs endpoint returns structured arrays of job objects including required skills, workplace policy, years of experience, employment type, and location — with support for keyword filtering and pagination across up to 12 jobs per page. The get_job_details endpoint returns the full job description, company metadata, and structured page sections for a specific listing.
curl -X GET 'https://api.parse.bot/scraper/390fe52d-3d8b-4db8-b1fc-068499f61ab5/search_jobs?page=1&max_pages=1&search_string=Python&workplace_policy=remote' \ -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 offerzen-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.
"""Walkthrough: OfferZen Jobs SDK — search, filter, and drill into job listings."""
from parse_apis.offerzen_jobs_api import OfferZen, WorkplacePolicy, JobNotFound
client = OfferZen()
# Search for remote Python jobs — limit= caps total items fetched.
for job in client.jobs.search(query="Python", workplace_policy=WorkplacePolicy.REMOTE, limit=5):
print(job.name, job.company.name, job.years_experience)
# Drill into the first result for full details.
summary = client.jobs.search(query="React", limit=1).first()
if summary:
detail = summary.details()
print(detail.title, detail.description)
if detail.locations:
for loc in detail.locations:
print(loc.display_address)
# Fetch a job directly by ID when you already have one.
try:
full_job = client.jobs.get(id="6a294e1d101cb88b3ad00219")
print(full_job.title, full_job.workplace_policy, full_job.years_experience)
except JobNotFound as exc:
print(f"Job gone: {exc.job_id}")
print("exercised: jobs.search / summary.details / jobs.get + JobNotFound error handling")
Full-text search over OfferZen job listings with optional workplace policy filter. Returns paginated results (up to 12 jobs per page). Supports multi-page fetching via max_pages. Each job includes structured skills, company info, locations, and experience requirements. Omitting search_string returns all available jobs.
| Param | Type | Description |
|---|---|---|
| page | integer | Starting page number (1-based). |
| max_pages | integer | Maximum number of pages to fetch (up to 12 jobs per page). |
| search_string | string | Search keyword to filter jobs (e.g. 'Python', 'React', 'Data Engineer'). Omitting returns all jobs. |
| workplace_policy | string | Filter by workplace policy. Omitting returns all policies. |
{
"type": "object",
"fields": {
"jobs": "array of job summary objects",
"start_page": "integer - the starting page number",
"total_jobs": "integer - total number of matching jobs",
"total_pages": "integer - total number of pages available",
"pages_fetched": "integer - number of pages actually fetched in this request"
},
"sample": {
"data": {
"jobs": [
{
"id": "6a294e1d101cb88b3ad00219",
"name": "Junior Fullstack Software Engineer",
"company": {
"id": "5b070ac25323ce001358dff6",
"name": "Guud Global",
"logo_url": "https://d3qdc2zh3mwabb.cloudfront.net/media/example",
"tech_stack": [
"PostgreSQL",
"Google Analytics"
],
"brand_color": "#ffffff"
},
"locations": [
{
"city": "Milnerton",
"country": "South Africa",
"display_address": "Century City, Milnerton, South Africa"
}
],
"detail_url": "https://www.offerzen.com/job/6a294e1d101cb88b3ad00219",
"updated_at": "2026-06-10T13:44:30.791+02:00",
"other_roles": [
"Backend engineer"
],
"primary_role": "Full stack engineer",
"published_at": "2026-06-10T13:44:30.790+02:00",
"currency_code": "zar",
"employment_type": "permanent",
"must_have_skills": [
{
"skill": "Python",
"years_experience": null
}
],
"workplace_policy": "hybrid",
"years_experience": 1,
"nice_to_have_skills": [],
"remuneration_period": "month",
"visa_sponsorship_available": null,
"requires_work_authorisation": null
}
],
"start_page": 1,
"total_jobs": 34,
"total_pages": 3,
"pages_fetched": 1
},
"status": "success"
}
}About the OfferZen API
Search Jobs
The search_jobs endpoint accepts optional parameters including search_string (e.g. 'Python', 'React', 'Data Engineer'), workplace_policy ('remote', 'hybrid', or 'office'), and pagination controls page and max_pages. Each result object in the jobs array includes id, name, primary_role, workplace_policy, years_experience, employment_type, locations, and must_have_skills. The response also carries total_jobs, total_pages, and pages_fetched so you can paginate efficiently without extra calls.
Job Details
The get_job_details endpoint takes a job_id from search_jobs results and returns the full record for that listing. Fields include title, description (full role text), primary_role, other_roles, and a company object containing id, name, logo_url, brand_color, and tech_stack. The sections object surfaces key structured content blocks from the listing page — for example 'Skills and experience' and 'Location and salary' — as text strings. The locations array provides city, country, and display_address per location, and detail_url links directly to the canonical listing page.
Coverage and Pagination
Search results are paginated at 12 jobs per page. The total_jobs field in search_jobs reflects the count of listings matching your filters at call time. Omitting search_string and workplace_policy returns all active listings. Filtering by workplace_policy narrows results to one of three categories OfferZen exposes: remote, hybrid, or office-based roles.
The OfferZen API is a managed, monitored endpoint for offerzen.com — not a raw scraper you maintain. Every endpoint is automatically health-checked on a schedule, and when offerzen.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 offerzen.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?+
- Aggregate South African developer job listings filtered by skill keyword (e.g. 'Go', 'Kubernetes') for a job aggregator site.
- Monitor OfferZen for new remote or hybrid roles matching a specific
primary_rolecategory. - Extract
must_have_skillsarrays across all listings to analyze demand trends for specific technologies. - Pull
company.tech_stackdata fromget_job_detailsto research the tooling used by hiring companies. - Build a salary and location comparison tool using the 'Location and salary' section returned in
sections. - Feed structured job data into a recruitment CRM by polling
search_jobswithworkplace_policyandsearch_stringfilters.
| 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 OfferZen have an official public developer API?+
What does the `sections` field in `get_job_details` contain?+
sections field is an object (or null if unavailable) whose keys are named content blocks from the job listing page — for example 'Skills and experience' and 'Location and salary'. Each key maps to a text string with the content of that block. Not every listing will populate all sections.Can I filter jobs by salary range or specific city?+
search_jobs endpoint filters by search_string and workplace_policy only; there is no salary-range or city parameter. Location data is returned per result but is not a filterable input. You can fork this API on Parse and revise it to add city or salary filtering if the source supports it.Is there a way to retrieve company profiles or candidate-facing data beyond what job listings expose?+
name, logo_url, brand_color, tech_stack). Standalone company profiles, candidate profiles, or application data are not included. You can fork it on Parse and revise to add a company-profile endpoint.How fresh are the job listings returned by `search_jobs`?+
posted_date field in the response, so recency filtering based on date is not currently available in the search results.