{
  "openapi": "3.0.1",
  "info": {
    "title": "Remote Jobs API — RemoteOK, WWR, Himalayas & 4 More",
    "description": "Seven remote job boards in one normalized feed: RemoteOK, Remotive, We Work Remotely, Himalayas, Jobicy, Working Nomads and Arbeitnow. Deduplicated across boards with an alsoOn list, full descriptions at no surcharge, filters applied before the charge, monitor mode for new jobs only. No API key.",
    "version": "0.1",
    "x-build-id": "ZCKbnHxLZAqbh8J8i"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/insight.solutions~remote-jobs-api/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-insight.solutions-remote-jobs-api",
        "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/insight.solutions~remote-jobs-api/runs": {
      "post": {
        "operationId": "runs-sync-insight.solutions-remote-jobs-api",
        "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/insight.solutions~remote-jobs-api/run-sync": {
      "post": {
        "operationId": "run-sync-insight.solutions-remote-jobs-api",
        "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": {
          "boards": {
            "title": "Boards",
            "type": "array",
            "description": "Which remote job boards to read. All seven produce the same columns, so a run over all of them is one table. Note the two small ones: Remotive's public feed is about 15 jobs, and We Work Remotely's is the newest ~10 per category. Arbeitnow is a European aggregator where roughly 4% of postings are remote — it still contributes, and the rows you do not get are free.",
            "items": {
              "type": "string",
              "enum": [
                "remoteok",
                "remotive",
                "weworkremotely",
                "himalayas",
                "jobicy",
                "workingnomads",
                "arbeitnow"
              ],
              "enumTitles": [
                "RemoteOK (newest ~100)",
                "Remotive (whole public feed, ~15)",
                "We Work Remotely (newest ~10 per category)",
                "Himalayas (104,000+, paged)",
                "Jobicy (up to 200 per run)",
                "Working Nomads (50)",
                "Arbeitnow (250 per page, ~4% remote)"
              ]
            },
            "default": [
              "remoteok",
              "remotive",
              "weworkremotely",
              "himalayas",
              "jobicy",
              "workingnomads",
              "arbeitnow"
            ]
          },
          "keywords": {
            "title": "Keywords",
            "type": "array",
            "description": "Only jobs whose title, tags or category contain one of these (case-insensitive substring, any of them matches). Applied before you are charged, so jobs that do not match cost you nothing.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "monitor": {
            "title": "Monitor mode (new jobs only)",
            "type": "boolean",
            "description": "Return only postings this Actor has never returned before. Put it on a schedule and every run after the first is a short list of genuinely new jobs. The first run records a baseline and charges for no rows at all.",
            "default": false
          },
          "maxJobs": {
            "title": "Max jobs per board",
            "minimum": 0,
            "maximum": 100000,
            "type": "integer",
            "description": "Stop each board after this many **matching** jobs. Jobs your filters excluded do not count toward it, so a narrow keyword keeps paging rather than stopping at the first page read. `0` means every job the filters allow.",
            "default": 100
          },
          "remoteOnly": {
            "title": "Remote only",
            "type": "boolean",
            "description": "Keep only postings flagged remote. Six of the seven boards are remote-only by construction, so this only bites on Arbeitnow — where it drops roughly 96% of what is read, for free.",
            "default": true
          },
          "deduplicate": {
            "title": "Deduplicate across boards",
            "type": "boolean",
            "description": "Collapse the same posting found on more than one board into one row, with the others listed in `alsoOn`. You are charged once for it instead of three times. Two postings from the *same* board that share a company and a title are never collapsed — those are two requisitions.",
            "default": true
          },
          "keywordsMatchDescription": {
            "title": "Match keywords in the description too",
            "type": "boolean",
            "description": "Extend `keywords` to the full posting text and the board's excerpt. Off by default: matching a body mention of \"Python\" would return jobs that are not Python jobs.",
            "default": false
          },
          "excludeKeywords": {
            "title": "Exclude keywords",
            "type": "array",
            "description": "Drop jobs containing any of these. Searched over the title, tags, category *and* the description — a word you want to avoid is worth avoiding wherever it appears.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "categories": {
            "title": "Categories",
            "type": "array",
            "description": "Only jobs in these categories, matched against each board's own category names and tags, e.g. `[\"Software Development\"]`, `[\"Design\"]`, `[\"Customer Support\"]`. On We Work Remotely this also picks which category feed is fetched, which is the only way to see more than ten of anything there.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "tags": {
            "title": "Tags",
            "type": "array",
            "description": "Only jobs carrying one of these tags, e.g. `[\"python\"]`, `[\"react\"]`. The first entry is also sent to RemoteOK as its `?tag=` parameter, which returns a genuinely different set of jobs from the untagged feed.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "locations": {
            "title": "Locations",
            "type": "array",
            "description": "Only jobs open to these places. Free text, matched against the board's own location line, the countries it names and its remote regions — `[\"USA\"]`, `[\"Worldwide\"]`, `[\"Europe\"]`, `[\"Germany\"]`. The first entry is also sent to Jobicy as its `geo` filter when it maps onto one.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "timezones": {
            "title": "Timezones (UTC offsets)",
            "type": "array",
            "description": "Only jobs the employer will hire across one of these UTC offsets, e.g. `[-5, -6]` for US Eastern and Central. **Himalayas is the only board that publishes this**, so setting it restricts the run to Himalayas rows in practice.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "employmentTypes": {
            "title": "Employment types",
            "type": "array",
            "description": "Only these contract types. A board that publishes no employment-type field (Working Nomads) can never match this filter.",
            "items": {
              "type": "string",
              "enum": [
                "FullTime",
                "PartTime",
                "Contract",
                "Temporary",
                "Internship",
                "Volunteer",
                "Other"
              ],
              "enumTitles": [
                "Full time",
                "Part time",
                "Contract or freelance",
                "Temporary or fixed term",
                "Internship",
                "Volunteer",
                "Other"
              ]
            },
            "default": []
          },
          "seniority": {
            "title": "Seniority",
            "type": "array",
            "description": "Only these bands. Himalayas and Jobicy publish their own; everywhere else it is derived from the job title, and a title that says nothing has no band and cannot match.",
            "items": {
              "type": "string",
              "enum": [
                "intern",
                "entry",
                "mid",
                "senior",
                "staff",
                "principal",
                "lead",
                "manager",
                "director",
                "vp",
                "executive"
              ],
              "enumTitles": [
                "Intern",
                "Entry / junior",
                "Mid",
                "Senior",
                "Staff",
                "Principal",
                "Lead",
                "Manager",
                "Director",
                "VP",
                "Executive"
              ]
            },
            "default": []
          },
          "companies": {
            "title": "Companies",
            "type": "array",
            "description": "Only jobs at these employers (case-insensitive substring on the company name).",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "excludeCompanies": {
            "title": "Exclude companies",
            "type": "array",
            "description": "Drop jobs at these employers. Useful for filtering out staffing agencies that post the same role across every board.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "salaryMin": {
            "title": "Minimum salary (USD per year)",
            "minimum": 0,
            "type": "integer",
            "description": "Only jobs whose published pay clears this, compared against the top of the range. Hourly and monthly rates are converted for the comparison only — the salary columns always hold exactly what the board published. A job with no published salary cannot clear a floor and is dropped when you set one.",
            "default": 0
          },
          "salaryOnly": {
            "title": "Only jobs with a published salary",
            "type": "boolean",
            "description": "Drop every job the board published no pay information for. Three of the seven boards publish structured salary; Remotive publishes free text. The other three publish none, so this filter silences them.",
            "default": false
          },
          "postedSince": {
            "title": "Posted since",
            "type": "string",
            "description": "Only jobs posted since this point: an ISO date (`2026-09-01`) or a relative window (`48h`, `7d`, `4w`). A job with no posting date cannot be shown to be inside the window and is dropped.",
            "default": ""
          },
          "includeDescription": {
            "title": "Include the full description",
            "type": "boolean",
            "description": "Add the full posting body to every row. **There is no surcharge**: every one of the seven feeds embeds the description in its list response, so this costs no extra request and no extra charge. It is off by default only because it makes the dataset several times larger.",
            "default": false
          },
          "descriptionFormat": {
            "title": "Description format",
            "enum": [
              "text",
              "markdown",
              "html"
            ],
            "type": "string",
            "description": "How to render the posting body. `text` and `markdown` fill `descriptionText`; `html` fills `descriptionHtml` with sanitized markup. Recruiter names, mailboxes and profile links are removed in every format.",
            "default": "text"
          },
          "maxJobsTotal": {
            "title": "Max jobs in total",
            "minimum": 0,
            "maximum": 200000,
            "type": "integer",
            "description": "Cap the whole run after the cross-board dedupe. `0` means no cap. Applied to the freshest rows first.",
            "default": 0
          },
          "firstRunBehavior": {
            "title": "First monitor run",
            "enum": [
              "baseline-only",
              "emit-all"
            ],
            "type": "string",
            "description": "`baseline-only` records what is out there and charges for nothing — the first run of a schedule costs the start fee and stops. `emit-all` returns and charges for everything it finds, like a normal bulk run, and then monitors from there.",
            "default": "baseline-only"
          },
          "stateRetentionDays": {
            "title": "State retention (days)",
            "minimum": 1,
            "maximum": 365,
            "type": "integer",
            "description": "How long the monitor remembers a posting. A job that falls out of the window and is still listed will be reported as new again. 45 days covers the life of almost every remote posting.",
            "default": 45
          },
          "arbeitnowMaxPages": {
            "title": "Arbeitnow page limit",
            "minimum": 1,
            "maximum": 20,
            "type": "integer",
            "description": "*(Advanced)* How many 250-row Arbeitnow pages to read. Each page is about 2 MB and yields roughly ten remote jobs, which is why the default is low.",
            "default": 2
          },
          "himalayasMaxPages": {
            "title": "Himalayas page limit",
            "minimum": 1,
            "maximum": 100,
            "type": "integer",
            "description": "*(Advanced)* How many 20-row Himalayas pages to read. Himalayas is the deep board — it holds 100,000+ postings — so this is the lever for a big run.",
            "default": 10
          },
          "stateStoreName": {
            "title": "State store name",
            "type": "string",
            "description": "The named key-value store holding what the monitor has already seen. One per watchlist: two schedules with different filters want two stores. Letters, digits and hyphens, 3–63 characters.",
            "default": "remote-jobs-api-state"
          },
          "maxConcurrency": {
            "title": "Boards in parallel",
            "minimum": 1,
            "maximum": 7,
            "type": "integer",
            "description": "*(Advanced)* How many boards to read at once. Never more than one request at a time against any one board.",
            "default": 4
          },
          "maxRunSecs": {
            "title": "Time budget (seconds)",
            "minimum": 30,
            "maximum": 3600,
            "type": "integer",
            "description": "*(Advanced)* Wall-clock budget for the whole run. A board not finished in time gets a free `timeout` diagnostic and the rows already read are kept.",
            "default": 240
          },
          "requestTimeoutSecs": {
            "title": "Request timeout (seconds)",
            "minimum": 5,
            "maximum": 120,
            "type": "integer",
            "description": "*(Advanced)* How long one request to a board may take before it is given up on. The default of 20 seconds clears every board measured here; raise it only if a slow board keeps ending in a free `timeout` diagnostic.",
            "default": 20
          },
          "proxyConfiguration": {
            "title": "Proxy",
            "type": "object",
            "description": "Every board here answered through Apify's datacenter proxy and with no proxy at all, so the cheap default is the right one. Switch to residential only if a board starts refusing your runs.",
            "default": {
              "useApifyProxy": true
            }
          }
        }
      },
      "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
                  }
                }
              },
              "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}