Reverse-engineered OpenAPI 3.1.0 specification for the EURES (European Employment Services) Job Search API.
This is an unofficial, community-maintained documentation project. It is not affiliated with or endorsed by the European Commission or the EURES network.
| Resource | URL |
|---|---|
| Interactive docs | rorar.github.io/EURES-API-Documentation |
| OpenAPI spec | openapi.yaml |
| Raw download | openapi.yaml (raw) |
https://europa.eu/eures/api
The specification documents 20 endpoints across 3 API services:
| Method | Path | Description |
|---|---|---|
POST |
/jv-searchengine/public/jv-search/search |
Search job vacancies with filters |
GET |
/jv-searchengine/public/jv/id/{id} |
Get full vacancy detail by ID |
GET |
/jv-searchengine/public/statistics/getNumberOfJobs |
Total active vacancy count |
GET |
/jv-searchengine/public/statistics/getCountryStats |
Vacancies by country/region |
GET |
/jv-searchengine/public/statistics/getSectorStats |
Vacancies by NACE sector |
GET |
/jv-searchengine/public/statistics/getOccupationStats |
Vacancies by ESCO occupation |
GET |
/jv-searchengine/public/properties |
Search engine configuration |
GET |
/jv-searchengine/public/translation/enabled |
Translation feature status |
GET |
/jv-searchengine/public/translation/languages |
Supported translation languages |
| Method | Path | Description |
|---|---|---|
GET |
/shared-data-rest-api/public/reference/languages |
Portal-supported languages (26) |
GET |
/shared-data-rest-api/public/reference/isoLanguages |
All ISO 639-1 languages (160+) |
GET |
/shared-data-rest-api/public/reference/countries |
Covered countries (31) |
GET |
/shared-data-rest-api/public/reference/nace |
NACE sector classifications |
GET |
/shared-data-rest-api/public/esco/supportedLanguages |
ESCO-supported language codes |
POST |
/shared-data-rest-api/public/esco/label/{lang} |
Resolve ESCO URIs to labels |
GET |
/shared-data-rest-api/public/esco/occupation/tree |
Full ESCO/ISCO occupation hierarchy |
GET |
/shared-data-rest-api/public/properties/public |
Portal configuration |
GET |
/shared-data-rest-api/public/menu/{section} |
Navigation menu entries |
| Method | Path | Description |
|---|---|---|
GET |
/autocomplete-repository-rest-api/public/v2.0/occupations |
Occupation name autocomplete |
| Method | Path | Description |
|---|---|---|
GET |
/public/security/profile |
Current user profile (null when anonymous) |
curl -X POST https://europa.eu/eures/api/jv-searchengine/public/jv-search/search \
-H 'Content-Type: application/json' \
-d '{
"resultsPerPage": 5,
"page": 1,
"sortSearch": "MOST_RECENT",
"keywords": [{"keyword": "software engineer", "specificSearchCode": "EVERYWHERE"}],
"publicationPeriod": null,
"occupationUris": [],
"skillUris": [],
"requiredExperienceCodes": [],
"positionScheduleCodes": [],
"sectorCodes": [],
"educationAndQualificationLevelCodes": [],
"positionOfferingCodes": [],
"locationCodes": ["de"],
"euresFlagCodes": [],
"otherBenefitsCodes": [],
"requiredLanguages": [],
"minNumberPost": null,
"sessionId": "my-session-1",
"requestLanguage": "en"
}'The specificSearchCode controls which fields a keyword matches against:
| Code | Searches in |
|---|---|
EVERYWHERE |
All fields |
TITLE |
Job title only |
DESCRIPTION |
Job description only |
EMPLOYER |
Employer name only |
LEGAL_ID |
Employer legal identifier |
JOB_VACANCY_ID |
Vacancy ID |
# Search for "Developer" in title AND "SAP" in employer name
curl -X POST https://europa.eu/eures/api/jv-searchengine/public/jv-search/search \
-H 'Content-Type: application/json' \
-d '{
"resultsPerPage": 10,
"page": 1,
"sortSearch": "BEST_MATCH",
"keywords": [
{"keyword": "Developer", "specificSearchCode": "TITLE"},
{"keyword": "SAP", "specificSearchCode": "EMPLOYER"}
],
"occupationUris": [], "skillUris": [], "requiredExperienceCodes": [],
"positionScheduleCodes": [], "sectorCodes": [],
"educationAndQualificationLevelCodes": [], "positionOfferingCodes": [],
"locationCodes": [], "euresFlagCodes": [], "otherBenefitsCodes": [],
"requiredLanguages": [], "minNumberPost": null,
"publicationPeriod": null, "sessionId": "my-session-2",
"requestLanguage": "de"
}'# Use the base64-encoded ID from search results
curl https://europa.eu/eures/api/jv-searchengine/public/jv/id/MTAwMDEtMTAwMTEzOTMxMS1TIDE?requestLang=encurl 'https://europa.eu/eures/api/autocomplete-repository-rest-api/public/v2.0/occupations?language=en&keyword=Software&nbResults=10'# Total job count
curl https://europa.eu/eures/api/jv-searchengine/public/statistics/getNumberOfJobs
# Jobs by country (with NUTS sub-regions)
curl https://europa.eu/eures/api/jv-searchengine/public/statistics/getCountryStatsThe API uses several EU classification standards:
| System | Used for | Example |
|---|---|---|
| ESCO | Occupations & skills | http://data.europa.eu/esco/occupation/... |
| ISCO | Occupation groups | http://data.europa.eu/esco/isco/C2511 |
| NACE | Economic sectors | a through u (lowercase) |
| NUTS | Geographic regions | de (country), de1 (region), DE12B (district) |
| CEFR | Language proficiency | en(B2), de(C1) |
| EQF | Education levels | basic, bachelor, doctoral |
bash scripts/generate-docs.sh -o _site
# Open _site/index.html in a browserThe documentation site is built and deployed automatically via GitHub Actions when openapi.yaml or scripts/generate-docs.sh change on main. To enable:
- Go to Settings > Pages
- Set source to GitHub Actions
Generate API clients from the OpenAPI spec using tools like openapi-generator:
# TypeScript client
npx @openapitools/openapi-generator-cli generate \
-i openapi.yaml -g typescript-fetch -o ./client
# Python client
openapi-generator generate -i openapi.yaml -g python -o ./clientThe openapi.yaml file can be imported directly into:
- Postman — Import > File >
openapi.yaml - Insomnia — Import/Export > From File
- Swagger Editor — File > Import file
- Bruno — Import Collection > OpenAPI
This documentation is provided "as-is" based on observed behavior of the public EURES portal API. It is not an official API and has no guaranteed stability, rate limits, or support.
Usage is subject to the EURES portal terms of use. It is your responsibility to ensure compliance with applicable laws and regulations.
Neither the maintainers of this project nor the EURES portal accept liability for damages or losses arising from use of this API or its documentation.