{
  "tags": [
    {
      "name": "Job postings",
      "description": "Search and count job postings with the same filters."
    },
    {
      "name": "Metadata",
      "description": "Values and statistics of fields - to find valid filter values. Included from the Pro plan on."
    }
  ],
  "openapi": "3.0.0",
  "info": {
    "title": "Techmap's Job Postings API",
    "version": "2.7.1",
    "contact": {
      "name": "API Support",
      "url": "https://jobdatafeeds.com/contact-us",
      "email": "data@techmap.io"
    },
    "x-logo": {
      "url": "https://api.techmap.io/favicon/android-chrome-512x512.png",
      "altText": "API Logo",
      "href": "/jobs-api"
    },
    "description": "## Introduction\n\nThis API provides access to job postings that have been crawled and scraped directly from various sources up to 3 months in the past.\n\n\nThe job postings are sourced directly through web crawling and scraping from a diverse range of platforms, including:\n- Techmap's Web Crawlers\n- ATS Career Pages (e.g., Workday, Personio, JazzHR, ...)\n- Job Boards (e.g., LinkedIn, Monster, Dice, ...)\n- Job Aggregators (e.g., Indeed, Glassdoor, Xing, ...)\n- Employment Offices (e.g., German Arbeitsagentur, ...)\n\nWith this API, you can seamlessly integrate job postings from multiple sources into your applications, enabling backfilling of job boards, detailed analysis, company monitoring, or automated job agents.\n\n\n### Boolean Queries\n\nMost query parameters in the API support flexible Boolean queries, enabling precise filtering of job postings using multiple keywords, keyphrases, and logical operators.\nBelow are the supported query types:\n\n- **Should Searches (OR):**\n  Keywords separated by a comma will match at least one keyword.\n  Example: `?title=java,developer`\n  Matches jobs with either \"java\" or \"developer\" in the title.\n\n- **Must Searches (AND):**\n  Keywords with an encoded `+` sign (`%2B` in the URL) must be present.\n  Example: `?title=%2bjava,%2bdeveloper`\n  Matches jobs with both \"java\" and \"developer\" in the title.\n\n- **Must-Not Searches (NOT):**\n  Keywords with a `-` sign before are excluded.\n  Example: `?title=%2bjava,-mysql`\n  Matches jobs with \"java\" but not \"mysql\" in the title.\n\n- **Keyphrase Searches:**\n  Words separated with spaces in double quotes count as one keyword / keyphrase.\n  Example: `?city=\"New York\"`\n  Matches jobs in \"New York\".\n\n\n### Notes\n- **Parameter Combinations**: You can combine most parameters, but some combinations may not work together. For example, a geo bounding box cannot be used together with a geo distance search.\n- **Field Availability**: Not all fields are populated for every job posting. Commonly missing fields include `state`, `postCode`, or `department`.\n- **Authentication**: Every request needs your marketplace key - see *How to authenticate* below.\n\n\n### Examples\n\n- **Jobs in Germany:**\n  ```curl\n  curl -X GET \"https://daily-international-job-postings.p.rapidapi.com/api/v2/jobs/count?countryCode=de\" -H \"X-RapidAPI-Key: YOUR_API_KEY\" -H \"X-RapidAPI-Host: daily-international-job-postings.p.rapidapi.com\"\n  ```\n\n- **Remote jobs in core US Timezones (UTC-8 to UTC-5):**\n  ```curl\n  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\" -H \"X-RapidAPI-Host: daily-international-job-postings.p.rapidapi.com\"\n  ```\n\n- **Jobs in southern Netherlands below latitude 52.25:**\n  ```curl\n  curl -X GET \"https://daily-international-job-postings.p.rapidapi.com/api/v2/jobs/count?countryCode=nl&geoTopLeftLat=52.25&geoTopLeftLng=0&geoBottomRightLat=32.25&geoBottomRightLng=10\" -H \"X-RapidAPI-Key: YOUR_API_KEY\" -H \"X-RapidAPI-Host: daily-international-job-postings.p.rapidapi.com\"\n  ```\n\n- **Jobs in the Healthcare industry in the UK:**\n  ```curl\n  curl -X GET \"https://daily-international-job-postings.p.rapidapi.com/api/v2/jobs/count?countryCode=uk&industry=healthcare\" -H \"X-RapidAPI-Key: YOUR_API_KEY\" -H \"X-RapidAPI-Host: daily-international-job-postings.p.rapidapi.com\"\n  ```\n\n- **Jobs for Java Developers in San Francisco:**\n  ```curl\n  curl -X GET \"https://daily-international-job-postings.p.rapidapi.com/api/v2/jobs/count?occupation=programmer&geoPointLat=37.757&geoPointLng=-122.449&geoDistance=100mi\" -H \"X-RapidAPI-Key: YOUR_API_KEY\" -H \"X-RapidAPI-Host: daily-international-job-postings.p.rapidapi.com\"\n  ```\n\n- **Jobs for JavaScript Developers in New York, USA:**\n  ```curl\n  curl -X GET \"https://daily-international-job-postings.p.rapidapi.com/api/v2/jobs/count?skills=JavaScript&countryCode=us&city=%22New%20York%22\" -H \"X-RapidAPI-Key: YOUR_API_KEY\" -H \"X-RapidAPI-Host: daily-international-job-postings.p.rapidapi.com\"\n  ```\n\n- **Jobs in English located in Germany:**\n  ```curl\n  curl -X GET \"https://daily-international-job-postings.p.rapidapi.com/api/v2/jobs/count?countryCode=de&language=en\" -H \"X-RapidAPI-Key: YOUR_API_KEY\" -H \"X-RapidAPI-Host: daily-international-job-postings.p.rapidapi.com\"\n  ```\n\n- **Remote jobs for Web3 Developers:**\n  ```curl\n  curl -X GET \"https://daily-international-job-postings.p.rapidapi.com/api/v2/jobs/count?skills=ledger,Blockchain,Web3,ethereum,ether,bitcoin,crypto&workPlace=remote\" -H \"X-RapidAPI-Key: YOUR_API_KEY\" -H \"X-RapidAPI-Host: daily-international-job-postings.p.rapidapi.com\"\n  ```\n\n- **Jobs from Microsoft in the USA:**\n  ```curl\n  curl -X GET \"https://daily-international-job-postings.p.rapidapi.com/api/v2/jobs/count?countryCode=us&company=Microsoft\" -H \"X-RapidAPI-Key: YOUR_API_KEY\" -H \"X-RapidAPI-Host: daily-international-job-postings.p.rapidapi.com\"\n  ```\n\n- **Jobs for 'Chief ... Officer' (CxO) level in the USA:**\n  ```curl\n  curl -X GET \"https://daily-international-job-postings.p.rapidapi.com/api/v2/jobs/count?countryCode=us&careerLevel=Chief\" -H \"X-RapidAPI-Key: YOUR_API_KEY\" -H \"X-RapidAPI-Host: daily-international-job-postings.p.rapidapi.com\"\n  ```\n\n## Quickstart (RapidAPI)\n\n1. **Subscribe to the Basic plan** of the [Job Postings API on RapidAPI](https://rapidapi.com/techmap-io-techmap-io-default/api/daily-international-job-postings/pricing). It has no hard monthly limit - requests above the included quota are billed as overage (see [Errors & billing](https://api.techmap.io/errors-and-billing)).\n2. **Copy your key** from the [RapidAPI listing](https://rapidapi.com/techmap-io-techmap-io-default/api/daily-international-job-postings) → *Endpoints* tab → code snippet → value of `X-RapidAPI-Key` - one key per RapidAPI application.\n3. **Make your first call.** Replace `YOUR_API_KEY` with your key. A successful call returns HTTP **200**.\n\n### curl\n\n```bash\ncurl --request GET \\\n  --url 'https://daily-international-job-postings.p.rapidapi.com/api/v2/jobs/search?countryCode=us&title=developer' \\\n  --header 'X-RapidAPI-Key: YOUR_API_KEY' \\\n  --header 'X-RapidAPI-Host: daily-international-job-postings.p.rapidapi.com'\n```\n\n### Python\n\n```python\nimport requests\n\nurl = \"https://daily-international-job-postings.p.rapidapi.com/api/v2/jobs/search\"\nparams = {\"countryCode\": \"us\", \"title\": \"developer\"}\nheaders = {\n    \"X-RapidAPI-Key\": \"YOUR_API_KEY\",\n    \"X-RapidAPI-Host\": \"daily-international-job-postings.p.rapidapi.com\",\n}\n\nresponse = requests.get(url, params=params, headers=headers, timeout=30)\nresponse.raise_for_status()\nprint(response.json())\n```\n\n### JavaScript\n\n```javascript\n// Node.js 18+ or browser\nconst url = new URL('https://daily-international-job-postings.p.rapidapi.com/api/v2/jobs/search');\nurl.search = new URLSearchParams({ 'countryCode': 'us', 'title': 'developer' });\n\nconst response = await fetch(url, {\n  headers: {\n    'X-RapidAPI-Key': 'YOUR_API_KEY',\n    'X-RapidAPI-Host': 'daily-international-job-postings.p.rapidapi.com',\n  },\n});\nif (!response.ok) throw new Error(`${response.status}: ${await response.text()}`);\nconsole.log(await response.json());\n```\n\n### Java\n\n```java\n// Java 11+\nimport java.net.URI;\nimport java.net.http.HttpClient;\nimport java.net.http.HttpRequest;\nimport java.net.http.HttpResponse;\n\npublic class TechmapExample {\n    public static void main(String[] args) throws Exception {\n        HttpRequest request = HttpRequest.newBuilder()\n            .uri(URI.create(\"https://daily-international-job-postings.p.rapidapi.com/api/v2/jobs/search?countryCode=us&title=developer\"))\n            .header(\"X-RapidAPI-Key\", \"YOUR_API_KEY\")\n            .header(\"X-RapidAPI-Host\", \"daily-international-job-postings.p.rapidapi.com\")\n            .GET()\n            .build();\n        HttpResponse<String> response = HttpClient.newHttpClient()\n            .send(request, HttpResponse.BodyHandlers.ofString());\n        if (response.statusCode() != 200) throw new RuntimeException(response.statusCode() + \": \" + response.body());\n        System.out.println(response.body());\n    }\n}\n```\n\nGetting an error instead? See [Errors & billing](https://api.techmap.io/errors-and-billing).\n\n## How to authenticate\n\nRequests are authenticated and billed by the marketplace you subscribe through. The base URL, the key and the plans depend on that marketplace.\n\n### RapidAPI\n\n- **Base URL:** `https://daily-international-job-postings.p.rapidapi.com`\n- **Key:** header `X-RapidAPI-Key: YOUR_API_KEY`\n- **Host (optional):** header `X-RapidAPI-Host: daily-international-job-postings.p.rapidapi.com`\n- **Alternative:** query parameter `rapidapi-key=YOUR_API_KEY` in the URL instead of the header\n- **Where to find the key:** [RapidAPI listing](https://rapidapi.com/techmap-io-techmap-io-default/api/daily-international-job-postings) → *Endpoints* tab → code snippet → value of `X-RapidAPI-Key` - one key per RapidAPI application (see [RapidAPI docs](https://docs.rapidapi.com/docs/keys-and-key-rotation)).\n- **Plans and prices:** [RapidAPI pricing page](https://rapidapi.com/techmap-io-techmap-io-default/api/daily-international-job-postings/pricing)\n- Calling the backend directly (without RapidAPI) returns **401**.\n\n## Errors\n\nAll errors return JSON with a `message` field.\n\n| Status | Cause | Solution |\n|---|---|---|\n| **400** Bad Request | A parameter value could not be parsed, e.g. an unknown `countryCode`, an invalid date or `sort` value. | Check the value against the parameter description. The `message` names the invalid parameter. |\n| **401** Unauthorized | The key is missing or invalid, or the request was sent directly to the backend instead of RapidAPI. | Send your key in the header `X-RapidAPI-Key` and use the base URL `https://daily-international-job-postings.p.rapidapi.com`. Copy the key again from the RapidAPI listing if it was rotated. |\n| **403** Forbidden | Either you are not subscribed to this API (\"You are not subscribed to this API.\"), or the endpoint is not included in your plan (e.g. `/api/v2/meta/jobs/distinct` and `/api/v2/meta/jobs/statistics` need at least the Pro plan). | Subscribe to the Basic plan, or upgrade to the plan named in `requiredPlan`. The response contains `message`, `requiredPlan` and `pricingUrl`. |\n| **404** Not Found | The endpoint path does not exist (typo, wrong API version) or a required search parameter is missing, or the requested `field` does not exist. | Check the path and add at least one search parameter (e.g. `countryCode`). The `message` lists the allowed parameters or fields. |\n| **405** Method Not Allowed | Another HTTP method than GET was used. | Use GET. |\n| **429** Too Many Requests | Too many requests in a short time window (rate limit of your RapidAPI plan, e.g. 1 request/second on Basic). This is **not** a monthly limit - the plans have no hard limit, extra requests are billed as overage. RapidAPI also answers 429 after repeated calls with an invalid key. | Slow down and retry with exponential backoff (e.g. 1 s, 2 s, 4 s). If it persists, check that your key is valid. |\n| **500** Internal Server Error | An unexpected error on our side. | Retry once. If it persists, contact data@techmap.io with the full request URL (without your key). |\n| **502/504** Bad Gateway / Gateway Timeout | RapidAPI did not get a timely answer from the backend, typically for very broad queries. | Narrow the query (more filters, shorter date range) and retry. |\n| **503** Service Unavailable | The search backend is temporarily unavailable. | Retry later with exponential backoff. |\n| **509** Bandwidth Limit Exceeded | The response would be larger than 6 MB. | Request a more compact `format` or narrow the query. |\n\n### Example: endpoint not included in your plan (403)\n\n```json\n{\n  \"message\": \"Forbidden request to the API - this endpoint is not included in your plan. It is included from the Pro plan on.\",\n  \"requiredPlan\": \"Pro\",\n  \"pricingUrl\": \"https://rapidapi.com/techmap-io-techmap-io-default/api/daily-international-job-postings/pricing\"\n}\n```\n\nPlans, included requests and overage: [Errors & billing](https://api.techmap.io/errors-and-billing).\n\n## Changelog\n\n- **2026-10-03 (v2.7.1)**: Documentation release. Unknown `countryCode` values (e.g. `zz`, `00`) and invalid dates or date ranges now return **400** with a clear message. **All error responses now return valid JSON** with a `message` field (some were plain text before). Added **Quickstart**, **How to authenticate** (per marketplace) and **Errors & billing**. Fixed the server URL (`https://daily-international-job-postings.p.rapidapi.com`) and added security schemes (`X-RapidAPI-Key` + `X-RapidAPI-Host`). A 403 for an endpoint not included in your plan now returns JSON with `message`, `requiredPlan` and `pricingUrl`.\n- **2026-10-01 (v2.7)**: Added **sort parameter** (`sort=newest` or `sort=oldest`) to get the most recently collected job postings first. Works with page-based and cursor-based pagination. ⚠️ **Note:** the default is still `oldest`. With `sort=newest`, new job postings arriving between requests shift the page-based results (postings can repeat or be skipped across pages) - use `cursor` for complete, stable paging. Temporary search backend errors now return **503** (retry later) instead of passing on the backend status (e.g. a misleading 404), and an invalid `countryCode` or date returns **400** instead of 404. The duplicate filter is documented as `isDuplicate` (the spelling `IsDuplicate` from earlier docs keeps working).\n- **2026-06-03 (v2.6)**: Fixed **Boolean prefix operators** (`+`/`-`) not applying correctly with multiple comma-separated values. Multiple values per field now use AND logic between fields and OR logic within a field.\n- **2026-02-07 (v2.5)**: Added **cursor parameter** for cursor-based pagination.\n- **2025-04-22 (v2.4)**: Added **isDuplicate parameter** for excluding potential duplicates.\n- **2025-03-24 (v2.3)**: Added **date range parameter** for querying specific time periods.\n- **2025-03-14 (v2.2)**: Added **format parameter** for output in json, csv, rss, atom, xml, and parquet.\n- **2025-01-23 (v2.1)**: Added **count endpoint**.\n"
  },
  "components": {
    "parameters": {
      "FieldParam": {
        "name": "field",
        "in": "query",
        "description": "A field name used in a query as a parameter",
        "required": true,
        "schema": {
          "type": "string"
        }
      },
      "PaginationPage": {
        "name": "page",
        "in": "query",
        "description": "The page of the paginated search results starting at 1. Pages contain 10 jobs and the defaults to 1 if not stated.",
        "required": false,
        "schema": {
          "type": "integer",
          "minimum": 1,
          "default": 1
        }
      },
      "Sort": {
        "name": "sort",
        "in": "query",
        "description": "The sort order of the results by the time the job posting was collected: 'oldest' (default) or 'newest'. 'oldest' keeps page-based pagination stable while new jobs are added; 'newest' returns the most recent jobs first. Works with page-based and cursor-based pagination (a cursor keeps the sort order it was created with).",
        "required": false,
        "schema": {
          "type": "string",
          "enum": [
            "oldest",
            "newest"
          ],
          "default": "oldest"
        }
      },
      "Cursor": {
        "name": "cursor",
        "in": "query",
        "description": "The cursor in a cursor-based pagination search started with 'true'. Does not work together with page-based pagination. Defaults to null if not stated.",
        "required": false,
        "schema": {
          "type": "string"
        }
      },
      "DateCreated": {
        "name": "dateCreated",
        "in": "query",
        "description": "The day the job posting was created / posted on using the format `YYYY-MM-DD` or `YYYY-MM`. If empty, the current day minus 2 days is used.",
        "required": false,
        "schema": {
          "type": "string",
          "format": "date",
          "pattern": "^\\d{4}-\\d{2}(-\\d{2})?$"
        }
      },
      "DateCreatedMin": {
        "name": "dateCreatedMin",
        "in": "query",
        "description": "The starting date for a date range search of when the job posting was created or posted, using the format `YYYY-MM-DD`. Only used if `dateCreated` is empty; `dateCreatedMin` and `dateCreatedMax` must be used together.",
        "required": false,
        "schema": {
          "type": "string",
          "format": "date",
          "pattern": "^\\d{4}-\\d{2}(-\\d{2})?$"
        }
      },
      "DateCreatedMax": {
        "name": "dateCreatedMax",
        "in": "query",
        "description": "The ending date for a date range search of when the job posting was created or posted, using the format `YYYY-MM-DD`. Only used if `dateCreated` is empty; `dateCreatedMin` and `dateCreatedMax` must be used together.",
        "required": false,
        "schema": {
          "type": "string",
          "format": "date",
          "pattern": "^\\d{4}-\\d{2}(-\\d{2})?$"
        }
      },
      "IsDirect": {
        "name": "isDirect",
        "in": "query",
        "description": "A flag indicating if the job posting URL or externalApplyUrl links directly to the company's website.",
        "required": false,
        "schema": {
          "type": "string",
          "format": "boolean"
        }
      },
      "IsDuplicate": {
        "name": "isDuplicate",
        "in": "query",
        "description": "A flag indicating whether the job posting is considered a duplicate of another, either within the same source or across multiple sources. Note: We currently err on the safe side, resulting in more false duplicates than there are.",
        "required": false,
        "schema": {
          "type": "string",
          "format": "boolean"
        }
      },
      "IsActive": {
        "name": "isActive",
        "in": "query",
        "description": "A flag indicating if the job posting has a dateActive not yet reached.",
        "required": false,
        "schema": {
          "type": "string",
          "format": "boolean"
        }
      },
      "IsRecruiter": {
        "name": "isRecruiter",
        "in": "query",
        "description": "A flag indicating if the job posting was posted by a recruiting firm.",
        "required": false,
        "schema": {
          "type": "string",
          "format": "boolean"
        }
      },
      "Format": {
        "name": "format",
        "in": "query",
        "description": "The format of the output in json, csv, rss, atom, xml, or parquet (e.g., `format=rss`)",
        "required": false,
        "schema": {
          "type": "string",
          "default": "json",
          "enum": [
            "json",
            "csv",
            "rss",
            "atom",
            "xml",
            "parquet"
          ],
          "example": "json"
        }
      },
      "CountryCode": {
        "name": "countryCode",
        "in": "query",
        "description": "The country the job is located in described by a 2-letter country code from ISO 3166-1 alpha-2. Internally, we lower-case the countryCode and convert 'gb' into 'uk' and 'el' into 'gr' - you can use both spellings.",
        "required": false,
        "schema": {
          "type": "string",
          "format": "ISO 3166-1 alpha-2",
          "example": "us"
        }
      },
      "LanguageCode": {
        "name": "language",
        "in": "query",
        "description": "The language the job posting is written in described by a 2-letter language code from ISO 639-1 such as 'en', 'de' or 'zh'.",
        "required": false,
        "schema": {
          "type": "string",
          "format": "ISO 639-1"
        }
      },
      "LocaleCode": {
        "name": "locale",
        "in": "query",
        "description": "The locale the job posting is written for described by a language and country code.",
        "required": false,
        "schema": {
          "type": "string",
          "pattern": "^[a-z]{2}_[A-Z]{2}$"
        }
      },
      "Title": {
        "name": "title",
        "in": "query",
        "description": "Free-text search within the title of the job postings.",
        "required": false,
        "schema": {
          "type": "string"
        }
      },
      "Skills": {
        "in": "query",
        "name": "skills",
        "required": false,
        "schema": {
          "type": "string"
        },
        "description": "The skills, keywords, or tags associated with the job posting."
      },
      "Company": {
        "in": "query",
        "name": "company",
        "required": false,
        "schema": {
          "type": "string"
        },
        "description": "The company that posted the job posting (can be a recruiting firm)."
      },
      "hasSalary": {
        "in": "query",
        "name": "hasSalary",
        "required": false,
        "schema": {
          "type": "string",
          "format": "boolean",
          "example": "true"
        },
        "description": "A flag indicating if the job posting contains salary information.",
        "x-group": "Salary Parameters"
      },
      "minSalary": {
        "in": "query",
        "name": "minSalary",
        "required": false,
        "schema": {
          "type": "number"
        },
        "description": "The minimum salary of the job posting. Can be yearly, monthly, or hourly and any currency (exact data is stated in JsonLD result).",
        "x-group": "Salary Parameters"
      },
      "Occupation": {
        "in": "query",
        "name": "occupation",
        "required": false,
        "schema": {
          "type": "string"
        },
        "description": "The occupation type extracted from the job title reduced to a stem form incl. several synonyms. For example: programmer, executive, manager, engineer, nurse, etc."
      },
      "Department": {
        "in": "query",
        "name": "department",
        "required": false,
        "schema": {
          "type": "string"
        },
        "description": "The department extracted from the job title such as, finance, it, hr, sales, etc."
      },
      "Industry": {
        "in": "query",
        "name": "industry",
        "required": false,
        "schema": {
          "type": "string"
        },
        "description": "The industry extracted from the job posting or categorization in the job board, such as advertising, agriculture, it, healthcare, etc."
      },
      "PostCode": {
        "in": "query",
        "name": "postCode",
        "required": false,
        "schema": {
          "type": "string"
        },
        "description": "The postal / zip code the workplace is located in, extracted from the job posting or geo-location."
      },
      "City": {
        "in": "query",
        "name": "city",
        "required": false,
        "schema": {
          "type": "string"
        },
        "description": "The city the workplace is located in, extracted from the job posting or geo-location."
      },
      "WorkType": {
        "in": "query",
        "name": "workType",
        "required": false,
        "schema": {
          "type": "string"
        },
        "description": "The type of work duration extracted from the job posting such as fulltime, parttime, flextime, etc."
      },
      "State": {
        "in": "query",
        "name": "state",
        "required": false,
        "schema": {
          "type": "string"
        },
        "description": "The state the workplace is located in, extracted from the job posting or geo-location."
      },
      "WorkPlace": {
        "in": "query",
        "name": "workPlace",
        "required": false,
        "schema": {
          "type": "string"
        },
        "description": "The workplace of the job, extracted from the job posting such as remote, hybrid, onsite, field, offshore, etc."
      },
      "ContractType": {
        "in": "query",
        "name": "contractType",
        "required": false,
        "schema": {
          "type": "string"
        },
        "description": "The type of employment contract extracted from the job posting such as permanent, temporary, internship, etc."
      },
      "Timezone": {
        "in": "query",
        "name": "timezone",
        "required": false,
        "schema": {
          "type": "string"
        },
        "description": "The timezone the job is located in such as CET, PST, or UTC"
      },
      "TimezoneOffset": {
        "in": "query",
        "name": "timezoneOffset",
        "required": false,
        "schema": {
          "type": "integer",
          "minimum": -12,
          "maximum": 12
        },
        "description": "The numeric offset of the timezone from UTC."
      },
      "TimezoneMin": {
        "name": "timezoneMin",
        "in": "query",
        "required": false,
        "schema": {
          "type": "integer",
          "minimum": -12,
          "maximum": 12
        },
        "description": "The minimum numeric offset of the timezone from UTC. Requires a 'timezoneMax' value greater than 'timezoneMin' to search in a timezone range."
      },
      "TimezoneMax": {
        "name": "timezoneMax",
        "in": "query",
        "required": false,
        "schema": {
          "type": "integer",
          "minimum": -12,
          "maximum": 12
        },
        "description": "The maximum numeric offset of the timezone from UTC. Must be larger than 'timezoneMin' to search in a timezone range."
      },
      "GeoPointLat": {
        "in": "query",
        "name": "geoPointLat",
        "required": false,
        "schema": {
          "type": "number",
          "format": "number",
          "minimum": -90,
          "maximum": 90
        },
        "description": "The geographic latitude of a GeoPoint used in a distance search."
      },
      "GeoPointLng": {
        "in": "query",
        "name": "geoPointLng",
        "required": false,
        "schema": {
          "type": "number",
          "format": "number",
          "minimum": -180,
          "maximum": 180
        },
        "description": "The geographic longitude of a GeoPoint used in a distance search."
      },
      "GeoDistance": {
        "in": "query",
        "name": "geoDistance",
        "required": false,
        "schema": {
          "type": "string",
          "pattern": "^[0-9]+(km|mi)$",
          "minimum": 0,
          "maximum": 200
        },
        "description": "The distance from a GeoPoint specified with 'geoPointLat' and 'geoPointLng'."
      },
      "GeoTopLeftLat": {
        "in": "query",
        "name": "geoTopLeftLat",
        "required": false,
        "schema": {
          "type": "number",
          "format": "number",
          "minimum": -90,
          "maximum": 90
        },
        "description": "The geographic latitude of the top left GeoPoint in a bounding box search."
      },
      "GeoTopLeftLng": {
        "in": "query",
        "name": "geoTopLeftLng",
        "required": false,
        "schema": {
          "type": "number",
          "minimum": -180,
          "maximum": 180
        },
        "description": "The geographic longitude of the top left GeoPoint in a bounding box search."
      },
      "GeoBottomRightLat": {
        "in": "query",
        "name": "geoBottomRightLat",
        "required": false,
        "schema": {
          "type": "number",
          "format": "number",
          "minimum": -90,
          "maximum": 90
        },
        "description": "The geographic latitude of the bottom right GeoPoint in a bounding box search."
      },
      "GeoBottomRightLng": {
        "in": "query",
        "name": "geoBottomRightLng",
        "required": false,
        "schema": {
          "type": "number",
          "minimum": -180,
          "maximum": 180
        },
        "description": "The geographic longitude of the bottom right GeoPoint in a bounding box search."
      },
      "Portal": {
        "in": "query",
        "name": "portal",
        "required": false,
        "description": "The portal the job postings originated from.",
        "schema": {
          "type": "string"
        }
      },
      "Source": {
        "in": "query",
        "name": "source",
        "required": false,
        "schema": {
          "type": "string"
        },
        "description": "The specific source with countrycode the job postings originated from such as careerjet, monster, linkedin, techmap, etc."
      }
    },
    "schemas": {
      "GetCountResponse": {
        "format": "json",
        "description": "Count of available job postings for a specific query.",
        "properties": {
          "api": {
            "description": "API name",
            "type": "string",
            "example": "Techmap.io Job Posting API"
          },
          "apiVersion": {
            "description": "API version",
            "type": "string",
            "example": "v2.7.1"
          },
          "apiEndpoint": {
            "description": "API endpoint summary",
            "type": "string",
            "example": "GET count for Job Postings by countryCode, dateCreated, language, industry, timezone, workPlace, etc."
          },
          "totalCount": {
            "description": "The total number of job postings matching the search query.",
            "type": "integer",
            "example": "6937315"
          },
          "query": {
            "description": "The search query we constructed and used to count the job postings.",
            "type": "object",
            "$ref": "#/components/schemas/Query"
          },
          "resultSizeInBytes": {
            "description": "Number of bytes of this payload",
            "type": "integer",
            "example": "363"
          }
        }
      },
      "GetSearchResponse": {
        "format": "json",
        "description": "Search results with job postings for a specific query.",
        "properties": {
          "api": {
            "description": "API name",
            "type": "string",
            "example": "Techmap.io Job Posting API"
          },
          "apiVersion": {
            "description": "API version",
            "type": "string",
            "example": "v2.7.1"
          },
          "apiEndpoint": {
            "description": "API endpoint summary",
            "type": "string",
            "example": "GET search results with Job Postings by countryCode, dateCreated, language, industry, timezone, workPlace, etc."
          },
          "page": {
            "description": "The current page number of the results in the pagination starting at 1",
            "type": "integer",
            "example": "2"
          },
          "pageSize": {
            "description": "The max. number of job postings displayed per page",
            "type": "integer",
            "example": "10"
          },
          "totalCount": {
            "description": "The total number of job postings matching the search criteria.",
            "type": "integer",
            "example": "180725"
          },
          "query": {
            "description": "The search query we constructed and used to count the job postings.",
            "type": "object",
            "$ref": "#/components/schemas/Query"
          },
          "result": {
            "description": "A list of up to 10 job postings with their data.",
            "items": {
              "$ref": "#/components/schemas/JobPosting"
            }
          },
          "resultSizeInBytes": {
            "description": "The size of the search result in bytes",
            "type": "integer",
            "example": "37980"
          }
        }
      },
      "Query": {
        "type": "object",
        "description": "Aggregation used on OpenSearch to calculate distinct counts.",
        "properties": {
          "query": {
            "properties": {
              "bool": {
                "properties": {
                  "must": {
                    "description": "Parameter queries that must exists in the job posting.",
                    "type": "array"
                  },
                  "must_not": {
                    "description": "Parameter queries that must NOT exists in the job posting.",
                    "type": "array"
                  },
                  "should": {
                    "description": "Parameter queries that should exists in the job posting. At least one must match.",
                    "type": "array"
                  }
                }
              }
            }
          }
        }
      },
      "JobPosting": {
        "type": "object",
        "properties": {
          "portal": {
            "type": "string",
            "description": "The platform or portal through which the job posting is published.",
            "example": "linkedin"
          },
          "source": {
            "type": "string",
            "description": "The specific source from which the job posting is obtained.",
            "example": "monster_de"
          },
          "dateCreated": {
            "type": "string",
            "format": "date-time",
            "description": "The date when the job posting was created.",
            "example": "2025-01-21T12:00:00.000Z"
          },
          "dateExpired": {
            "type": "string",
            "format": "date-time",
            "description": "The date until when the job application process is stated open.",
            "example": "2025-03-22T12:00:00Z"
          },
          "dateActive": {
            "type": "string",
            "format": "date-time",
            "description": "The presumed date the job posting is accessible, calculated from dateExpired or dateCreated +1 month.",
            "example": "2025-03-22T12:00:00Z"
          },
          "isDirect": {
            "type": "boolean",
            "description": "Indicates if the job posting URL or externalApplyUrl links directly to the company's website.",
            "example": true
          },
          "isRecruiter": {
            "type": "boolean",
            "description": "Indicates if the job posting was placed by a recruiting firm.",
            "example": false
          },
          "hasSalary": {
            "type": "boolean",
            "description": "Indicates if the job posting contains salary information. ",
            "example": true
          },
          "minSalary": {
            "type": "number",
            "format": "number",
            "description": "The minimum salary stated in the posting. Can be yearly, monthly, or hourly and any currency (but is probably the local currency official in use).",
            "example": 110000
          },
          "title": {
            "type": "string",
            "description": "The job title or position of the job posting.",
            "example": "Developer III (Java) - Cartage, IS Operational Experience"
          },
          "countryCode": {
            "type": "string",
            "description": "The 2-letter country code (ISO 3166-1 alpha-2).",
            "example": "us"
          },
          "state": {
            "type": "string",
            "description": "The state of the job location.",
            "example": "Washington"
          },
          "city": {
            "type": "string",
            "description": "The city of the job location.",
            "example": "Seattle"
          },
          "postCode": {
            "type": "string",
            "description": "The postal code of the job location.",
            "example": "98105"
          },
          "geoPoint": {
            "type": "object",
            "description": "Geopoint of the job's location.",
            "properties": {
              "lat": {
                "type": "number",
                "format": "number",
                "description": "Latitude of the location.",
                "example": 47.60621
              },
              "lon": {
                "type": "number",
                "format": "number",
                "description": "Longitude of the location.",
                "example": -122.33207
              }
            }
          },
          "language": {
            "type": "string",
            "description": "The language of the job posting.",
            "example": "en"
          },
          "locale": {
            "type": "string",
            "description": "Locale or language code.",
            "example": "en_US"
          },
          "timezone": {
            "type": "string",
            "description": "Timezone of the job's location.",
            "example": "PST"
          },
          "timezoneOffset": {
            "type": "number",
            "format": "integer",
            "description": "Timezone offset from UTC.",
            "example": -8
          },
          "company": {
            "type": "string",
            "description": "The company placing the job ad.",
            "example": "Microsoft"
          },
          "industry": {
            "type": "string",
            "description": "The industry or field to which the job belongs.",
            "example": "Construction"
          },
          "department": {
            "type": "string",
            "description": "The department in the company.",
            "example": "IT"
          },
          "occupation": {
            "type": "string",
            "description": "The job title or position.",
            "example": "Programmer"
          },
          "workPlace": {
            "description": "The work place for the job.",
            "type": "array",
            "items": {
              "type": "string"
            },
            "example": [
              "Onsite",
              "Hybrid",
              "Remote"
            ]
          },
          "workType": {
            "description": "The type of work for the job.",
            "type": "array",
            "items": {
              "type": "string"
            },
            "example": [
              "FullTime"
            ]
          },
          "contractType": {
            "description": "The type of contract for the job.",
            "type": "array",
            "items": {
              "type": "string"
            },
            "example": [
              "Permanent"
            ]
          },
          "careerLevel": {
            "description": "The career level necessary for the job.",
            "type": "array",
            "items": {
              "type": "string"
            },
            "example": [
              "Senior"
            ]
          },
          "skills": {
            "type": "array",
            "description": "A list of skills associated with the job.",
            "items": {
              "type": "string"
            },
            "example": [
              "Java",
              "Intellij",
              "Cloud computing"
            ]
          },
          "jsonLD": {
            "$ref": "#/components/schemas/JSONLD"
          }
        }
      },
      "JSONLD": {
        "type": "object",
        "properties": {
          "@context": {
            "type": "string",
            "example": "https://schema.org"
          },
          "@type": {
            "type": "string",
            "example": "JobPosting"
          },
          "identifier": {
            "type": "string",
            "example": "6790caf9a9c8f97adf67c8ed"
          },
          "validThrough": {
            "type": "string",
            "format": "date-time",
            "example": "2025-04-22T00:04:27Z"
          },
          "employmentType": {
            "type": "string",
            "example": "FullTime"
          },
          "salaryCurrency": {
            "type": "string",
            "example": "USD"
          },
          "description": {
            "type": "string",
            "example": "The Information Technology department at Penguin Random House (PRH) is looking for a Developer to join their team. This developer will report to ..."
          },
          "industry": {
            "type": "string",
            "example": "Construction"
          },
          "title": {
            "type": "string",
            "example": "Developer III (Java) - Cartage, IS Operational Experience"
          },
          "url": {
            "type": "string",
            "format": "uri",
            "example": "https://www.careerjet.com/jobad/use0becff9b4b2a7edfd7457b920cf8079"
          },
          "relevantOccupation": {
            "type": "string",
            "example": "Programmer"
          },
          "jobBenefits": {
            "type": "string",
            "example": "Health Insurrance, Paid Holidays, Pension Plan"
          },
          "applicantLocationRequirements": {
            "type": "string",
            "example": "PST Timezone"
          },
          "hiringOrganization": {
            "type": "object",
            "properties": {
              "@context": {
                "type": "string",
                "example": "https://schema.org"
              },
              "@type": {
                "type": "string",
                "example": "Organization"
              },
              "identifier": {
                "type": "string",
                "example": "64db4e716181b917468e135c"
              },
              "name": {
                "type": "string",
                "example": "Microsoft"
              }
            }
          },
          "jobLocation": {
            "type": "object",
            "properties": {
              "@context": {
                "type": "string",
                "example": "https://schema.org"
              },
              "@type": {
                "type": "string",
                "example": "Place"
              },
              "identifier": {
                "type": "string",
                "example": "64db68a76181b917468f37d0"
              },
              "name": {
                "type": "string",
                "example": "Seattle, Washington, United States"
              },
              "latitude": {
                "type": "number",
                "example": 47.60621
              },
              "longitude": {
                "type": "number",
                "example": -122.33207
              },
              "address": {
                "properties": {
                  "@context": {
                    "type": "string",
                    "example": "https://schema.org"
                  },
                  "@type": {
                    "type": "string",
                    "example": "PostalAddress"
                  },
                  "addressLocality": {
                    "type": "string",
                    "example": "Seattle"
                  },
                  "addressCountry": {
                    "type": "string",
                    "example": "United States"
                  },
                  "addressRegion": {
                    "type": "string",
                    "example": "Washington"
                  }
                }
              }
            }
          },
          "employmentUnit": {
            "type": "string",
            "example": "IT"
          },
          "datePosted": {
            "type": "string",
            "format": "date",
            "example": "2025-01-22"
          },
          "baseSalary": {
            "type": "object",
            "properties": {
              "@context": {
                "type": "string",
                "example": "https://schema.org"
              },
              "@type": {
                "type": "string",
                "example": "MonetaryAmount"
              },
              "currency": {
                "type": "string",
                "example": "USD"
              },
              "value": {
                "type": "object",
                "properties": {
                  "@context": {
                    "type": "string",
                    "example": "https://schema.org"
                  },
                  "@type": {
                    "type": "string",
                    "example": "QuantitativeValue"
                  },
                  "minValue": {
                    "type": "string",
                    "example": "110000"
                  },
                  "maxValue": {
                    "type": "string",
                    "example": "175000"
                  },
                  "unitText": {
                    "type": "string",
                    "example": "YEAR"
                  }
                }
              }
            }
          }
        }
      },
      "GetFieldStatisticsResponse": {
        "format": "json",
        "description": "List of statistics for values of a query parameter.",
        "properties": {
          "api": {
            "description": "API name",
            "type": "string",
            "example": "Techmap.io Job Posting API"
          },
          "apiVersion": {
            "description": "API version",
            "type": "string",
            "example": "v2.7.1"
          },
          "apiEndpoint": {
            "description": "API endpoint summary",
            "type": "string",
            "example": "GET statistics on a searchable field from endpoint '/api/v2/jobs/' such as 'workPlace', 'workType', 'contractType', 'careerLevel', 'occupation', 'department', 'industry', 'language', 'locale', 'timezone', 'timezoneOffset', 'countryCode', 'postCode', 'city', 'state', 'skills', 'company'"
          },
          "aggregation": {
            "description": "Aggregation used on OpenSearch to calculate statistics.",
            "type": "object",
            "$ref": "#/components/schemas/Aggregation"
          },
          "totalCount": {
            "description": "Absolute number of jobs with or without any value.",
            "type": "integer",
            "example": "6937315"
          },
          "docsWithValue": {
            "description": "Absolute number of jobs with any value.",
            "type": "integer",
            "example": "6937315"
          },
          "coverage": {
            "description": "Percentage of jobs with any value.",
            "type": "integer",
            "example": "100"
          },
          "valueCount": {
            "description": "Number of Values found in time range.",
            "type": "integer",
            "example": "42"
          },
          "values": {
            "description": "Array with object for each value (max. 100 values)",
            "items": {
              "$ref": "#/components/schemas/ValueStatisticsItem"
            }
          }
        }
      },
      "ValueStatisticsItem": {
        "type": "object",
        "description": "Statistic for one Value.",
        "properties": {
          "key": {
            "description": "Value text",
            "type": "string",
            "example": "automotive"
          },
          "doc_count": {
            "description": "Number of jobs with this value in the last 30 days.",
            "type": "integer",
            "example": "166060"
          },
          "percentage_relative": {
            "description": "Percentage of jobs with this value relative to 'docsWithValue'.",
            "type": "number",
            "example": "2.3937214902307304"
          },
          "percentage_absolute": {
            "description": "Percentage of jobs with this value relative to 'totalCount' (absolute).",
            "type": "number",
            "example": "2.3937214902307304"
          }
        }
      },
      "GetFieldDistinctResponse": {
        "format": "json",
        "description": "List of distinct values for a query parameter.",
        "properties": {
          "api": {
            "description": "API name",
            "type": "string",
            "example": "Techmap.io Job Posting API"
          },
          "apiVersion": {
            "description": "API version",
            "type": "string",
            "example": "v2.7.1"
          },
          "apiEndpoint": {
            "description": "API endpoint summary",
            "type": "string",
            "example": "GET statistics on a searchable field from endpoint '/api/v2/jobs/' such as 'workPlace', 'workType', 'contractType', 'careerLevel', 'occupation', 'department', 'industry', 'language', 'locale', 'timezone', 'timezoneOffset', 'countryCode', 'postCode', 'city', 'state', 'skills', 'company'"
          },
          "aggregation": {
            "description": "Aggregation used on OpenSearch to calculate distinct counts.",
            "type": "object",
            "$ref": "#/components/schemas/Aggregation"
          },
          "totalCount": {
            "description": "Absolute number of jobs with or without any value.",
            "type": "integer",
            "example": "6937315"
          },
          "docsWithValue": {
            "description": "Absolute number of jobs with any value.",
            "type": "integer",
            "example": "6937315"
          },
          "coverage": {
            "description": "Percentage of jobs with any value.",
            "type": "integer",
            "example": "100"
          },
          "valueCount": {
            "description": "Number of Values found in time range.",
            "type": "integer",
            "example": "42"
          },
          "values": {
            "description": "Array with object for each value (max. 500 values)",
            "items": {
              "$ref": "#/components/schemas/ValueDistinctItem"
            }
          }
        }
      },
      "ValueDistinctItem": {
        "type": "object",
        "description": "Distinct count for one Value.",
        "properties": {
          "key": {
            "description": "Value text",
            "type": "string",
            "example": "automotive"
          },
          "doc_count": {
            "description": "Number of jobs with this value in the last 30 days.",
            "type": "integer",
            "example": "166060"
          }
        }
      },
      "Aggregation": {
        "type": "object",
        "description": "Aggregation used on OpenSearch to calculate distinct counts.",
        "properties": {
          "query": {
            "description": "Query used to set the time range",
            "type": "string"
          },
          "size": {
            "description": "Max number of jobs to use in the aggregation. Value of 0 means all.",
            "type": "integer",
            "example": "0"
          },
          "aggs": {
            "description": "The aggregation command showing the field name and max value terms.",
            "type": "object"
          }
        }
      },
      "Response400": {
        "description": "Bad Request - e.g., parameter value could not be parsed.",
        "type": "object",
        "example": {
          "error": {
            "root_cause": [
              {
                "type": "parse_exception",
                "reason": "cannot parse empty date"
              },
              {
                "type": "parse_exception",
                "reason": "cannot parse empty date"
              }
            ],
            "type": "search_phase_execution_exception",
            "reason": "all shards failed",
            "phase": "query",
            "grouped": true,
            "failed_shards": [
              {
                "shard": 0,
                "index": "jobs_v6",
                "node": "XE_he1b4TfehZ4QHFGUmGQ",
                "reason": {
                  "type": "parse_exception",
                  "reason": "cannot parse empty date"
                }
              },
              {
                "shard": 0,
                "index": "jobs_v7",
                "node": "XE_he1b4TfehZ4QHFGUmGQ",
                "reason": {
                  "type": "parse_exception",
                  "reason": "cannot parse empty date"
                }
              }
            ]
          },
          "status": 400
        }
      },
      "Response403": {
        "description": "Forbidden - not subscribed, or endpoint not included in your plan",
        "type": "object",
        "properties": {
          "message": {
            "description": "The error message.",
            "type": "string",
            "nullable": false
          },
          "requiredPlan": {
            "description": "Smallest plan that includes this endpoint (only if the plan is the reason).",
            "type": "string",
            "nullable": true
          },
          "pricingUrl": {
            "description": "Pricing page of the marketplace you are subscribed through.",
            "type": "string",
            "nullable": true
          }
        },
        "example": {
          "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"
        }
      },
      "Response405": {
        "description": "Method Not Allowed - e.g., using POST not GET",
        "type": "object",
        "properties": {
          "message": {
            "description": "The error message.",
            "type": "string",
            "nullable": false
          }
        },
        "example": {
          "message": "Method 'POST' not Allowed! Please use one of: GET"
        }
      },
      "Response4xx": {
        "description": "Client Error - i.e., you made a mistake.",
        "type": "object",
        "properties": {
          "message": {
            "description": "The error message.",
            "type": "string",
            "nullable": false
          }
        },
        "example": {
          "message": "... The error message ..."
        }
      },
      "Response500": {
        "description": "Internal Server Error (more info in return value)",
        "type": "object",
        "properties": {
          "message": {
            "description": "The error message.",
            "type": "string",
            "nullable": false
          }
        },
        "example": {
          "message": "Problem with GET: NullPointerException"
        }
      },
      "Response503": {
        "description": "Service Unavailable - due to problems with our backend",
        "type": "object",
        "properties": {
          "message": {
            "description": "The error message.",
            "type": "string",
            "nullable": false
          }
        },
        "example": {
          "message": "Problems connecting to our Backend - please try again later!"
        }
      },
      "Response509": {
        "description": "Bandwidth Limit Exceeded - too much data transmitted",
        "type": "object",
        "properties": {
          "message": {
            "description": "The error message.",
            "type": "string",
            "nullable": false
          }
        },
        "example": {
          "message": "Bandwidth Limit Exceeded: Too much data to transmit - payload is over 6MB (AWS Lambda Payload Limit)"
        }
      },
      "Response5xx": {
        "description": "Server Error - i.e., we made a mistake.",
        "type": "object",
        "properties": {
          "message": {
            "description": "The error message.",
            "type": "string",
            "nullable": false
          }
        },
        "example": {
          "message": "... The error message ..."
        }
      },
      "Response401": {
        "description": "Unauthorized - key missing or invalid",
        "type": "object",
        "properties": {
          "message": {
            "description": "The error message.",
            "type": "string",
            "nullable": false
          }
        },
        "example": {
          "message": "Invalid API key. Go to https://docs.rapidapi.com/docs/keys for more info."
        }
      },
      "Response404": {
        "description": "Not Found - unknown path, missing search parameter or unknown field",
        "type": "object",
        "properties": {
          "message": {
            "description": "The error message.",
            "type": "string",
            "nullable": false
          }
        },
        "example": {
          "message": "This is the endpoint of Techmap's Job Data API supporting the GET method! You need to state a search query such as ..."
        }
      },
      "Response429": {
        "description": "Too Many Requests - rate limit of the marketplace (no monthly hard limit)",
        "type": "object",
        "properties": {
          "message": {
            "description": "The error message.",
            "type": "string",
            "nullable": false
          }
        },
        "example": {
          "message": "Too many requests"
        }
      }
    },
    "securitySchemes": {
      "X-RapidAPI-Key": {
        "type": "apiKey",
        "in": "header",
        "name": "X-RapidAPI-Key",
        "description": "Your RapidAPI key as header: `X-RapidAPI-Key: YOUR_API_KEY`"
      },
      "rapidapi-key": {
        "type": "apiKey",
        "in": "query",
        "name": "rapidapi-key",
        "description": "Your RapidAPI key as URL parameter: `?rapidapi-key=YOUR_API_KEY` - for tools where you can only set a URL, e.g. job board feed importers"
      }
    }
  },
  "servers": [
    {
      "url": "https://daily-international-job-postings.p.rapidapi.com",
      "description": "RapidAPI - subscribe at https://rapidapi.com/techmap-io-techmap-io-default/api/daily-international-job-postings/pricing"
    }
  ],
  "paths": {
    "/api/v2/jobs/search": {
      "get": {
        "operationId": "search",
        "tags": [
          "Job postings"
        ],
        "summary": "Search job postings",
        "description": "Use this endpoint to get the job postings themselves (10 per request). If you only need the number of matching postings, use count instead. This endpoint returns the paginated search results for a search query using various query parameters. The response is returned per default in JSON format and primarily consists of a JSON-LD payload containing up to 10 JobPostings per page (see https://schema.org/JobPosting). With the format parameter other output formats can be requested.<br /><br />This structured data can be directly integrated into a webpage to enhance visibility and indexing by search engines (e.g., https://developers.google.com/search/docs/appearance/structured-data/job-posting).",
        "externalDocs": {
          "description": "Documentation of this endpoint",
          "url": "https://api.techmap.io/jobs-api/search"
        },
        "parameters": [
          {
            "$ref": "#/components/parameters/Format"
          },
          {
            "$ref": "#/components/parameters/DateCreated"
          },
          {
            "$ref": "#/components/parameters/DateCreatedMin"
          },
          {
            "$ref": "#/components/parameters/DateCreatedMax"
          },
          {
            "$ref": "#/components/parameters/PaginationPage"
          },
          {
            "$ref": "#/components/parameters/Cursor"
          },
          {
            "$ref": "#/components/parameters/Sort"
          },
          {
            "$ref": "#/components/parameters/IsDirect"
          },
          {
            "$ref": "#/components/parameters/IsDuplicate"
          },
          {
            "$ref": "#/components/parameters/IsActive"
          },
          {
            "$ref": "#/components/parameters/IsRecruiter"
          },
          {
            "$ref": "#/components/parameters/Title"
          },
          {
            "$ref": "#/components/parameters/Skills"
          },
          {
            "$ref": "#/components/parameters/LanguageCode"
          },
          {
            "$ref": "#/components/parameters/ContractType"
          },
          {
            "$ref": "#/components/parameters/WorkType"
          },
          {
            "$ref": "#/components/parameters/WorkPlace"
          },
          {
            "$ref": "#/components/parameters/hasSalary"
          },
          {
            "$ref": "#/components/parameters/minSalary"
          },
          {
            "$ref": "#/components/parameters/Industry"
          },
          {
            "$ref": "#/components/parameters/Company"
          },
          {
            "$ref": "#/components/parameters/Department"
          },
          {
            "$ref": "#/components/parameters/Occupation"
          },
          {
            "$ref": "#/components/parameters/CountryCode"
          },
          {
            "$ref": "#/components/parameters/State"
          },
          {
            "$ref": "#/components/parameters/City"
          },
          {
            "$ref": "#/components/parameters/PostCode"
          },
          {
            "$ref": "#/components/parameters/Timezone"
          },
          {
            "$ref": "#/components/parameters/TimezoneOffset"
          },
          {
            "$ref": "#/components/parameters/TimezoneMin"
          },
          {
            "$ref": "#/components/parameters/TimezoneMax"
          },
          {
            "$ref": "#/components/parameters/GeoPointLat"
          },
          {
            "$ref": "#/components/parameters/GeoPointLng"
          },
          {
            "$ref": "#/components/parameters/GeoDistance"
          },
          {
            "$ref": "#/components/parameters/GeoTopLeftLat"
          },
          {
            "$ref": "#/components/parameters/GeoTopLeftLng"
          },
          {
            "$ref": "#/components/parameters/GeoBottomRightLat"
          },
          {
            "$ref": "#/components/parameters/GeoBottomRightLng"
          },
          {
            "$ref": "#/components/parameters/Portal"
          },
          {
            "$ref": "#/components/parameters/Source"
          }
        ],
        "responses": {
          "200": {
            "description": "Success - indicating a correct query execution with results",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/GetSearchResponse"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request - A parameter value could not be parsed, e.g. an unknown `countryCode`, an invalid date or `sort` value. **Solution:** Check the value against the parameter description. The `message` names the invalid parameter.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Response400"
                }
              }
            }
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Response401"
                }
              }
            },
            "description": "Unauthorized - The key is missing or invalid, or the request was sent directly to the backend instead of RapidAPI. **Solution:** Send your key in the header `X-RapidAPI-Key` and use the base URL `https://daily-international-job-postings.p.rapidapi.com`. Copy the key again from the RapidAPI listing if it was rotated."
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Response403"
                }
              }
            },
            "description": "Forbidden - Either you are not subscribed to this API (\"You are not subscribed to this API.\"), or the endpoint is not included in your plan (e.g. `/api/v2/meta/jobs/distinct` and `/api/v2/meta/jobs/statistics` need at least the Pro plan). **Solution:** Subscribe to the Basic plan, or upgrade to the plan named in `requiredPlan`. The response contains `message`, `requiredPlan` and `pricingUrl`."
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Response404"
                }
              }
            },
            "description": "Not Found - The endpoint path does not exist (typo, wrong API version) or a required search parameter is missing, or the requested `field` does not exist. **Solution:** Check the path and add at least one search parameter (e.g. `countryCode`). The `message` lists the allowed parameters or fields."
          },
          "405": {
            "description": "Method Not Allowed - Another HTTP method than GET was used. **Solution:** Use GET.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Response405"
                }
              }
            }
          },
          "429": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Response429"
                }
              }
            },
            "description": "Too Many Requests - Too many requests in a short time window (rate limit of your RapidAPI plan, e.g. 1 request/second on Basic). This is **not** a monthly limit - the plans have no hard limit, extra requests are billed as overage. RapidAPI also answers 429 after repeated calls with an invalid key. **Solution:** Slow down and retry with exponential backoff (e.g. 1 s, 2 s, 4 s). If it persists, check that your key is valid."
          },
          "500": {
            "description": "Internal Server Error - An unexpected error on our side. **Solution:** Retry once. If it persists, contact data@techmap.io with the full request URL (without your key).",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Response500"
                }
              }
            }
          },
          "503": {
            "description": "Service Unavailable - The search backend is temporarily unavailable. **Solution:** Retry later with exponential backoff.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Response503"
                }
              }
            }
          },
          "509": {
            "description": "Bandwidth Limit Exceeded - The response would be larger than 6 MB. **Solution:** Request a more compact `format` or narrow the query.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Response509"
                }
              }
            }
          }
        },
        "x-codeSamples": [
          {
            "lang": "Shell",
            "label": "curl",
            "source": "curl --request GET \\\n  --url 'https://daily-international-job-postings.p.rapidapi.com/api/v2/jobs/search?countryCode=us&title=developer' \\\n  --header 'X-RapidAPI-Key: YOUR_API_KEY' \\\n  --header 'X-RapidAPI-Host: daily-international-job-postings.p.rapidapi.com'"
          },
          {
            "lang": "Python",
            "label": "Python",
            "source": "import requests\n\nurl = \"https://daily-international-job-postings.p.rapidapi.com/api/v2/jobs/search\"\nparams = {\"countryCode\": \"us\", \"title\": \"developer\"}\nheaders = {\n    \"X-RapidAPI-Key\": \"YOUR_API_KEY\",\n    \"X-RapidAPI-Host\": \"daily-international-job-postings.p.rapidapi.com\",\n}\n\nresponse = requests.get(url, params=params, headers=headers, timeout=30)\nresponse.raise_for_status()\nprint(response.json())"
          },
          {
            "lang": "JavaScript",
            "label": "JavaScript",
            "source": "// Node.js 18+ or browser\nconst url = new URL('https://daily-international-job-postings.p.rapidapi.com/api/v2/jobs/search');\nurl.search = new URLSearchParams({ 'countryCode': 'us', 'title': 'developer' });\n\nconst response = await fetch(url, {\n  headers: {\n    'X-RapidAPI-Key': 'YOUR_API_KEY',\n    'X-RapidAPI-Host': 'daily-international-job-postings.p.rapidapi.com',\n  },\n});\nif (!response.ok) throw new Error(`${response.status}: ${await response.text()}`);\nconsole.log(await response.json());"
          },
          {
            "lang": "Java",
            "label": "Java",
            "source": "// Java 11+\nimport java.net.URI;\nimport java.net.http.HttpClient;\nimport java.net.http.HttpRequest;\nimport java.net.http.HttpResponse;\n\npublic class TechmapExample {\n    public static void main(String[] args) throws Exception {\n        HttpRequest request = HttpRequest.newBuilder()\n            .uri(URI.create(\"https://daily-international-job-postings.p.rapidapi.com/api/v2/jobs/search?countryCode=us&title=developer\"))\n            .header(\"X-RapidAPI-Key\", \"YOUR_API_KEY\")\n            .header(\"X-RapidAPI-Host\", \"daily-international-job-postings.p.rapidapi.com\")\n            .GET()\n            .build();\n        HttpResponse<String> response = HttpClient.newHttpClient()\n            .send(request, HttpResponse.BodyHandlers.ofString());\n        if (response.statusCode() != 200) throw new RuntimeException(response.statusCode() + \": \" + response.body());\n        System.out.println(response.body());\n    }\n}"
          }
        ]
      }
    },
    "/api/v2/jobs/count": {
      "get": {
        "operationId": "count",
        "tags": [
          "Job postings"
        ],
        "summary": "Count job postings",
        "description": "Use this endpoint when you only need numbers - e.g. for labour market analysis or to size a query before paging through search. It accepts the same filters as search. This endpoint returns the total number of job postings matching the specified query parameters. The response is per default a simple JSON object containing the count of job postings as well as the used query send to the underlying database. With the format parameter other output formats can be requested.",
        "externalDocs": {
          "description": "Documentation of this endpoint",
          "url": "https://api.techmap.io/jobs-api/count"
        },
        "parameters": [
          {
            "$ref": "#/components/parameters/Format"
          },
          {
            "$ref": "#/components/parameters/DateCreated"
          },
          {
            "$ref": "#/components/parameters/DateCreatedMin"
          },
          {
            "$ref": "#/components/parameters/DateCreatedMax"
          },
          {
            "$ref": "#/components/parameters/IsDirect"
          },
          {
            "$ref": "#/components/parameters/IsDuplicate"
          },
          {
            "$ref": "#/components/parameters/IsActive"
          },
          {
            "$ref": "#/components/parameters/IsRecruiter"
          },
          {
            "$ref": "#/components/parameters/Title"
          },
          {
            "$ref": "#/components/parameters/Skills"
          },
          {
            "$ref": "#/components/parameters/LanguageCode"
          },
          {
            "$ref": "#/components/parameters/ContractType"
          },
          {
            "$ref": "#/components/parameters/WorkType"
          },
          {
            "$ref": "#/components/parameters/WorkPlace"
          },
          {
            "$ref": "#/components/parameters/hasSalary"
          },
          {
            "$ref": "#/components/parameters/minSalary"
          },
          {
            "$ref": "#/components/parameters/Industry"
          },
          {
            "$ref": "#/components/parameters/Company"
          },
          {
            "$ref": "#/components/parameters/Department"
          },
          {
            "$ref": "#/components/parameters/Occupation"
          },
          {
            "$ref": "#/components/parameters/CountryCode"
          },
          {
            "$ref": "#/components/parameters/State"
          },
          {
            "$ref": "#/components/parameters/City"
          },
          {
            "$ref": "#/components/parameters/PostCode"
          },
          {
            "$ref": "#/components/parameters/Timezone"
          },
          {
            "$ref": "#/components/parameters/TimezoneOffset"
          },
          {
            "$ref": "#/components/parameters/TimezoneMin"
          },
          {
            "$ref": "#/components/parameters/TimezoneMax"
          },
          {
            "$ref": "#/components/parameters/GeoPointLat"
          },
          {
            "$ref": "#/components/parameters/GeoPointLng"
          },
          {
            "$ref": "#/components/parameters/GeoDistance"
          },
          {
            "$ref": "#/components/parameters/GeoTopLeftLat"
          },
          {
            "$ref": "#/components/parameters/GeoTopLeftLng"
          },
          {
            "$ref": "#/components/parameters/GeoBottomRightLat"
          },
          {
            "$ref": "#/components/parameters/GeoBottomRightLng"
          },
          {
            "$ref": "#/components/parameters/Portal"
          },
          {
            "$ref": "#/components/parameters/Source"
          }
        ],
        "responses": {
          "200": {
            "description": "Success - indicating a correct query execution with results",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/GetCountResponse"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request - A parameter value could not be parsed, e.g. an unknown `countryCode`, an invalid date or `sort` value. **Solution:** Check the value against the parameter description. The `message` names the invalid parameter.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Response400"
                }
              }
            }
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Response401"
                }
              }
            },
            "description": "Unauthorized - The key is missing or invalid, or the request was sent directly to the backend instead of RapidAPI. **Solution:** Send your key in the header `X-RapidAPI-Key` and use the base URL `https://daily-international-job-postings.p.rapidapi.com`. Copy the key again from the RapidAPI listing if it was rotated."
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Response403"
                }
              }
            },
            "description": "Forbidden - Either you are not subscribed to this API (\"You are not subscribed to this API.\"), or the endpoint is not included in your plan (e.g. `/api/v2/meta/jobs/distinct` and `/api/v2/meta/jobs/statistics` need at least the Pro plan). **Solution:** Subscribe to the Basic plan, or upgrade to the plan named in `requiredPlan`. The response contains `message`, `requiredPlan` and `pricingUrl`."
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Response404"
                }
              }
            },
            "description": "Not Found - The endpoint path does not exist (typo, wrong API version) or a required search parameter is missing, or the requested `field` does not exist. **Solution:** Check the path and add at least one search parameter (e.g. `countryCode`). The `message` lists the allowed parameters or fields."
          },
          "405": {
            "description": "Method Not Allowed - Another HTTP method than GET was used. **Solution:** Use GET.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Response405"
                }
              }
            }
          },
          "429": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Response429"
                }
              }
            },
            "description": "Too Many Requests - Too many requests in a short time window (rate limit of your RapidAPI plan, e.g. 1 request/second on Basic). This is **not** a monthly limit - the plans have no hard limit, extra requests are billed as overage. RapidAPI also answers 429 after repeated calls with an invalid key. **Solution:** Slow down and retry with exponential backoff (e.g. 1 s, 2 s, 4 s). If it persists, check that your key is valid."
          },
          "500": {
            "description": "Internal Server Error - An unexpected error on our side. **Solution:** Retry once. If it persists, contact data@techmap.io with the full request URL (without your key).",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Response500"
                }
              }
            }
          },
          "503": {
            "description": "Service Unavailable - The search backend is temporarily unavailable. **Solution:** Retry later with exponential backoff.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Response503"
                }
              }
            }
          }
        },
        "x-codeSamples": [
          {
            "lang": "Shell",
            "label": "curl",
            "source": "curl --request GET \\\n  --url 'https://daily-international-job-postings.p.rapidapi.com/api/v2/jobs/count?countryCode=de' \\\n  --header 'X-RapidAPI-Key: YOUR_API_KEY' \\\n  --header 'X-RapidAPI-Host: daily-international-job-postings.p.rapidapi.com'"
          },
          {
            "lang": "Python",
            "label": "Python",
            "source": "import requests\n\nurl = \"https://daily-international-job-postings.p.rapidapi.com/api/v2/jobs/count\"\nparams = {\"countryCode\": \"de\"}\nheaders = {\n    \"X-RapidAPI-Key\": \"YOUR_API_KEY\",\n    \"X-RapidAPI-Host\": \"daily-international-job-postings.p.rapidapi.com\",\n}\n\nresponse = requests.get(url, params=params, headers=headers, timeout=30)\nresponse.raise_for_status()\nprint(response.json())"
          },
          {
            "lang": "JavaScript",
            "label": "JavaScript",
            "source": "// Node.js 18+ or browser\nconst url = new URL('https://daily-international-job-postings.p.rapidapi.com/api/v2/jobs/count');\nurl.search = new URLSearchParams({ 'countryCode': 'de' });\n\nconst response = await fetch(url, {\n  headers: {\n    'X-RapidAPI-Key': 'YOUR_API_KEY',\n    'X-RapidAPI-Host': 'daily-international-job-postings.p.rapidapi.com',\n  },\n});\nif (!response.ok) throw new Error(`${response.status}: ${await response.text()}`);\nconsole.log(await response.json());"
          },
          {
            "lang": "Java",
            "label": "Java",
            "source": "// Java 11+\nimport java.net.URI;\nimport java.net.http.HttpClient;\nimport java.net.http.HttpRequest;\nimport java.net.http.HttpResponse;\n\npublic class TechmapExample {\n    public static void main(String[] args) throws Exception {\n        HttpRequest request = HttpRequest.newBuilder()\n            .uri(URI.create(\"https://daily-international-job-postings.p.rapidapi.com/api/v2/jobs/count?countryCode=de\"))\n            .header(\"X-RapidAPI-Key\", \"YOUR_API_KEY\")\n            .header(\"X-RapidAPI-Host\", \"daily-international-job-postings.p.rapidapi.com\")\n            .GET()\n            .build();\n        HttpResponse<String> response = HttpClient.newHttpClient()\n            .send(request, HttpResponse.BodyHandlers.ofString());\n        if (response.statusCode() != 200) throw new RuntimeException(response.statusCode() + \": \" + response.body());\n        System.out.println(response.body());\n    }\n}"
          }
        ]
      }
    },
    "/api/v2/meta/jobs/distinct": {
      "get": {
        "operationId": "distinct",
        "tags": [
          "Metadata"
        ],
        "summary": "List distinct values of a field",
        "description": "Use this endpoint to find valid filter values (e.g. which industries or workplaces exist) - not to get job postings. This endpoint returns a list of distinct field values for the given query parameter. The response is per default a simple JSON object containing a list of keys usable as query parameter values and the count of jobs with this field value. With the format parameter other output formats can be requested. <h3>Notes</h3> <ul> <li> This endpoint is not included in every plan (see <i>Errors &amp; billing</i>). Without it, the response is <b>403</b> with <code>requiredPlan</code> and <code>pricingUrl</code>. </li> <br /> <li> The results are capped at 500 values and are calculated from job postings within the last month (i.e., current date minus 1 month). </li> </ul> <br /> <h3>Usage Examples</h3> <p>Used workPlace values:</p>\n `/api/v2/meta/jobs/distinct?field=workPlace`</p> <p>Used industry values:</p>\n `/api/v2/meta/jobs/distinct?field=industry`</p> ",
        "externalDocs": {
          "description": "Documentation of this endpoint",
          "url": "https://api.techmap.io/jobs-api/distinct"
        },
        "parameters": [
          {
            "$ref": "#/components/parameters/FieldParam"
          },
          {
            "$ref": "#/components/parameters/Format"
          }
        ],
        "responses": {
          "200": {
            "description": "Success - indicating a correct query execution with results",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/GetFieldDistinctResponse"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request - A parameter value could not be parsed, e.g. an unknown `countryCode`, an invalid date or `sort` value. **Solution:** Check the value against the parameter description. The `message` names the invalid parameter.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Response400"
                }
              }
            }
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Response401"
                }
              }
            },
            "description": "Unauthorized - The key is missing or invalid, or the request was sent directly to the backend instead of RapidAPI. **Solution:** Send your key in the header `X-RapidAPI-Key` and use the base URL `https://daily-international-job-postings.p.rapidapi.com`. Copy the key again from the RapidAPI listing if it was rotated."
          },
          "403": {
            "description": "Forbidden - Either you are not subscribed to this API (\"You are not subscribed to this API.\"), or the endpoint is not included in your plan (e.g. `/api/v2/meta/jobs/distinct` and `/api/v2/meta/jobs/statistics` need at least the Pro plan). **Solution:** Subscribe to the Basic plan, or upgrade to the plan named in `requiredPlan`. The response contains `message`, `requiredPlan` and `pricingUrl`.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Response403"
                }
              }
            }
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Response404"
                }
              }
            },
            "description": "Not Found - The endpoint path does not exist (typo, wrong API version) or a required search parameter is missing, or the requested `field` does not exist. **Solution:** Check the path and add at least one search parameter (e.g. `countryCode`). The `message` lists the allowed parameters or fields."
          },
          "405": {
            "description": "Method Not Allowed - Another HTTP method than GET was used. **Solution:** Use GET.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Response405"
                }
              }
            }
          },
          "429": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Response429"
                }
              }
            },
            "description": "Too Many Requests - Too many requests in a short time window (rate limit of your RapidAPI plan, e.g. 1 request/second on Basic). This is **not** a monthly limit - the plans have no hard limit, extra requests are billed as overage. RapidAPI also answers 429 after repeated calls with an invalid key. **Solution:** Slow down and retry with exponential backoff (e.g. 1 s, 2 s, 4 s). If it persists, check that your key is valid."
          },
          "500": {
            "description": "Internal Server Error - An unexpected error on our side. **Solution:** Retry once. If it persists, contact data@techmap.io with the full request URL (without your key).",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Response500"
                }
              }
            }
          },
          "503": {
            "description": "Service Unavailable - The search backend is temporarily unavailable. **Solution:** Retry later with exponential backoff.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Response503"
                }
              }
            }
          },
          "509": {
            "description": "Bandwidth Limit Exceeded - The response would be larger than 6 MB. **Solution:** Request a more compact `format` or narrow the query.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Response509"
                }
              }
            }
          }
        },
        "x-codeSamples": [
          {
            "lang": "Shell",
            "label": "curl",
            "source": "curl --request GET \\\n  --url 'https://daily-international-job-postings.p.rapidapi.com/api/v2/meta/jobs/distinct?field=workPlace' \\\n  --header 'X-RapidAPI-Key: YOUR_API_KEY' \\\n  --header 'X-RapidAPI-Host: daily-international-job-postings.p.rapidapi.com'"
          },
          {
            "lang": "Python",
            "label": "Python",
            "source": "import requests\n\nurl = \"https://daily-international-job-postings.p.rapidapi.com/api/v2/meta/jobs/distinct\"\nparams = {\"field\": \"workPlace\"}\nheaders = {\n    \"X-RapidAPI-Key\": \"YOUR_API_KEY\",\n    \"X-RapidAPI-Host\": \"daily-international-job-postings.p.rapidapi.com\",\n}\n\nresponse = requests.get(url, params=params, headers=headers, timeout=30)\nresponse.raise_for_status()\nprint(response.json())"
          },
          {
            "lang": "JavaScript",
            "label": "JavaScript",
            "source": "// Node.js 18+ or browser\nconst url = new URL('https://daily-international-job-postings.p.rapidapi.com/api/v2/meta/jobs/distinct');\nurl.search = new URLSearchParams({ 'field': 'workPlace' });\n\nconst response = await fetch(url, {\n  headers: {\n    'X-RapidAPI-Key': 'YOUR_API_KEY',\n    'X-RapidAPI-Host': 'daily-international-job-postings.p.rapidapi.com',\n  },\n});\nif (!response.ok) throw new Error(`${response.status}: ${await response.text()}`);\nconsole.log(await response.json());"
          },
          {
            "lang": "Java",
            "label": "Java",
            "source": "// Java 11+\nimport java.net.URI;\nimport java.net.http.HttpClient;\nimport java.net.http.HttpRequest;\nimport java.net.http.HttpResponse;\n\npublic class TechmapExample {\n    public static void main(String[] args) throws Exception {\n        HttpRequest request = HttpRequest.newBuilder()\n            .uri(URI.create(\"https://daily-international-job-postings.p.rapidapi.com/api/v2/meta/jobs/distinct?field=workPlace\"))\n            .header(\"X-RapidAPI-Key\", \"YOUR_API_KEY\")\n            .header(\"X-RapidAPI-Host\", \"daily-international-job-postings.p.rapidapi.com\")\n            .GET()\n            .build();\n        HttpResponse<String> response = HttpClient.newHttpClient()\n            .send(request, HttpResponse.BodyHandlers.ofString());\n        if (response.statusCode() != 200) throw new RuntimeException(response.statusCode() + \": \" + response.body());\n        System.out.println(response.body());\n    }\n}"
          }
        ]
      }
    },
    "/api/v2/meta/jobs/statistics": {
      "get": {
        "operationId": "statistics",
        "tags": [
          "Metadata"
        ],
        "summary": "Get value statistics of a field",
        "description": "Use this endpoint to see how job postings are distributed over the values of a field (count and percentage per value). For a single number, use count. This endpoint returns a list of statistics of field values for the given query parameter. The response is per default a simple JSON object containing a list of keys usable as query parameter values, the count of jobs with this field value, and the percentage of jobs with this value. With the format parameter other output formats can be requested. <h3>Notes</h3> <ul> <li> This endpoint is not included in every plan (see <i>Errors &amp; billing</i>). Without it, the response is <b>403</b> with <code>requiredPlan</code> and <code>pricingUrl</code>. </li> <br /> <li> The results are capped at 100 values and are calculated from job postings within the last month (i.e., current date minus 1 month). </li> </ul> <br /> <h3>Usage Examples</h3> <p>Statistics on the workPlace field:</p>\n `/api/v2/meta/jobs/statistics?field=workPlace`</p> <p>Statistics on the industry field:</p>\n `/api/v2/meta/jobs/statistics?field=industry`</p> ",
        "externalDocs": {
          "description": "Documentation of this endpoint",
          "url": "https://api.techmap.io/jobs-api/statistics"
        },
        "parameters": [
          {
            "$ref": "#/components/parameters/FieldParam"
          },
          {
            "$ref": "#/components/parameters/Format"
          }
        ],
        "responses": {
          "200": {
            "description": "Success - indicating a correct query execution with results",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/GetFieldStatisticsResponse"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request - A parameter value could not be parsed, e.g. an unknown `countryCode`, an invalid date or `sort` value. **Solution:** Check the value against the parameter description. The `message` names the invalid parameter.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Response400"
                }
              }
            }
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Response401"
                }
              }
            },
            "description": "Unauthorized - The key is missing or invalid, or the request was sent directly to the backend instead of RapidAPI. **Solution:** Send your key in the header `X-RapidAPI-Key` and use the base URL `https://daily-international-job-postings.p.rapidapi.com`. Copy the key again from the RapidAPI listing if it was rotated."
          },
          "403": {
            "description": "Forbidden - Either you are not subscribed to this API (\"You are not subscribed to this API.\"), or the endpoint is not included in your plan (e.g. `/api/v2/meta/jobs/distinct` and `/api/v2/meta/jobs/statistics` need at least the Pro plan). **Solution:** Subscribe to the Basic plan, or upgrade to the plan named in `requiredPlan`. The response contains `message`, `requiredPlan` and `pricingUrl`.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Response403"
                }
              }
            }
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Response404"
                }
              }
            },
            "description": "Not Found - The endpoint path does not exist (typo, wrong API version) or a required search parameter is missing, or the requested `field` does not exist. **Solution:** Check the path and add at least one search parameter (e.g. `countryCode`). The `message` lists the allowed parameters or fields."
          },
          "405": {
            "description": "Method Not Allowed - Another HTTP method than GET was used. **Solution:** Use GET.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Response405"
                }
              }
            }
          },
          "429": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Response429"
                }
              }
            },
            "description": "Too Many Requests - Too many requests in a short time window (rate limit of your RapidAPI plan, e.g. 1 request/second on Basic). This is **not** a monthly limit - the plans have no hard limit, extra requests are billed as overage. RapidAPI also answers 429 after repeated calls with an invalid key. **Solution:** Slow down and retry with exponential backoff (e.g. 1 s, 2 s, 4 s). If it persists, check that your key is valid."
          },
          "500": {
            "description": "Internal Server Error - An unexpected error on our side. **Solution:** Retry once. If it persists, contact data@techmap.io with the full request URL (without your key).",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Response500"
                }
              }
            }
          },
          "503": {
            "description": "Service Unavailable - The search backend is temporarily unavailable. **Solution:** Retry later with exponential backoff.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Response503"
                }
              }
            }
          },
          "509": {
            "description": "Bandwidth Limit Exceeded - The response would be larger than 6 MB. **Solution:** Request a more compact `format` or narrow the query.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Response509"
                }
              }
            }
          }
        },
        "x-codeSamples": [
          {
            "lang": "Shell",
            "label": "curl",
            "source": "curl --request GET \\\n  --url 'https://daily-international-job-postings.p.rapidapi.com/api/v2/meta/jobs/statistics?field=industry' \\\n  --header 'X-RapidAPI-Key: YOUR_API_KEY' \\\n  --header 'X-RapidAPI-Host: daily-international-job-postings.p.rapidapi.com'"
          },
          {
            "lang": "Python",
            "label": "Python",
            "source": "import requests\n\nurl = \"https://daily-international-job-postings.p.rapidapi.com/api/v2/meta/jobs/statistics\"\nparams = {\"field\": \"industry\"}\nheaders = {\n    \"X-RapidAPI-Key\": \"YOUR_API_KEY\",\n    \"X-RapidAPI-Host\": \"daily-international-job-postings.p.rapidapi.com\",\n}\n\nresponse = requests.get(url, params=params, headers=headers, timeout=30)\nresponse.raise_for_status()\nprint(response.json())"
          },
          {
            "lang": "JavaScript",
            "label": "JavaScript",
            "source": "// Node.js 18+ or browser\nconst url = new URL('https://daily-international-job-postings.p.rapidapi.com/api/v2/meta/jobs/statistics');\nurl.search = new URLSearchParams({ 'field': 'industry' });\n\nconst response = await fetch(url, {\n  headers: {\n    'X-RapidAPI-Key': 'YOUR_API_KEY',\n    'X-RapidAPI-Host': 'daily-international-job-postings.p.rapidapi.com',\n  },\n});\nif (!response.ok) throw new Error(`${response.status}: ${await response.text()}`);\nconsole.log(await response.json());"
          },
          {
            "lang": "Java",
            "label": "Java",
            "source": "// Java 11+\nimport java.net.URI;\nimport java.net.http.HttpClient;\nimport java.net.http.HttpRequest;\nimport java.net.http.HttpResponse;\n\npublic class TechmapExample {\n    public static void main(String[] args) throws Exception {\n        HttpRequest request = HttpRequest.newBuilder()\n            .uri(URI.create(\"https://daily-international-job-postings.p.rapidapi.com/api/v2/meta/jobs/statistics?field=industry\"))\n            .header(\"X-RapidAPI-Key\", \"YOUR_API_KEY\")\n            .header(\"X-RapidAPI-Host\", \"daily-international-job-postings.p.rapidapi.com\")\n            .GET()\n            .build();\n        HttpResponse<String> response = HttpClient.newHttpClient()\n            .send(request, HttpResponse.BodyHandlers.ofString());\n        if (response.statusCode() != 200) throw new RuntimeException(response.statusCode() + \": \" + response.body());\n        System.out.println(response.body());\n    }\n}"
          }
        ]
      }
    }
  },
  "security": [
    {
      "X-RapidAPI-Key": []
    },
    {
      "rapidapi-key": []
    }
  ]
}