{
  "openapi": "3.0.1",
  "info": {
    "title": "RemoteOK Jobs Scraper: Salary, Tags, Descriptions",
    "description": "RemoteOK jobs scraper for the whole live Remote OK board, not just its API's 100 newest: title, company, salary, tags, locations, dates, apply link and full description. Filter by tag, country, salary, date and benefits, sort by salary, add older listings, send to a webhook.",
    "version": "0.1",
    "x-build-id": "ESxg1HgV0ph5RwgiU"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/deepmine~remoteok-jobs-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-deepmine-remoteok-jobs-scraper",
        "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/deepmine~remoteok-jobs-scraper/runs": {
      "post": {
        "operationId": "runs-sync-deepmine-remoteok-jobs-scraper",
        "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/deepmine~remoteok-jobs-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-deepmine-remoteok-jobs-scraper",
        "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": {
          "keywords": {
            "title": "🏷️ Tags or keywords",
            "type": "array",
            "description": "Remote OK tags or words to search for, one per line: python, react, design, customer support. Each is its own search, matched on the job's title, tags and description (role words like design or sales on the title and tags only). Leave empty for the latest jobs of every kind. You pay per job delivered.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "country": {
            "title": "📍 Open to candidates in",
            "type": "string",
            "description": "Optional. A country you live in (United States, Germany, India, Brazil...): keeps the jobs open to its residents, including jobs open worldwide and jobs for its region (Europe, LATAM, APAC, North America). Type Worldwide for only the jobs open to anyone, anywhere. Leave empty for every job."
          },
          "minSalary": {
            "title": "💰 Minimum salary (USD per year)",
            "minimum": 0,
            "type": "integer",
            "description": "Optional. Keep only jobs that list a salary whose top of range is at least this, per year (Remote OK lists pay in US dollars on most jobs). Jobs with no listed salary are left out. 0 means no salary filter.",
            "default": 0
          },
          "postedWithinDays": {
            "title": "📅 Posted within (days)",
            "minimum": 0,
            "maximum": 3650,
            "type": "integer",
            "description": "Keep only jobs posted in the last N days; older ones cost nothing. 0 means any date. Handy for a daily or weekly scheduled run.",
            "default": 0
          },
          "maxJobsPerKeyword": {
            "title": "💯 Max jobs per tag",
            "minimum": 0,
            "type": "integer",
            "description": "The jobs to keep per tag (or in all, with no tag): the best matches (title matches first), newest first. You pay per job, so this caps the cost per tag. 0 means every job. Default 100.",
            "default": 100
          },
          "sortBy": {
            "title": "↕️ Sort by",
            "enum": [
              "newest",
              "salary"
            ],
            "type": "string",
            "description": "Newest first, or the best-paid first (jobs with no listed salary after them).",
            "default": "newest"
          },
          "includeOlderJobs": {
            "title": "🗄️ Include older jobs Remote OK still lists",
            "type": "boolean",
            "description": "Remote OK keeps listing many jobs after their listing period ends (about 90 days), with their Apply button. Off: only the jobs inside their period. On: those older jobs too, newest first after the open ones (a broad search then reads up to ~1,000 jobs in about 30 s). Same price per job.",
            "default": false
          },
          "benefits": {
            "title": "🎁 Benefits",
            "type": "array",
            "description": "Optional. Keep only jobs whose text mentions every one of these words or phrases: equity, 401k, health insurance, 4 day week, async. Matched in the description and tags (Remote OK has no benefits field). Leave empty for every job.",
            "items": {
              "type": "string"
            }
          },
          "categories": {
            "title": "🗂️ Categories",
            "type": "array",
            "description": "Optional. Keep only jobs in these categories (the boards' own categories, in common words). Leave empty for every category.",
            "items": {
              "type": "string",
              "enum": [
                "Software Development",
                "Data & AI",
                "DevOps & IT",
                "Design",
                "Product",
                "Marketing",
                "Sales",
                "Customer Support",
                "Finance & Legal",
                "HR & Recruiting",
                "Writing & Content",
                "Operations",
                "Other"
              ]
            }
          },
          "employmentTypes": {
            "title": "Job types",
            "type": "array",
            "description": "Optional. Keep only these job types. A job whose board doesn't give its type (and whose title doesn't say, e.g. 'Contract') is left out. Leave empty for every type.",
            "items": {
              "type": "string",
              "enum": [
                "Full-time",
                "Part-time",
                "Contract",
                "Temporary",
                "Internship"
              ]
            }
          },
          "seniority": {
            "title": "Seniority",
            "type": "array",
            "description": "Optional. Keep only these levels, read from Remote OK's senior/junior tags or a clear title word (Senior, Lead, Junior, Director, VP); jobs with none are left out. Leave empty for every level.",
            "items": {
              "type": "string",
              "enum": [
                "Entry-level",
                "Mid-level",
                "Senior",
                "Manager",
                "Director",
                "Executive"
              ]
            }
          },
          "timezone": {
            "title": "Time zone",
            "type": "string",
            "description": "Optional UTC offset you work in, e.g. UTC-5, UTC+1, UTC+5:30. Keeps Himalayas jobs that accept it (the only board that lists time zones) and, from the other boards, only jobs open worldwide."
          },
          "maxResults": {
            "title": "Max results",
            "minimum": 1,
            "maximum": 100000,
            "type": "integer",
            "description": "Stop after this many jobs in total. You pay per job, so this caps the run's cost.",
            "default": 1000
          },
          "includeDescription": {
            "title": "Include job descriptions",
            "type": "boolean",
            "description": "The full job description as plain text. Same price either way; turn it off for smaller rows.",
            "default": true
          },
          "includeDescriptionHtml": {
            "title": "Include descriptions as HTML",
            "type": "boolean",
            "description": "Also the board's description as HTML (links and lists kept), in descriptionHtml. Same price; rows get about twice as big.",
            "default": false
          },
          "findContactEmails": {
            "title": "Find contact emails on company websites ($)",
            "type": "boolean",
            "description": "For jobs whose description gives no email, look for one on the company's own website (confirmed from the company's name). Charged per job that gets an email this way ($); emails a description gives are always free. Slower.",
            "default": false
          },
          "webhookUrl": {
            "title": "🔗 Webhook URL",
            "type": "string",
            "description": "Optional. At the end of the run, every job row is POSTed to this URL as JSON, 50 rows a request ({\"runId\", \"batch\", \"batches\", \"items\": [...]}). A receiver that fails is reported in the run summary; the jobs stay in the dataset."
          },
          "webhookSecret": {
            "title": "🔑 Webhook secret",
            "type": "string",
            "description": "Optional. Sent with each webhook request in the X-Scraper-Secret header."
          },
          "proxyConfiguration": {
            "title": "Proxy",
            "type": "object",
            "description": "Apify Proxy (datacenter) by default; the boards' feeds are public, so it only spreads the requests over several IPs. Residential and SERP proxies are replaced with datacenter. Turn it off to connect directly.",
            "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
                  },
                  "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}