Developer Resources
Accessing the API
Our Job Postings API enables you to search for job postings by different parameters such as date, location, skills, industry, etc.
To get an API Key you need to create an account and subscribe to our Daily International Job Postings API on RapidAPI
1. Searching for Job Postings
The API returns the paginated search result with 10 full jobs for each search query. The returned JSON is described in our API docs and mainly consist of an JSON-LD payload for each Job Posting (see JobPosting Schema) that can be integrated as-is into a webpage for search engines (e.g., see Google's info on Structured Job Posting Data).
Notes
All the parameters below can be combined - but not always work together. For example, you can use ageo bounding box
with acountryCode
to cut out a part of a country but you can't use ageo bounding box
and ageo distance search
together. We advise to start with a broad search query, check the 'totalCount' in the search result, and then constrain the query until you're satisfied.
The parameters or field values do not always exists for all jobs. For example, fields likestate
,postCode
, ordepartment
are often empty.
You will need to add authentication header parameters for access via RapidAPI etc.
1.1 Search Query Parameters (/api/v2/jobs/search
)
General Parameters (Required)
dateCreated
: The day the job postings were posted or created, using the format 'YYYY-MM-DD'. Valid values are a date in the ISO-8601 calendar system, such as2023-11-30
,2023-12-01
,2024-01-01
, etc.page
: The page of the paginated search results starting at 1. Valid values are integers up to the total count diveded by 10, such as1
,2
,3
, etc.
Location Parameters
countryCode
: The country the jobs should be located in. Valid values are a 2-letter country code from ISO 3166-1 alpha-2, such asus
,uk
,de
,es
, etc.state
: The state the work place is located in. Valid are fee-text values as stated in the job posting, such astx
,england
,ontario
,bavaria
,bayern
, etc.city
: The city the work place is located in. Valid are fee-text values as stated in the job posting, such asnew york
,london
,berlin
,hong kong
,bangalore
,москва
, etc.postCode
: The postal code the work place is located in. Valid are fee-text values as stated in the job posting, such as1010
,00560
,se1
,08160-335
,b30 2qq
,se26 4
, etc.timezone
: The timezone the jobs are located in, such as 'CET', 'PST', or 'UTC'. Valid values are a timezone abbreviation code from IANA time zone database, such ascet
,pst
,utc
,nzdt
, etc.timezoneOffset
: The numeric offset of the timezone from UTC such as '2', '0', or '-2'. Valid offsets are integer values based on UTC+0 from-12
to12
(not using "+")
Timezone range Parameters
timezoneMin
: The minimum numeric timezone used in the search. Valid offsets are integer values based on UTC+0 from-12
to11
(not using "+") Please note thattimezoneMin
must be lower thantimezoneMax
!timezoneMax
: The maximum numeric timezone used in the search. Valid offsets are integer values based on UTC+0 from-11
to12
(not using "+") Please note thattimezoneMin
must be lower thantimezoneMax
!
Geographic Distance Parameters
geoPointLat
: The geographic latitude (north to south coordinate) the job should be located. Valid values are a latitude based on WGS84 from -90 to +90, such as52.25
,0.3
,-77
, etc.geoPointLng
: The geographic longitude (east to west coordinate) the job should be located. Valid values are a longitude based on WGS84 from -180 to +180, such as-122.449
,-0.555
,123
, etc.geoDistance
: The distance around the geoPoint to search for jobs. Defaults to 10km. Valid values are a decimal number of the radius in kilometer (default) or miles, such as10km
,10mi
,50
, etc.
Geographic Bounding Box Parameters
geoTopLeftLat
: The geographic latitude of the top left point in a bounding box the job should be located. Valid values are a latitude based on WGS84 from -90 to +90, such as52.25
,0.3
,-77
, etc.geoTopLeftLng
: The geographic longitude of the top left point in a bounding box the job should be located. Valid values are a longitude based on WGS84 from -180 to +180, such as-122.449
,-0.555
,123
, etc.geoBottomRightLat
: The geographic latitude of the bottom right point in a bounding box the job should be located. Valid values are a latitude based on WGS84 from -90 to +90, such as52.25
,0.3
,-77
, etc.geoBottomRightLng
: The geographic longitude of the bottom right point in a bounding box the job should be located. Valid values are a longitude based on WGS84 from -180 to +180, such as-122.449
,-0.555
,123
, etc.
Job Details Parameters
title
: Free-text search within the title of the job postings supportingMust
searches (+),Must_Not
searches (-) andkeyword phrases
(in double quotes). Normal "+" or comma "," signs will be converted into spaces. Keywords or Keyphrases without a plus or minus sign are optional but ONE of them should exist.language
: The language used in the description of the job postings. Valid values are defined by ISO 639 alpha-2, such asen
,de
,zh
, ores
.locale
: The locale used in the description of the job postings. Valid values are defined by Java's Locale class and contain the language and country codes, such asen_US
,en_UK
,de_DE
,de_CH
,zh_TW
,es_US
, orpt_BR
.skills
: The skills, keywords, or tags identified in the job posting. Valid values are skills, technologies, or tools, such asjavascript
,microsoft office
,azure
,itil
,sql
,scrum
, ordriving licence b
.company
: The company that posted the job ad. Valid values free text names of hiring or recruiting companies, such asmicrosoft
,sap
,manpower
,adecco
,u.s. navy
,walmart
, ordeutsche bahn
.
Job Categorization Parameters
workPlace
: The place where the employee can / has to work at. Valid values areremote
,hybrid
,onsite
,field
, andoffshore
.workType
: The days of week or hours a day the employee can / has to work. Valid values arefulltime
,parttime
,flextime
,shift
, orfifo
.contractType
: The duration or type of the employment contract. Valid values arepermanent
,temporary
,seasonal
,employeeleasing
,directemployment
,recruitmentreserve
,contract
,freelance
,commission
,apprenticeship
,internship
, orvoluntary
.occupation
: The normalized type of occupation identified in the job posting title. Valid are values such asprogrammer
(synonym for software developer roles),executive
(synonym for performing roles),manager
(i.e., synonym for managerial roles),engineer
,nurse
, etc. Further specialization is possible such asjava programmer
,hr manager
,customer success executive
etc.department
: The department or 'employment unit' identified in the job posting. Valid values aresales
,customer support
,hr
,finance
,marketing
,legal
,it
, andtax
.industry
: The company's industry identified in the job posting. Valid values areadvertising
,agriculture
,automotive
,beauty
,charity
,chemical
,clothing
,construction
,consulting
,education
,electronic
,energy
,engineering
,entertainment
,environmental
,finance
,food
,gastronomy
,governmental
,hardware
,healthcare
,insurance
,it
,legal
,logistics
,media
,pharma
,production
,real estate
,research
,resource
,security
,semiconductor
,services
,social services
,software
,sport
,telecom
,tourism
,trade
, andtransport
.
1.2 Search Query Usage Examples
- Remote jobs in core US Timezones (UTC-8 to UTC-5):
/api/v2/jobs/search?dateCreated=2023-11-01&page=1&workPlace=remote&timezoneMin=-8&timezoneMax=-5
- Jobs in southern Netherlands below latitude 52.25:
/api/v2/jobs/search?dateCreated=2023-11-01&page=1&countryCode=nl&geoTopLeftLat=52.25&geoTopLeftLng=0&geoBottomRightLat=32.25&geoBottomRightLng=10
- Jobs in the Healthcare industry of the United Kingdom:
/api/v2/jobs/search?dateCreated=2023-11-01&page=1&countryCode=uk&industry=healthcare
- Jobs for Java Developers in San Francisco:
/api/v2/jobs/search?dateCreated=2023-11-01&page=1&skills=Java&occupation=java,programmer&geoPointLat=37.757&geoPointLng=-122.449&geoDistance=100mi
- Jobs for JavaScript Developers in New York, USA:
/api/v2/jobs/search?dateCreated=2023-11-01&page=1&skills=JavaScript&countryCode=us&city=New%20York
- Jobs in English language located in Germany:
/api/v2/jobs/search?dateCreated=2023-11-01&page=1&countryCode=de&language=en
1.3 Search Query Results
The search query returns the paginated search result with 10 full jobs. The returned JSON is described below and mainly consist of an JSON-LD payload for each Job Posting (see JobPosting Schema)
2. Getting Distinct Search Query Values
In order to identify usable field values for search query fields from the last 30 days selected users can execute aggregate queries to identify all distinct values for search fields.
Notes
This endpoint is only be available for special subscription plans.
The results are capped at 500 values and are calculated from job postings within the last month (i.e., current date minus 1 month).
The parameters or field values do not always exists for all jobs. For example, fields like 'state', 'postCode', or 'department' are often empty.
2.1 Distinct Query Parameters (Required)
A Distinct Query returns a list of distinct field values for the given query parameter in the /api/v2/jobs/search
endpoint.The returned JSON is described below and mainly consist of a list of keys and the count of jobs with this field value. The only valid query fields for the Distinct Query are:
field
: The meaningful field used in a search query. Valid values arecity
,company
,contractType
,countryCode
,department
,industry
,language
,locale
,occupation
,skills
,state
,timezone
,workPlace
,workType
.
2.2 Distinct Query Usage Examples
- Used workPlace values:
/api/v2/meta/jobs/distinct?field=workPlace
- Used industry values:
/api/v2/meta/jobs/distinct?field=industry
2.3 Distinct Query Results
Currently, we calculate the following statistics for the field itself:
valueCount
: The total number of different values.
and the following information for each distinct value of the field:
key
: The name of the value used for the field.doc_count
: The number of job postings with the value used for the field.
3. Getting Statistics on values of Query fields
In order to analyze the used field values for search query fields from the last 30 days selected users can execute aggregate queries to identify statistics on the values for search fields.
Notes
This endpoint is only be available for special subscription plans.
The results are capped at 100 values and are calculated from job postings within the last month (i.e., current date minus 1 month).
3.1 Statistics Query Parameters (Required)
A Statistics Query returns a list of distinct field values (capped at 100) for the given query parameter in the /api/v2/jobs/search
endpoint with added statistics.The returned JSON is described below and mainly consist of a list of keys and the statistics for the field and distinct field value. The only valid query fields for the Statistics Query are:
field
: The meaningful field used in a search query. Valid values arecity
,company
,contractType
,countryCode
,department
,industry
,language
,locale
,occupation
,skills
,state
,timezone
,workPlace
,workType
.
3.2 Statistics Query Usage Examples
- Used workPlace values:
/api/v2/meta/jobs/statistics?field=workPlace
- Used industry values:
/api/v2/meta/jobs/statistics?field=industry
3.3 Statistics Query Results
Currently, we calculate the following statistics for the field itself:
totalCount
: The total number of job postings within the 30 days time frame.docsWithValue
: The number of job postings with any non-empty or non-null value.coverage
: The percentage of job postings with any non-empty or non-null value.valueCount
: The total number of different values.
and the following statistics for each distinct value of the field:
doc_count
: The number of job postings with that specific value.percentage_relative
: The percentage of jobs with that specific value relative to all jobs with a value (docsWithValue).percentage_absolute
: The percentage of jobs with that specific value relative to all jobs within the time frame (totalCount).
Accessing Data Files
1. Downloading files from AWS Data Exchange
1.1 Selecting Country of interest
We have listed many of our datasets on AWS Data Exchange (ADX). You can find the list of Techmap's data products here. If you are missing a country you are interested in please send an email to our Data Team.
To get a first impression and test the workflow you can access Techmap's Luxembourg dataset for free.
1.2 List all files in the AWS S3 Bucket for a country
To list the files you're subscribed to, you can use the list-objects-v2
command. The BUCKET_ALIAS can be found in the AWS Data Exchange "Entitled Data" section in the dataset section.
aws s3api list-objects-v2
--request-payer requester
--bucket BUCKET_ALIAS
--prefix COUNTRY_PREFIX
1.3 Download a file from the AWS S3 Bucket for a country
To download files you're subscribed to you can use the get-object
command. For example, to download the file "techmap_jobs_lu_2023-07-01.jsonl.gz" from the Luxembourg dataset you can execute:
aws s3api get-object
--request-payer requester
--bucket BUCKET_ALIAS
--key lu/techmap_jobs_lu_2023-07-01.jsonl.gz
techmap_jobs_lu_2023-07-01.jsonl.gz
2. Downloading Data from Techmap's AWS S3 Bucket
If you have a proprietary contract with us, we offer constrained access to the data files in our AWS S3 Buckets. To list and download your ordered files you can use the following commands. Please note that you only have access to the ordered time range and countries.
2.1 List all countries in our AWS S3 Bucket
aws s3 ls
--profile YOUR_CREDENTIALS_FOR_TECHMAP
--summarize s3://BUCKET_NAME
2.2 List all files in US directory
aws s3 ls
--profile YOUR_CREDENTIALS_FOR_TECHMAP
--summarize s3://BUCKET_NAME/us/
2.3 Download one file for the USA from May 4th 2023
aws s3 cp
--profile YOUR_CREDENTIALS_FOR_TECHMAP
s3://BUCKET_NAME/us/techmap_jobs_us_2023-05-04.jsonl.gz .
2.4 Download all files for the USA from April 2023
aws s3 sync
--profile YOUR_CREDENTIALS_FOR_TECHMAP
s3://BUCKET_NAME/us/ .
--exclude "*" --include "techmap_jobs_us_2023-04-*"
Parsing Data Files
In JavaScript / TypeScript you can easily use JSON.parse() to parse all lines in the JSON files within a directory.
const fs = require('fs');
const path = require('path');
const readline = require('readline');
const directoryPath = './techmap/files/...';
fs.readdir(directoryPath, function (err, files) {
if (err) {
console.log('Unable to scan directory: ' + err);
return;
}
// Iterate through each file in the directory
files.forEach(function (file) {
// Check if file is a JSON file
if (path.extname(file) === '.json') {
// Read the file
const readStream = fs.createReadStream(directoryPath + file);
const rl = readline.createInterface({
input: readStream,
crlfDelay: Infinity
});
rl.on('line', function (line) {
try {
// Parse the JSON data in the line
const jsonData = JSON.parse(line);
// TODO: do something with the JSON - e.g., store in your own DB
console.log(jsonData);
} catch (err) {
console.log('Unable to parse JSON data in file ' + file + ' on line: ' + line + ': ' + err);
}
});
}
});
});
With the Java programming language you can use Java's jasonx library to parse all lines in the JSON files within a directory.
import java.io.IOException;
import java.nio.file.*;
import java.util.List;
import java.util.stream.Collectors;
import javax.json.*;
String directoryPath = "./techmap/files/...";
// Parse all JSON files in the directory
List<JsonObject> jsonObjects = Files.list(Path.of(directoryPath))
.filter(path -> path.toString().endsWith(".json"))
.map(path -> {
try (JsonReader reader = Json.createReader(Files.newBufferedReader(path))) {
return reader.readObject();
} catch (IOException e) {
throw new RuntimeException(e);
}
})
.collect(Collectors.toList());
// Do something with the list of JSON objects
for (JsonObject jsonObject : jsonObjects) {
// Process each JSON object
// TODO: do something with the JSON - e.g., store in your own DB
System.out.println(jsonString.toString());
}
For other Programming languages see the libraries section of the JSON Homepage. And remember that we have sample data you can test with.