{
  "openapi": "3.0.1",
  "info": {
    "title": "Himalayas Remote Jobs API: Salary, Seniority, Country Filters",
    "description": "Remote job listings from the free Himalayas jobs API: title, company, employment type, seniority, country and timezone restrictions, salary normalised to a yearly figure, posting date, age in days and apply link. Filter by keyword, country, seniority, contract type, company or pay. UTC dates.",
    "version": "0.1",
    "x-build-id": "cRceFB9KXNAotDafv"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/yadroo~himalayas-remote-jobs/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-yadroo-himalayas-remote-jobs",
        "x-openai-isConsequential": false,
        "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
        "tags": [
          "Run Actor"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/inputSchema"
              }
            }
          }
        },
        "parameters": [
          {
            "name": "token",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Enter your Apify token here"
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/acts/yadroo~himalayas-remote-jobs/runs": {
      "post": {
        "operationId": "runs-sync-yadroo-himalayas-remote-jobs",
        "x-openai-isConsequential": false,
        "summary": "Executes an Actor and returns information about the initiated run in response.",
        "tags": [
          "Run Actor"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/inputSchema"
              }
            }
          }
        },
        "parameters": [
          {
            "name": "token",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Enter your Apify token here"
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/runsResponseSchema"
                }
              }
            }
          }
        }
      }
    },
    "/acts/yadroo~himalayas-remote-jobs/run-sync": {
      "post": {
        "operationId": "run-sync-yadroo-himalayas-remote-jobs",
        "x-openai-isConsequential": false,
        "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
        "tags": [
          "Run Actor"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/inputSchema"
              }
            }
          }
        },
        "parameters": [
          {
            "name": "token",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Enter your Apify token here"
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    }
  },
  "components": {
    "schemas": {
      "inputSchema": {
        "type": "object",
        "properties": {
          "mode": {
            "title": "What to fetch",
            "enum": [
              "search",
              "feed"
            ],
            "type": "string",
            "description": "Two jobs, one per run. `search` asks the board's search for jobs matching `query` and the filters below. `feed` walks the whole board newest first and ignores `query`, `countries`, `seniority`, `employmentTypes`, `companies`, `timezoneOffset` and `sort` on the source side - this actor still applies every one of them to the rows it reads, in both modes. Use `feed` with `sinceHours` and `onlyNew` to mirror everything posted since the last run.",
            "default": "search"
          },
          "query": {
            "title": "Keyword",
            "type": "string",
            "description": "Free text the board searches in job titles, descriptions and categories: a language (`python`), a role (`product designer`), a skill (`kubernetes`) or a tool. Sent to the source as typed, so its own matching decides what counts as a hit. May be left empty when at least one filter below is set - `countries: ['Germany']` with `seniority: ['Senior']` is a valid run on its own. Ignored in `feed` mode."
          },
          "countries": {
            "title": "Countries you can hire in or work from",
            "maxItems": 10,
            "type": "array",
            "description": "Country names or two-letter ISO codes: `United States`, `us`, `Germany`, `DE`. Case, spacing and common spellings are accepted (`USA`, `UK`, `Czech Republic`); an unknown value is refused with the closest names, because a wrong country returns the wrong market. A posting names the countries its employer can hire in, so this filter means \"a candidate there may take the job\". Several countries are asked for one after another and merged, the value that found each row going to `requestedCountry`.",
            "items": {
              "type": "string"
            }
          },
          "worldwideOnly": {
            "title": "Only jobs open worldwide",
            "type": "boolean",
            "description": "Keep only postings with no country restriction at all - the ones anybody anywhere may apply for. Useful for job boards and newsletters outside the usual hiring countries. Cannot be combined with `excludeWorldwide`.",
            "default": false
          },
          "excludeWorldwide": {
            "title": "Drop jobs open worldwide",
            "type": "boolean",
            "description": "The opposite filter: keep only postings that name countries, so every row really is restricted to the countries you asked for. Set this when you build a country report and the worldwide postings would blur it.",
            "default": false
          },
          "seniority": {
            "title": "Seniority",
            "type": "array",
            "description": "The levels the board assigns to a posting; one job can carry several of them, so a row matches when any of its levels is one you asked for. Several values are combined with OR. The platform refuses any value outside the six above before the run starts, so write them exactly as listed.",
            "items": {
              "type": "string",
              "enum": [
                "Entry-level",
                "Mid-level",
                "Senior",
                "Manager",
                "Director",
                "Executive"
              ],
              "enumTitles": [
                "Entry-level - graduates and juniors",
                "Mid-level",
                "Senior",
                "Manager - people management",
                "Director",
                "Executive - C-level and VP"
              ]
            }
          },
          "employmentTypes": {
            "title": "Employment types",
            "type": "array",
            "description": "Contract type as the board records it - one value per posting, written to the `employmentType` column. Several values are combined with OR; leave empty for every type. The platform refuses any other value before the run starts, so the spelling with the capital letters and the space (`Full Time`) is the one to send.",
            "items": {
              "type": "string",
              "enum": [
                "Full Time",
                "Part Time",
                "Contractor",
                "Temporary",
                "Intern",
                "Volunteer",
                "Other"
              ],
              "enumTitles": [
                "Full Time",
                "Part Time",
                "Contractor - freelance and B2B contracts",
                "Temporary",
                "Intern",
                "Volunteer",
                "Other"
              ]
            }
          },
          "companies": {
            "title": "Company slugs",
            "maxItems": 20,
            "type": "array",
            "description": "Watch named employers instead of the whole market: `canonical`, `gitlab`, `automattic`. A slug is the short name in the job URL (`.../companies/canonical/jobs/...`) and it is written to every row as `companySlug`, so one run tells you the slugs to reuse. Sent to the source as typed and matched exactly - a company name with spaces or capitals (`Canonical Ltd`) is not a slug and finds nothing, which the run reports in its status message.",
            "items": {
              "type": "string"
            }
          },
          "timezoneOffset": {
            "title": "Timezone offset the job allows (UTC hours)",
            "minimum": -12,
            "maximum": 14,
            "type": "number",
            "description": "Keep jobs whose working hours cover this UTC offset: `-5` for US east coast, `1` for central Europe, `5.5` for India, `6` for Kazakhstan. Postings that list no timezone restriction are kept as well, because they put no limit on you. Half-hour and quarter-hour offsets are allowed, as the source uses them (`-9.5`, `5.75`). The offsets a posting allows are written to `timezoneOffsets`."
          },
          "sort": {
            "title": "Order of the results",
            "enum": [
              "recent",
              "relevant",
              "salaryDesc",
              "salaryAsc"
            ],
            "type": "string",
            "description": "Which jobs you see first when `maxItems` cuts the answer. Newest first is the default, because it makes repeat runs and `sinceHours` predictable; `relevant` is the source's own keyword ranking; the salary orders put the postings that publish a figure in front, which is the fastest way to fill a run with paid-up roles. Only used in `search` mode - `feed` is always newest first.",
            "default": "recent"
          },
          "onlyWithSalary": {
            "title": "Only jobs that publish a salary",
            "type": "boolean",
            "description": "Drop postings with no figure. About four postings in ten publish pay on the newest-first feed and more on a narrow search, so this filter shrinks a run - combine it with `sort: 'salaryDesc'` so the paid-up rows arrive first instead of being hunted page by page.",
            "default": false
          },
          "salaryCurrency": {
            "title": "Salary currency",
            "type": "string",
            "description": "Three-letter ISO 4217 code of the currency the figure must be in: `USD`, `EUR`, `GBP`, `PLN`. Case does not matter. Needed whenever you compare pay, because the board publishes salaries in the employer's own currency and this actor applies no exchange rates. A code the source never uses simply returns no rows, and the run says so."
          },
          "minAnnualSalary": {
            "title": "Minimum yearly salary",
            "minimum": 0,
            "type": "number",
            "description": "Keep postings whose upper salary figure, converted to a yearly amount, is at least this much - `salaryMaxAnnual` in the row. Pay in a shorter or longer period is annualised first (hourly x 2080, daily x 260, weekly x 52, fortnightly x 26, monthly x 12, quarterly x 4), which is what makes a pay filter possible at all on a board that mixes the periods. No currency conversion happens, so set `salaryCurrency` too or you are comparing euros with forints."
          },
          "sinceHours": {
            "title": "Only jobs posted in the last N hours",
            "minimum": 1,
            "maximum": 8760,
            "type": "number",
            "description": "Freshness window counted from the run's start in UTC: `24` for the last day, `168` for the last week. Paging stops once the source hands out postings older than the window in the newest-first orders (`recent` and `feed` mode), so a scheduled hourly run stays cheap. In the other orders it filters the rows instead. Note the board refreshes about once a day, so a window under 24 hours can legitimately come back empty."
          },
          "includeExpired": {
            "title": "Include postings past their expiry date",
            "type": "boolean",
            "description": "The source publishes an expiry date with every posting and keeps some of them in the feed after that date. They are dropped by default, because an advert nobody can apply for is noise in a job board or an alert. Switch on for market history, and tell the rows apart by `isExpired` and `expiresAt`.",
            "default": false
          },
          "onlyNew": {
            "title": "Skip jobs seen in earlier runs",
            "type": "boolean",
            "description": "Remember the job URLs this run writes in the actor's key-value store and, on the next run of the same actor or task, write only postings that were not written before. Made for scheduled watching - a keyword, a country or a company - so each run holds just what appeared since. The memory is kept per actor or task, so two tasks watching two keywords do not interfere.",
            "default": false
          },
          "parentCategories": {
            "title": "Job families",
            "maxItems": 10,
            "type": "array",
            "description": "Broad families the board groups roles into, matched case-insensitively against the `parentCategories` column of each row: `Developer`, `Operations`, `Design`, `Marketing`, `Sales`, `Customer Support`, `Finance`, `Data`. The source has no filter for them, so the actor applies this one to the rows after fetching - it narrows what you pay for, not how much is fetched. A value that matched nothing is named in the run's status message, so you can fix it with the words you see in the column.",
            "items": {
              "type": "string"
            }
          },
          "descriptionFormat": {
            "title": "Job description in the row",
            "enum": [
              "text",
              "html",
              "none"
            ],
            "type": "string",
            "description": "The full advert is several kilobytes of HTML. Plain text is the default because that is what models, search indexes and spreadsheets can use; `html` keeps the markup for a site that renders it; `none` leaves both columns empty and keeps a 1000-row dataset small. The short `excerpt` is always filled either way.",
            "default": "text"
          },
          "maxItems": {
            "title": "Maximum rows",
            "minimum": 1,
            "maximum": 1000,
            "type": "number",
            "description": "Hard cap on the postings this run writes, and therefore on what it costs. Paging stops as soon as the cap is reached. The source hands out 20 jobs per request, so 1000 rows means at least 50 requests at a polite pace - keep scheduled runs small and let `onlyNew` or `sinceHours` do the narrowing.",
            "default": 50
          },
          "fields": {
            "title": "Only these columns",
            "type": "array",
            "description": "Keep only the named columns, in the order given - for example `title, companyName, salaryMaxAnnual, url`. Empty = every column. `title`, `companyName`, `url`, `postedAt`, `fetchedAt` and `sourceMode` are always present; name one of them here and it moves to the position you gave it. Unknown names are reported in the status message instead of being dropped in silence.",
            "items": {
              "type": "string"
            }
          }
        }
      },
      "runsResponseSchema": {
        "type": "object",
        "properties": {
          "data": {
            "type": "object",
            "properties": {
              "id": {
                "type": "string"
              },
              "actId": {
                "type": "string"
              },
              "userId": {
                "type": "string"
              },
              "startedAt": {
                "type": "string",
                "format": "date-time",
                "example": "2025-01-08T00:00:00.000Z"
              },
              "finishedAt": {
                "type": "string",
                "format": "date-time",
                "example": "2025-01-08T00:00:00.000Z"
              },
              "status": {
                "type": "string",
                "example": "READY"
              },
              "meta": {
                "type": "object",
                "properties": {
                  "origin": {
                    "type": "string",
                    "example": "API"
                  },
                  "userAgent": {
                    "type": "string"
                  }
                }
              },
              "stats": {
                "type": "object",
                "properties": {
                  "inputBodyLen": {
                    "type": "integer",
                    "example": 2000
                  },
                  "rebootCount": {
                    "type": "integer",
                    "example": 0
                  },
                  "restartCount": {
                    "type": "integer",
                    "example": 0
                  },
                  "resurrectCount": {
                    "type": "integer",
                    "example": 0
                  },
                  "computeUnits": {
                    "type": "integer",
                    "example": 0
                  }
                }
              },
              "options": {
                "type": "object",
                "properties": {
                  "build": {
                    "type": "string",
                    "example": "latest"
                  },
                  "timeoutSecs": {
                    "type": "integer",
                    "example": 300
                  },
                  "memoryMbytes": {
                    "type": "integer",
                    "example": 1024
                  },
                  "diskMbytes": {
                    "type": "integer",
                    "example": 2048
                  }
                }
              },
              "buildId": {
                "type": "string"
              },
              "defaultKeyValueStoreId": {
                "type": "string"
              },
              "defaultDatasetId": {
                "type": "string"
              },
              "defaultRequestQueueId": {
                "type": "string"
              },
              "buildNumber": {
                "type": "string",
                "example": "1.0.0"
              },
              "containerUrl": {
                "type": "string"
              },
              "usage": {
                "type": "object",
                "properties": {
                  "ACTOR_COMPUTE_UNITS": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATASET_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATASET_WRITES": {
                    "type": "integer",
                    "example": 0
                  },
                  "KEY_VALUE_STORE_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "KEY_VALUE_STORE_WRITES": {
                    "type": "integer",
                    "example": 1
                  },
                  "KEY_VALUE_STORE_LISTS": {
                    "type": "integer",
                    "example": 0
                  },
                  "REQUEST_QUEUE_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "REQUEST_QUEUE_WRITES": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATA_TRANSFER_INTERNAL_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATA_TRANSFER_EXTERNAL_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_SERPS": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_UNBLOCKER_UNITS": {
                    "type": "integer",
                    "example": 0
                  }
                }
              },
              "usageTotalUsd": {
                "type": "number",
                "example": 0.00005
              },
              "usageUsd": {
                "type": "object",
                "properties": {
                  "ACTOR_COMPUTE_UNITS": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATASET_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATASET_WRITES": {
                    "type": "integer",
                    "example": 0
                  },
                  "KEY_VALUE_STORE_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "KEY_VALUE_STORE_WRITES": {
                    "type": "number",
                    "example": 0.00005
                  },
                  "KEY_VALUE_STORE_LISTS": {
                    "type": "integer",
                    "example": 0
                  },
                  "REQUEST_QUEUE_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "REQUEST_QUEUE_WRITES": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATA_TRANSFER_INTERNAL_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATA_TRANSFER_EXTERNAL_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_SERPS": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_UNBLOCKER_UNITS": {
                    "type": "integer",
                    "example": 0
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}