Xing Profile API
Xing is the professional network of German-speaking Europe, and it holds people who never joined any other one. That is the whole point of this source: a Munich Softwareentwicklerin or a Vienna Prokurist can have a full Xing profile and no presence anywhere else, so for DACH recruiting and market research this is a distinct source rather than a substitute. Send profile URLs or bare handles, get back name, job title, city, country, employment history, education, skills in German and English, and languages, one row per person. It enriches profiles you already have. It does not search for people.
Input parameters
| PARAMETER | TYPE | REQ | DEFAULT | DESCRIPTION |
|---|---|---|---|---|
| profileUrls | string[] | yes | — | Xing member profile URLs, for example https://www.xing.com/profile/Jane_Doe. A bare handle such as Jane_Doe works as shorthand. Up to 1000 per run, de-duplicated before anything is fetched, and billed once per profile actually returned. Anything that is not a xing.com/profile URL or a bare handle is rejected before the run starts and logged as a warning rather than sent upstream. This is the only parameter, and it is the only thing that moves your bill. — drives your bill |
Output schema
| FIELD | TYPE | DESCRIPTION | NULLABLE |
|---|---|---|---|
| result_type | string | profile or error. On every row, so filter on it rather than counting rows. | no |
| profileId | string | Stable identifier for the member on the source network. Use it as your join key: the handle in the profile URL can change, this does not. | yes |
| fullName | string | Full name as published, falling back to prefix plus given plus family name. | yes |
| givenName | string | First name. | yes |
| familyName | string | Surname. | yes |
| honorificPrefix | string | Academic or honorific prefix such as Dr. or Prof., common on German profiles. Present only when the member published one, and absent on both profiles in the last verification run. | yes |
| profileUrl | string | The profile page this record was collected from. | yes |
| jobTitle | string | Current job title, in whatever language the member wrote it. German titles come back in German and are not translated. | yes |
| city | string | City the member lists. Mostly DACH cities, but members list locations worldwide and the field returns whatever the profile holds. | yes |
| countryCode | string | Two-letter country code the member lists, for example DE, AT or CH. | yes |
| membership | string | Membership level on the network, for example BASIC or PREMIUM. | yes |
| imageUrl | string | Profile photo URL, served from the source network's image host. | yes |
| skills | string[] | Listed professional skills, verbatim. A single profile routinely mixes German and English, and nothing is translated or normalised. | yes |
| languages | string[] | Languages the member lists, flattened to readable names rather than the source's level objects. | yes |
| interests | string[] | Personal and professional interests. Frequently absent: neither profile in the last verification run carried this field. | yes |
| groups | string[] | Professional groups the member belongs to. Also frequently absent, for the same reason. | yes |
| experience | object[] | Employment history. Every entry carries company. Title, startDate, endDate and description appear only when the member published them, and in the last verification run none of the eleven roles across two profiles carried a date. Do not build a tenure calculation that assumes startDate exists. | yes |
| education | object[] | Education history with institution, qualification, startDate and endDate. In practice this is often just qualification. | yes |
| similarProfiles | string[] | Profile URLs the source considers comparable, around twenty per profile. The member's own URL is included, usually twice. | yes |
| summary | string | One-line plain-language description of the row, built from name, title, city, role count and skill count so an agent can read a record without a parsing layer. | yes |
| fetched_at | string | ISO 8601 UTC timestamp for when the row was collected. On every row. | no |
| sourceUrl | string | Error rows only. The input URL the error relates to. | yes |
| error_message | string | Error rows only. Plain-language reason, for example that the profile no longer exists or that the page could not be parsed. | yes |
| error_type | string | Error rows only. Machine-readable category such as CollectionError or MissingRequiredParameter. | yes |
Worked examples
{
"profileUrls": [
"https://www.xing.com/profile/Babureddy_C"
]
}
{
"profileUrls": [
"Babureddy_C",
"Chuck_Coulson"
]
}
{
"profileUrls": [
"https://www.xing.com/profile/Jane_Doe",
"Max_Mustermann",
"https://www.xing.com/profile/Jane_Doe"
]
}
{
"profileUrls": [
"Jane_Doe",
"Max_Mustermann",
"Anna_Schmidt",
"Thomas_Bauer"
]
}
{
"profileUrls": [
"https://www.xing.com/profile/Jane_Doe",
"https://www.xing.com/profile/Max_Mustermann",
"https://www.xing.com/profile/Anna_Schmidt"
]
}
Coverage
Tasks
Saved runs with the inputs already filled in — each one a standalone page and a working configuration example.
Written about this source
Walkthroughs, worked examples and posts about this source.
Code
curl
curl -X POST "https://api.apify.com/v2/acts/johnvc~xing-profile-api/run-sync-get-dataset-items" \
-H "Authorization: Bearer $APIFY_TOKEN" \
-H "Content-Type: application/json" \
-d '{"profileUrls": ["https://www.xing.com/profile/Babureddy_C", "Chuck_Coulson"]}'
Python
from apify_client import ApifyClient
client = ApifyClient("APIFY_TOKEN")
run = client.actor("johnvc/xing-profile-api").call(
run_input={"profileUrls": ["Babureddy_C", "Chuck_Coulson"]}
)
for item in client.dataset(run.default_dataset_id).iterate_items():
if item.get("result_type") != "profile":
print("skipped:", item.get("sourceUrl"), item.get("error_message"))
continue
roles = [e.get("company") for e in item.get("experience", [])]
print(item["profileId"], item.get("fullName"), "|", item.get("jobTitle"))
print(" ", item.get("city"), item.get("countryCode"), "|", ", ".join(roles))
MCP
claude mcp add --transport http xing \ "https://mcp.apify.com/?tools=actors,docs,johnvc/xing-profile-api"
Changelog
What people use it for
- DACH candidate sourcing and enrichment
- German-speaking talent market mapping
- Tracking job changes across a watchlist
- Verifying a candidate's stated role history
- Mapping a competitor's team in German-speaking Europe
- Enriching a recruiting CRM with current role and city
- Feeding an AI agent structured people data over MCP