
Job Posting API Documentation
1. API Overview
Techmap collects job postings from 200+ sources - ATS career pages, job boards, aggregators, and employment offices - and makes them available through two APIs and daily bulk feeds. The Daily International Job Postings API covers the last 3 months and returns JSON by default but can be set to return CSV, RSS, ATOM, XML, or Parquet output instead. The Job Postings RSS API serves job boards that consume RSS feeds directly. For bulk access, Job Data Feeds provide gzip-compressed JSON-Lines files per country per day.
Both APIs are hosted on RapidAPI and share the same query parameter structure. The full OpenAPI definitions are at api.techmap.io/jobs-api (JSON API) and api.techmap.io/rss-api (RSS API).
Common developer use cases
- Job board backfilling: Query
/searchwithcountryCode,industry, or jobtitlefilters andisDuplicate=falseto backfill new job postings into your job board database. - Hiring trend analysis: Use
/countwith adateCreatedmonth range to build month-over-month hiring volume time series per country or industry. For time series longer than 3 months, use the historical datasets (available from Jan. 2020). - Company monitoring: Filter by
company=AcmeandisDirect=trueto track open roles at specific companies. - Skill demand mapping: Query
/countwithskillsandcountryCodeto measure demand for specific technologies per market. - Geo-targeted feeds: Use
geoPointLat,geoPointLng, andgeoDistanceto retrieve postings within a radius of a specific location.
1.1 Which Product is Right for You?
Four access options are available depending on your use case:
| Job Postings API | RSS API | Data Feeds | Historical Datasets | |
|---|---|---|---|---|
| Access | RapidAPI | RapidAPI | AWS Data Exchange | AWS Data Exchange |
| Lookback | Last 3 months | Last 3 months | Last 3 months | Jan. 2020 to today |
| Output format | JSON (default), CSV, RSS, ATOM, XML, Parquet | RSS 2.0 (default) | JSON in gzip JSON Lines files | JSON in gzip JSON Lines files |
| Billing | Per request (10 jobs each) | Per request (10-1000 jobs each) | Per country subscription | Per country purchase |
| Best for | Real-time queries, filtering, analytics, job board feeds | Hosted job boards that consume RSS (jBoard, NiceBoard, ...) | Bulk ETL, recurring ingestion pipelines | Historical analysis, ML training data, one-off research |
| Field reference | This page | This page (RSS section) | Job Data Overview | Job Data Overview |
1.2 How to Subscribe
Both APIs are hosted on RapidAPI. Sign up for a free account, subscribe to the Basic plan, and copy your API key. The Job Postings API accepts the key in the X-RapidAPI-Key: <your-api-key> header (optionally with X-RapidAPI-Host) or as the URL parameter rapidapi-key=<your-api-key>. The RSS API is called with the URL parameter rapidapi-key only, so the feed URL works in any feed reader or job board importer without custom headers. Step-by-step guide with curl, Python, and JavaScript: API Quickstart.
- Create a RapidAPI account: rapidapi.com/auth/sign-up
- Subscribe to the Basic plan: The Basic plan of the Job Postings API is free and includes 100 requests (1000 job postings) per month. The Basic plan of the RSS API is free and includes 100 requests (1000 job postings, 10 per response, no pagination) per month. Requests above the included quota are not blocked but billed as overage - see Errors & billing.
- Copy your API key: Found in your RapidAPI dashboard after subscribing.
- Make your first request: Use the RapidAPI playground which generates ready-to-use code snippets in Python, JavaScript, Java, C#, and more (see Job Postings API Playground or RSS API Playground) - or send a direct HTTP request.
2. Endpoints
Full OpenAPI definitions: Daily International Job Postings and Job Postings RSS.
Daily International Job Postings API Endpoints
(base URL: https://daily-international-job-postings.p.rapidapi.com):
GET /api/v2/jobs/search- Returns up to 10 job postings per page matching the query. Available on all plans.GET /api/v2/jobs/count- Returns the total count matching the query without returning job data. Useful for analytics and pagination planning. Available on all plans.GET /api/v2/meta/jobs/distinct- Returns distinct values and counts for a selected field (e.g.,industry,workPlace,careerLevel) over the last 30 days. Available on PRO, ULTRA, and MEGA plans.GET /api/v2/meta/jobs/statistics- Returns the count and percentage of job postings per value of a field (top 100 values) for the last 30 days. Available on PRO, ULTRA, and MEGA plans.
Job Postings RSS API Endpoints
(base URL: https://job-postings-rss-feed.p.rapidapi.com):
GET /api/rss/v1/jobs_full- Returns job postings in RSS 2.0 (XML) format, including full description and metadata. Postings per response depend on the plan: 10 (Basic, Pro), 100 (Ultra), 1000 (Mega); pagination from Pro on. Example feed URL with the key as URL parameter:https://job-postings-rss-feed.p.rapidapi.com/api/rss/v1/jobs_full?countryCode=us&title=developer&rapidapi-key=<your-api-key>
2.1 Query Parameters
dateCreated is not specified, the API defaults to today minus 2 days. Always set this parameter explicitly in production code to avoid unexpected results.All parameters are optional. Text parameters support boolean operators (see below). Parameters marked search only are not available on /count.
| Parameter | Type | Description | Example |
|---|---|---|---|
format | String | Output format. Default: json. Options: json, csv, rss, atom, xml, parquet. | format=csv |
dateCreated | String | Date the posting was created. YYYY-MM for a full month, YYYY-MM-DD for a specific day. Defaults to today-2 if omitted. | dateCreated=2026-09 |
dateCreatedMin | String | Start of a date range (YYYY-MM-DD). Use with dateCreatedMax. Cannot be combined with dateCreated. | dateCreatedMin=2026-09-01 |
dateCreatedMax | String | End of a date range (YYYY-MM-DD). Use with dateCreatedMin. | dateCreatedMax=2026-09-30 |
page | Integer | Page number for page-based pagination, starting at 1. Max ~1000 pages (10000 results). Use cursor pagination beyond that. (search only) | page=2 |
cursor | String | Cursor for cursor-based pagination. Pass true to start; use the nextCursor value from the response for subsequent pages. Cannot be combined with page. (search only) | cursor=true |
countryCode | String | ISO 3166-1 alpha-2 country code of the job location. | countryCode=de |
title | String | Free-text search within the job title. Supports boolean operators. | title="data engineer" |
skills | String | Skills, keywords, or tags. Comma-separated for OR logic. | skills=Javascript,Typescript |
company | String | Company name. Supports boolean operators. | company=Microsoft |
occupation | String | Occupation stem extracted from the job title (e.g., "programmer", "analyst"). | occupation=programmer |
industry | String | Industry classification. Supports boolean operators. | industry=healthcare |
department | String | Department name (sparsely populated). | department=IT |
language | String | ISO 639-1 language code of the job posting text. | language=de |
workPlace | String | Work arrangement. Values: remote, hybrid, onsite. Only populated when stated in the original posting. | workPlace=remote |
workType | String | Work duration. E.g., fulltime, parttime. | workType=fulltime |
contractType | String | Contract type. E.g., permanent, temporary, freelance. | contractType=permanent |
careerLevel | String | Career level. E.g., junior, senior, chief. | careerLevel=Senior |
hasSalary | Boolean | Filter to postings that include salary data. | hasSalary=true |
minSalary | Number | Minimum salary filter, independent of currency. | minSalary=50000 |
isDuplicate | Boolean | When false, excludes postings flagged as duplicates (same company, city, country, and title within 3 days). | isDuplicate=false |
isActive | Boolean | When true, only returns postings where dateActive is in the future. dateActive is derived from the schema.org validThrough field, or defaults to dateCreated + 30 days. | isActive=true |
isDirect | Boolean | When true, only returns postings linked directly to the hiring company (not via a job board). | isDirect=true |
isRecruiter | Boolean | Filter by whether the posting is from a recruiting firm. | isRecruiter=false |
portal | String | Source portal key (e.g., linkedin, monster, dice). See the portal explorer for all values. | portal=linkedin |
source | String | Specific source with country code suffix (e.g., linkedin_us, monster_uk). | source=linkedin_us |
city | String | City of the job location. Use quotes for multi-word cities. | city="New York" |
state | String | State of the job location. | state=TX |
postCode | String | Postal or ZIP code of the job location. | postCode=10001 |
timezone | String | 3-letter timezone code (e.g., CET, PST, UTC). | timezone=CET |
timezoneOffset | Integer | UTC offset as an integer (-12 to +12). | timezoneOffset=1 |
timezoneMin | Integer | Minimum UTC offset. Use with timezoneMax to define a range. | timezoneMin=-8 |
timezoneMax | Integer | Maximum UTC offset. Must be larger than timezoneMin. | timezoneMax=-5 |
geoPointLat | Number | Latitude for a geo distance search. Use with geoPointLng and geoDistance. | geoPointLat=37.757 |
geoPointLng | Number | Longitude for a geo distance search. | geoPointLng=-122.449 |
geoDistance | String | Distance from the geo point. Units: mi or km. | geoDistance=50mi |
geoTopLeftLat | Number | Top-left latitude of a bounding box search. | geoTopLeftLat=52.5 |
geoTopLeftLng | Number | Top-left longitude of a bounding box search. | geoTopLeftLng=13.0 |
geoBottomRightLat | Number | Bottom-right latitude of a bounding box search. | geoBottomRightLat=48.0 |
geoBottomRightLng | Number | Bottom-right longitude of a bounding box search. | geoBottomRightLng=15.0 |
2.2 Boolean Operators
Most text parameters support boolean operators for precise filtering:
- OR (default): Comma-separated values match any.
title=java,pythonreturns jobs with "java" or "python" in the title. - AND (must include): Prefix with
%2B(an URL-encoded+).skills=%2Bjava,%2Bpythonrequires both. - NOT (must exclude): Prefix with
-.title=data,%2Bengineer,-scientistmatches "data engineer" but not "data scientist". - Exact phrase: Wrap in double quotes (
").title="data engineer"matches the exact phrase.
Example cURL queries:
- Remote jobs in core US timezones (UTC-8 to UTC-5):
curl -X GET "https://daily-international-job-postings.p.rapidapi.com/api/v2/jobs/count?workPlace=remote&timezoneMin=-8&timezoneMax=-5" -H "X-RapidAPI-Key: <your-api-key>" - Python or Spark jobs in Germany:
curl -X GET "https://daily-international-job-postings.p.rapidapi.com/api/v2/jobs/count?countryCode=de&skills=Python,Spark" -H "X-RapidAPI-Key: <your-api-key>" - Jobs within 50 miles of San Francisco:
curl -X GET "https://daily-international-job-postings.p.rapidapi.com/api/v2/jobs/count?geoPointLat=37.757&geoPointLng=-122.449&geoDistance=50mi" -H "X-RapidAPI-Key: <your-api-key>"
2.3 Pagination
The /search endpoint returns 10 job postings per page. Use totalCount from the response to determine how many pages exist. Rate limits per plan and the quota headers: Pagination, rate limits & quota.
Page-based pagination
Use the page parameter (starting at 1) for result sets up to approximately 10000 records. If you expect more pages, use cursor-based pagination.
Cursor-based pagination
For large result sets (e.g. all jobs in the US for a given month), pass cursor=true on the first request. The response includes a nextCursor field when more results exist. Pass that value as cursor in the next request. Stop when nextCursor is absent from the response. Cursor-based pagination cannot be combined with the page parameter. However, think about using the data feeds if you want to access many job postings on a regular schedule - it might be the easier and cheaper option.
2.4 Code Examples
The RapidAPI playground generates ready-to-use code snippets in Python, JavaScript, Java, C#, PHP, and more. Open the API playground page on RapidAPI (see Job Postings API Playground or RSS API Playground), configure your query parameters, and copy the generated snippet.
Page-based pagination (Python)
Fetch all jobs from Germany for a given month. Use for result sets up to ~10000 records.
import requests
API_URL = "https://daily-international-job-postings.p.rapidapi.com/api/v2/jobs"
HEADERS = {"X-RapidAPI-Key": "<your-api-key>", "X-RapidAPI-Host": "daily-international-job-postings.p.rapidapi.com"}
params = {
"countryCode": "de",
"dateCreated": "2026-09",
"isDuplicate": "false",
}
page, all_jobs = 1, []
while True:
resp = requests.get(f"{API_URL}/search", headers=HEADERS, params={**params, "page": page})
resp.raise_for_status()
data = resp.json()
batch = data.get("result", [])
all_jobs.extend(batch)
if len(all_jobs) >= data["totalCount"] or not batch:
break
page += 1
print(f"Fetched {len(all_jobs)} jobs")
Cursor-based pagination (Python)
Fetch all jobs from the US for a given month. Use for large result sets (>10000 records).
import requests
API_URL = "https://daily-international-job-postings.p.rapidapi.com/api/v2/jobs"
HEADERS = {"X-RapidAPI-Key": "<your-api-key>", "X-RapidAPI-Host": "daily-international-job-postings.p.rapidapi.com"}
params = {
"countryCode": "us",
"dateCreated": "2026-09",
"isDuplicate": "false",
}
cursor, all_jobs = "true", []
while cursor:
resp = requests.get(f"{API_URL}/search", headers=HEADERS, params={**params, "cursor": cursor})
resp.raise_for_status()
data = resp.json()
all_jobs.extend(data.get("result", []))
cursor = data.get("nextCursor") # None when no more results remain
print(f"Fetched {len(all_jobs)} jobs")
Count query for analytics (Python)
Get monthly job posting counts per country without fetching job data.
import requests
API_URL = "https://daily-international-job-postings.p.rapidapi.com/api/v2/jobs"
HEADERS = {"X-RapidAPI-Key": "<your-api-key>", "X-RapidAPI-Host": "daily-international-job-postings.p.rapidapi.com"}
months = ["2026-07", "2026-08", "2026-09"]
countries = ["de", "fr", "gb"]
for country in countries:
for month in months:
resp = requests.get(f"{API_URL}/count", headers=HEADERS, params={
"countryCode": country,
"dateCreated": month,
"isDuplicate": "false",
})
data = resp.json()
print(f"{country} {month}: {data.get('totalCount', 0)} jobs")
Search request (JavaScript)
Node.js 18+ or browser, using fetch.
const url = new URL("https://daily-international-job-postings.p.rapidapi.com/api/v2/jobs/search");
url.search = new URLSearchParams({ countryCode: "de", dateCreated: "2026-09", isDuplicate: "false" });
const response = await fetch(url, {
headers: {
"X-RapidAPI-Key": "<your-api-key>",
"X-RapidAPI-Host": "daily-international-job-postings.p.rapidapi.com",
},
});
if (!response.ok) throw new Error(`${response.status}: ${await response.text()}`);
const data = await response.json();
console.log(data.totalCount, data.result.length);
RSS feed (Python)
The RSS API takes the key as URL parameter, so the same URL also works in job board importers.
import feedparser # pip install feedparser
url = ("https://job-postings-rss-feed.p.rapidapi.com/api/rss/v1/jobs_full"
"?countryCode=us&title=developer&rapidapi-key=<your-api-key>")
feed = feedparser.parse(url)
for item in feed.entries:
print(item.title, item.link)
2.5 Error Handling
| Status | Source | Meaning | Action |
|---|---|---|---|
200 | API | Success | Process the response |
400 | API | Bad request - invalid parameter value (e.g., unparseable date format) | Check the message field in the response body - it names the invalid parameter - and fix the value |
401 | RapidAPI | Missing or invalid API key | Send the key in the X-RapidAPI-Key header or as rapidapi-key URL parameter and call the RapidAPI host, not the backend directly |
403 | API / RapidAPI | Subscription plan does not have access to this endpoint (e.g., /meta/jobs/distinct and /meta/jobs/statistics require Pro or higher), or not subscribed to the API | The response contains message, requiredPlan and pricingUrl; subscribe or upgrade to the named plan |
429 | RapidAPI | Too many requests per second (rate limit of the plan). There is no monthly hard limit - requests above the quota are billed as overage. | Slow down and retry with exponential backoff |
500 | API | Internal server error | Retry with exponential backoff. Check the message field for details. |
503 | API | Search backend temporarily unavailable | Retry later with exponential backoff |
Example 400 response body:
{ "message": "Problem getting documents for day '2026-13-01': Not a valid day or in wrong format 'YYYY-MM-DD'!" }Example 403 response body:
{ "message": "Forbidden request to the API - this endpoint is not included in your plan. It is included from the Pro plan on.", "requiredPlan": "Pro", "pricingUrl": "https://rapidapi.com/techmap-io-techmap-io-default/api/daily-international-job-postings/pricing" }All status codes with cause and solution, plus how overage works: Errors & billing.
3. Data Dictionary
All fields with type, example and how often they are filled: Field reference.
The full text of each job posting is in job.jsonLD.description as Markdown. The job.jsonLD object is a simple schema.org JobPosting representation and can be embedded directly in a webpage for structured data markup.
Response envelope fields
Top-level fields returned by /search:
| Field | Type | Description | Example |
|---|---|---|---|
| api | String | The name of the API | Techmap.io Job Posting API |
| apiVersion | String | Version of the endpoint | v2.1 |
| apiEndpoint | String | Name of the endpoint | GET search result for Job Postings ... |
| page | Integer | Page number returned from pagination | 1 |
| pageSize | Integer | Max. number of job postings per result | 10 |
| totalCount | Integer | Total amount of job postings in the pagination. | 1069346 |
| query | Object | The query understood and used to query the Database. | ... see Example below ... |
| result | Array(Object) | The array with the job postings as objects. (named 'job' below) | ... see job fields below ... |
| nextCursor | String | Present when cursor-based pagination is active and more results exist. Pass this value as the cursor parameter in the next request. Absent on the last page. | eyJwYWdlIjozfQ== |
Job posting fields (result[])
Each element in the result array contains these fields. Not all fields are populated for every posting - sparsely populated fields include state, postCode, department, workPlace, careerLevel, and salary fields.
| Field | Type | Description | Example |
|---|---|---|---|
| job.title | String | Title or name of the job posting | SAP TM (Transportation Module) Functional Analyst |
| job.company | String | Name of the company originally stated on the job posting or in its JSON. | Avance Consulting |
| job.department | String | Name of the department in the company such as sales, finance, it, ... (very rare) | IT |
| job.dateCreated | Date | The date and time the job posting was created by the company (as stated on the page or its JSON). | 2024-09-15T14:43:24.000Z |
| job.dateExpired | String (Date) | The given date the posting is valid. | 2024-10-14T14:48:29.000Z |
| job.countryCode | String (ISO3166) | The country code (from ISO3166) the job posting is located, e.g., 'us'. | us |
| job.state | String | State the job is located in (rare). | TX |
| job.city | String | City the job is located in. | Cleveland |
| job.postCode | String | Postal or Zip code of the job is located in (rare). | 77327 |
| job.geoPoint | Object | The geocoordinate object with latitude and longitude. | {"lon": -95.02362, "lat": 30.33804} |
| job.timezone | String (Timezone) | Timezone code (3-letters) | CST |
| job.timezoneOffset | Integer | Timezone offset between -12 and +12 from GMT/UTC | -6 |
| job.hasSalary | Boolean | Indicates if the job posting has salary information. | True |
| job.minSalary | Number | The minimum salary of the position. | 50000.00 |
| job.workPlace | Array (String) | List of workplaces such as Remote, Hybrid, Onsite, Field, ... | ["Onsite"] |
| job.careerLevel | Array (String) | List of career levels such as Junior, Senior, ... | ["Senior"] |
| job.contractType | Array (String) | List of contract types such as Permanent, Temporary, ... | ["DirectEmployment"] |
| job.workType | Array (String) | List of work types such as Fulltime, Parttime, ... | ["Permanent"] |
| job.language | String(ISOISO 639-1) | Language the job posting is written in such as en, es, de, ... | en |
| job.locale | String | The Locale of the job posting such as en_US, en_UK, de_CH, ... | en_US |
| job.occupation | String | The job name reduced to a stem form (e.g., 'java programmer') | Functional Analyst |
| job.skills | Array(String) | The skills stated or identified with the job posting | ["Logistics","Autoconf","ABAP"] |
| job.industry | String | The industry stated or identified with the job posting | Transport |
| job.isRecruiter | Boolean | Indicates if the job posting is from a Recruiting firm. | False |
| job.isDirect | Boolean | Indicates if the job posting is directly from a company page or a job board. | True |
| job.isDuplicate | Boolean | True if a posting with the same company, city, country, and job title was already seen within 3 days. Duplicates are kept but flagged. Use isDuplicate=false as a query filter to exclude them. | false |
| job.isDuplicateOf | String | The ID of the earliest identical posting this one duplicates. Null when isDuplicate is false. | 66f4d794a315a1138e6bfac2 |
| job.isActive | Boolean (query filter only) | Not a stored field. When isActive=true is passed as a query parameter, the API filters to postings where dateActive is in the future. The dateActive field (see below) determines this. | true |
| job.dateActive | String (Date) | The assumed expiry date of the posting, derived from schema.org validThrough or defaulting to dateCreated + 30 days. | 2024-10-14T14:48:29.000Z |
| job.portal | String | The origin of the job posting such as monster, linkedin, ... | dice |
| job.source | String | The origin of the job posting with a countrycode such as 'monster_uk'. | dice_us |
| job.jsonLD | Object | The JSON-LD based on schema.org format from the original job posting's page enriched with job posting data. Can be directly used on a webpage. | ... see job.jsonLD below ... |
| job.jsonLD.identifier | String | ID of the job posting in Techmap's central database. | 67a0d794a315a1138e6bfaba |
| job.jsonLD.validThrough | String (Date) | The given date the posting is valid. | 2024-10-14T14:48:29.000Z |
| job.jsonLD.employmentType | String | The main employment type such as Permanent, Temporary, ... | Direct Employment |
| job.jsonLD.salaryCurrency | String | The currency the salary is defined in. | USD |
| job.jsonLD.description | String | The text of the job posting extracted from the webpage in markdown. | ... ful text in markdown ... |
| job.jsonLD.industry | String | The industry stated or identified with the job posting | Transport |
| job.jsonLD.title | String | Title or name of the job posting | SAP TM (Transportation Module) Functional Analyst |
| job.jsonLD.datePosted | Date | The date and time the job posting was created by the company (as stated on the page or its JSON). | 2024-09-15T14:43:24.000Z |
| job.jsonLD.url | String (URL) | The link where we found the job posting. | https://www.dice.com/job-detail/003170f7-bd59-45d5-a0cf-e4ef93c27419 |
| job.jsonLD .relevantOccupation | String | Title or name of the job posting | Functional Analyst |
| job.jsonLD .applicantLocationRequirements | String | Requirements on the location of the applicant. | Onsite, CST Timezone |
| job.jsonLD.employmentUnit | String | Name of the employment unit or department in the company such as sales, finance, it, ... (very rare) | IT |
| job.jsonLD.skills | Array(String) | The skills stated or identified with the job posting | ["Logistics","Autoconf","ABAP"] |
| job.jsonLD.hiringOrganization | Object | The information on the hiring company. | ... see job.jsonLD.hiringOrganization below ... |
| job.jsonLD.hiringOrganization .name | String | Name of the company originally stated on the job posting or in its JSON. | Avance Consulting |
| job.jsonLD.hiringOrganization .logo | String (URL) | Link to Logo of the company cached by techmap. | https://s3.eu-central-1.amazonaws.com/images.techmap.io/dice_us-d865fc5a-e0ad-57a6-9e0f-45350b82af37-logo.png |
| job.jsonLD.hiringOrganization .url | String (URL) | Website of the company originally stated on the job posting or in its JSON. | https://example.com |
| job.jsonLD.hiringOrganization .identifier | String | ID of the company in Techmap's central database. | 5e1e4a2d824199645bd7e6a8 |
| job.jsonLD.jobLocation | Object | The information on the job location. | ... see job.jsonLD.jobLocation below ... |
| job.jsonLD.jobLocation .identifier | String | ID of the location in Techmap's central database. | 5f5e4ed75151ac3cb7851ab1 |
| job.jsonLD.jobLocation .name | String | The location string as see on the job posting's webpage. | Berlin, Germany |
| job.jsonLD.jobLocation .latitude | Number | The location's latitude. | 30.33804 |
| job.jsonLD.jobLocation .longitude | Number | The location's longitude. | -95.02362 |
| job.jsonLD.jobLocation .address | Object | The information on the job address. | ... see job.jsonLD.jobLocation.address below ... |
| job.jsonLD.jobLocation .address.addressCountry | String | The country as see on the job posting's webpage. | United States |
| job.jsonLD.jobLocation .address.addressRegion | String | The state as see on the job posting's webpage. | TX |
| job.jsonLD.jobLocation .address.addressLocality | String | The city as see on the job posting's webpage. | Cleveland |
| job.jsonLD.jobLocation .address.postalCode | String | Postal or Zip code of the job is located in. | 77327 |
The RSS API response follows the RSS 2.0 specification and includes: title, description, pubDate, link, guid, category, location, city, state, country, company, company_url, company_logo, workType, contractType, industry, careerLevel, workPlace, skills, department, and occupation.
3.1 Data Samples
Sample responses for download in JSON, CSV, RSS, Atom, XML and Parquet: Sample data.
JSON response example
The /search response follows the JSON ECMA-404 specification.
{
"api": "Techmap.io Job Posting API",
"apiVersion": "v2.6",
"page": 1,
"pageSize": 10,
"totalCount": 1069346,
"result": [
{
"occupation": "Functional Analyst",
"dateActive": "2024-10-14T14:48:29.000Z",
"city": "Cleveland",
"timezone": "CST",
"contractType": ["DirectEmployment"],
"language": "en",
"industry": "Transport",
"isDuplicate": false,
"isDuplicateOf": null,
"isDirect": false,
"isRecruiter": false,
"hasSalary": false,
"jsonLD": {
"identifier": "66f4d794a315a1138e6bfac2",
"validThrough": "2024-10-14T14:48:29.000Z",
"employmentType": "Direct Employment",
"@type": "JobPosting",
"salaryCurrency": "USD",
"description": "**Job Description:** ...",
"industry": "Transport",
"title": "SAP TM Functional Analyst",
"@context": "https://schema.org",
"url": "https://www.dice.com/job-detail/003170f7-bd59-45d5-a0cf-e4ef93c27419",
"relevantOccupation": "Functional Analyst",
"skills": ["Logistics", "SAP TM", "ABAP"],
"hiringOrganization": {
"@type": "Organization",
"name": "Example Corp",
"url": "https://example.com"
},
"jobLocation": {
"address": {
"addressCountry": "United States",
"@type": "PostalAddress",
"addressLocality": "Cleveland",
"addressRegion": "TX"
},
"@type": "Place",
"latitude": 30.33804,
"longitude": -95.02362
},
"datePosted": "2024-09-15"
},
"source": "dice_us",
"locale": "en_US",
"geoPoint": { "lon": -95.02362, "lat": 30.33804 },
"title": "SAP TM Functional Analyst",
"skills": ["Logistics", "SAP TM", "ABAP"],
"dateCreated": "2024-09-15T14:43:24.000Z",
"timezoneOffset": -6,
"countryCode": "us",
"company": "Example Corp",
"state": "TX",
"portal": "dice",
"workPlace": ["Onsite"],
"careerLevel": ["N/A"],
"workType": ["N/A"],
"postCode": "77327"
}
],
"resultSizeInBytes": 59203
}RSS response example
The /jobs_full endpoint returns RSS 2.0 format.
<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
<channel>
<title>Techmap.io Job Posting RSS Feed API</title>
<link>https://job-postings-rss-feed.p.rapidapi.com/api/rss/v1/jobs_full?dateCreated=2024-09&countryCode=us</link>
<description>Techmap.io Job Posting API in RSS 2.0 format.</description>
<pubDate>Mon, 16 Sep 2024 08:59:01 GMT</pubDate>
<ttl>1440</ttl>
<page>1</page>
<pageSize>10</pageSize>
<totalCount>1069251</totalCount>
<item>
<title>Entry-Level Technician</title>
<description>We are looking for ...</description>
<pubDate>Sun, 15 Sep 2024 05:00:00 GMT</pubDate>
<link>https://careers-example.icims.com/jobs/55300/job</link>
<guid>https://careers-example.icims.com/jobs/55300/job</guid>
<category>Technician</category>
<city>Portland</city>
<state>OR</state>
<country>United States</country>
<company>Example Company</company>
<industry>Trade</industry>
<careerLevel>Junior</careerLevel>
<workPlace>Onsite</workPlace>
<occupation>Technician</occupation>
</item>
</channel>
</rss>4. References
- Daily International Job Postings API on RapidAPI
- Daily International Job Postings OpenAPI definition
- Job Postings RSS API on RapidAPI
- Job Postings RSS OpenAPI definition
- API Quickstart - first call with curl, Python, and JavaScript
- Errors & billing - status codes, plans, and overage
- Pagination, rate limits & quota
- Integrations - sync patterns, Postman collections, MCP server
- Field reference - all fields with coverage
- API changelog (RSS feed)
- llms.txt - API documentation for AI assistants
- Job Data Overview - field reference for data feeds and datasets
- Portal Explorer - all source portals with monthly job volumes
- FAQ - API billing, quotas, and common questions
Try It Out
Start with 1,000 free job postings per month (100 requests) on the Basic plan.
Job Posting API FAQ
Is the API billed per request or per job?
Per request. Each API request returns 10 job postings, so 100 requests = 1,000 job postings. The Pro plan costs $29/month for 3,000 requests (30,000 job postings) - see the RapidAPI pricing page for all plans and overage rates. Data feeds and historical datasets are priced per country, not per job.
Is there a free tier?
Yes, four: the BASIC plan of the Jobs API on RapidAPI (100 requests = 1,000 job postings per month), the BASIC plan of the RSS API (100 requests = 1,000 job postings per month), and on AWS Data Exchange the free Luxembourg data feed and Luxembourg historical dataset - the same formats as every paid country.
How fresh is the data?
Every source is crawled at least twice per day, and new job postings go straight into the API, so they typically appear within hours of collection. Data feed files on AWS S3 are refreshed hourly. The API covers the last 3 months; older postings are available as historical datasets from January 2020.
Are active and expired jobs marked?
Partly. Postings are not re-checked for removal after collection. Each posting has a dateActive field - the assumed expiry date from the posting's schema.org validThrough, or dateCreated + 30 days. In the API, isActive=true returns only postings whose dateActive lies in the future.
Can I get only jobs from direct employers, without recruiters and aggregators?
Yes. In the API, isDirect=true returns only postings linked directly to the hiring company (not via a job board), and isRecruiter=false excludes postings from recruiting firms. Both fields are also in every record of the data feed and dataset files.
How are duplicates handled?
Duplicates are flagged, not deleted. A job posting with the same company name, city, country and job title within a 3-day window gets isDuplicate: true, and isDuplicateOf points to the earliest identical posting - also across portals. In the API, add isDuplicate=false to exclude them. Kept duplicates are useful for analysis, e.g. where a company distributes its job ads and how much it spends on them.
Do you include Indeed?
No. Indeed job postings are not included. The data comes from 200+ sources - ATS career pages, job boards, job aggregators and employment offices. The full list with monthly volumes is in the portal explorer.
Questions? Contact us if something is unclear or if you want sample data.