XING APIxing.com ↗
Search XING job listings by keyword, location, and filters. Fetch full job details including salary, company info, and HTML description via 2 endpoints.
What is the XING API?
The XING Jobs API exposes 2 endpoints that cover public job postings on xing.com: search_jobs for paginated keyword and location searches returning up to 1,000 results, and get_job for full posting detail including HTML job description, salary breakdown, company metadata, and location fields. Both endpoints return a slug and job_id that tie search results directly to detail lookups.
curl -X GET 'https://api.parse.bot/scraper/b22c9876-981b-42d3-aeb1-2f44b9329a4d/search_jobs?keywords=python&location=Berlin' \ -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 xing-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: XING Jobs SDK — search, drill down, and point-lookup."""
from parse_apis.xing_com_api import Xing, CareerLevel, JobNotFound
client = Xing()
# Search for Python jobs in Berlin, capped at 5 results.
for summary in client.job_summaries.search(
keywords="python", location="Berlin", career_level=CareerLevel.PROFESSIONAL, limit=5
):
print(summary.title, summary.company.name, summary.cities)
# Drill into the first hit's full detail via the summary→detail navigation.
hit = client.job_summaries.search(keywords="data engineer", limit=1).first()
if hit is not None:
job = hit.details()
print(job.title, job.description_html[:120])
print(job.company.legal_name, job.location.city, job.location.country)
if job.salary is not None:
print(job.salary.currency, job.salary.minimum, job.salary.maximum)
# Point lookup by slug discovered from the search result.
try:
same_job = client.jobs.get(slug=hit.slug)
print(same_job.career_level, same_job.discipline)
except JobNotFound:
print("job no longer available")
print("exercised: job_summaries.search / details / jobs.get")
Searches public job offers on XING. Returns one page of job summaries (title, company, cities, employment type, salary or salary estimate, apply link, dates) plus the total number of matching jobs. Each row carries a slug that get_job accepts unchanged. Paging is caller-controlled through page (1-based, default 1) and limit (page size, default 20; the site accepts at most 20 per page, larger values are clamped). The site exposes at most the first 1000 results of any search, so page * limit above 1000 is rejected. has_more is true while another page exists within that window. total_results is the site's count of matching jobs; when total_is_lower_bound is true the site only reports it as 'at least'. Salary may be a fixed amount, a range, or a site-generated estimate (is_estimate=true, median populated); it is null when the posting has none. At least one of keywords or location must be given. Results are the site's relevance ordering; there is no sort control. An empty jobs array with total_results 0 is a valid result for a query nothing matches.
| Param | Type | Description |
|---|---|---|
| page | integer | 1-based page number. |
| limit | integer | Jobs per page; values above 20 are clamped to 20. |
| keywords | string | Free-text search terms (job title, skills, company). May be omitted when location is given. |
| location | string | City or place name to search around, as typed into the site's location box. May be omitted when keywords is given. |
| radius_km | integer | Search radius in kilometres around location. Omitted = only the named place. Ignored when location is omitted. |
| career_level | string | Restrict to one career level. Omitted = all levels. |
| posted_within | string | Only jobs posted within this recent period. Omitted = any date. |
| remote_option | string | Restrict to one workplace model. Omitted = all. |
| employment_type | string | Restrict to one employment type. Omitted = all types. |
{
"type": "object",
"fields": {
"jobs": "array of job summaries; each has job_id, slug (input for get_job), title, url, company {name, company_id}, cities, employment_type, salary {currency, amount, minimum, maximum, median, is_estimate} or null, key_responsibilities (array of strings, often empty), application_type, apply_url (null when applying happens on XING), activated_at, refreshed_at, active_until (ISO timestamps), paid_listing, top_job, prioritized, redirects_to_third_party",
"page": "integer page returned",
"limit": "integer page size applied",
"has_more": "boolean; another page exists within the site's 1000-result window",
"total_results": "integer count of matching jobs reported by the site",
"total_is_lower_bound": "boolean; true when the site caps its count and total_results is a minimum"
},
"sample": {
"data": {
"jobs": [
{
"url": "https://www.xing.com/jobs/berlin-python-developer-financial-services-all-genders-156675213",
"slug": "berlin-python-developer-financial-services-all-genders-156675213",
"title": "Python Developer Financial Services (all genders)",
"cities": [
"Berlin"
],
"job_id": "156675213.cbf7ea",
"salary": {
"amount": null,
"median": 76000,
"maximum": 86000,
"minimum": 59000,
"currency": "EUR",
"is_estimate": true
},
"company": {
"name": "Exxeta",
"company_id": "31951.5a9d9a"
},
"top_job": false,
"apply_url": "https://career.exxeta.com/Python-Developer-Financial-Services-all-genders-de-j1018.html?utm_source=xing.com",
"prioritized": false,
"activated_at": "2026-09-17T05:36:36Z",
"active_until": "2027-01-22T21:35:50Z",
"paid_listing": false,
"refreshed_at": "2026-09-17T05:36:36Z",
"employment_type": "Full-time",
"application_type": "UrlApplication",
"key_responsibilities": [],
"redirects_to_third_party": false
}
],
"page": 1,
"limit": 20,
"has_more": true,
"total_results": 524,
"total_is_lower_bound": false
},
"status": "success"
}
}About the XING API
Search Jobs
The search_jobs endpoint accepts free-text keywords, a location string, and an optional radius_km to scope results geographically. Additional filters include career_level, remote_option, and posted_within to narrow results by seniority, workplace model, or recency. Each page returns up to 20 job summaries — values above 20 are clamped — with a has_more boolean indicating whether additional pages exist. The total_results field reflects the count reported by the site; total_is_lower_bound is set to true when that count is a capped minimum rather than an exact figure. The site's result window is limited to 1,000 entries regardless of total_results.
Job Detail
get_job takes a slug exactly as returned in search_jobs.jobs[*].slug and returns the complete public posting. Fields beyond the summary include a full HTML job description, a structured location object with street, zip_code, region, and country_code, plus career_level, discipline, industry, and remote_option. The salary object breaks down into currency, amount, minimum, maximum, median, and an is_estimate flag that distinguishes posted salaries from site-computed estimates. The company sub-object surfaces legal_name, profile_url, industry, and Kununu employer rating data where available.
Response Shape Notes
Both endpoints share the job_id and slug identifiers, and both return a company object with at least name and company_id. Fields like salary, kununu_rating, and several location sub-fields are nullable — callers should guard against null before reading nested properties. Employment type and city arrays in search results carry over unchanged into the detail response.
The XING API is a managed, monitored endpoint for xing.com — not a raw scraper you maintain. Every endpoint is automatically health-checked on a schedule, and when xing.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 xing.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 XING job postings into an internal ATS or talent-sourcing dashboard filtered by career level and location radius
- Monitor new postings for a specific company or job title using
posted_withinand keyword filters, then retrieve full descriptions viaget_job - Compare salary ranges across roles and industries using the
salary.minimum,salary.maximum, andis_estimatefields - Build a remote-work job feed by filtering
search_jobswithremote_optionand displaying the HTML description fromget_job - Enrich company profiles with Kununu ratings and industry labels returned in the
companyobject ofget_job - Track geographic hiring trends by aggregating
citiesandlocation.regionfields across search result pages
| Tier | Price | Credits/month | Rate limit |
|---|---|---|---|
| Free | $0/mo | 200 | 5 req/min |
| Hobby | $30/mo | 1,000 | 20 req/min |
| Developer | $100/mo | 5,000 | 100 req/min |
| Team | $300/mo | 20,000 | 300 req/min |
| Company | $1,000/mo | 100,000 | 500 req/min |
Each endpoint has a fixed posted price per successful call — most fall between 1 and 10 credits — shown on this API's page before you run it. Exceeding the rate limit returns a 429 response. Authenticate with the X-API-Key header.
Does XING have an official public developer API?+
What does the `salary` field in `get_job` actually contain, and how do I know if the figure is posted or estimated?+
salary object includes currency, amount, minimum, maximum, and median. The is_estimate boolean distinguishes between a salary explicitly stated in the job posting and one the site has calculated based on comparable roles. Both cases use the same object shape; check is_estimate before treating the figures as employer-confirmed.How far back do search results go, and how many total results can I retrieve?+
posted_within filter limits results to a recent window (omitting it returns any date). Pagination is capped at 1,000 results total across all pages regardless of total_results. When the site caps its own count, total_is_lower_bound is set to true, meaning the real match count may be higher than what total_results shows.Can I retrieve a company's full XING profile or list all jobs posted by a specific employer?+
name, company_id, legal_name, profile_url, industry, Kununu rating). You can fork the API on Parse and revise it to add a company-profile or employer-specific job listing endpoint.