{
  "openapi": "3.0.1",
  "info": {
    "title": "RemoteOK Jobs Scraper [Only $0.99💰] [/w EMAILS]",
    "description": "Scrape the FULL RemoteOK board — 1,000+ live remote jobs, not the API's newest 100 — with complete descriptions, salary ranges, tags, benefits, and geo eligibility. Opt-in employer contact emails turn jobs into leads. Filter by tag, keyword, country, salary. $0.99/1K. JSON, CSV, Excel",
    "version": "1.0",
    "x-build-id": "N42dSSQaENS27aCU5"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/memo23~remoteok-jobs-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-memo23-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/memo23~remoteok-jobs-scraper/runs": {
      "post": {
        "operationId": "runs-sync-memo23-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/memo23~remoteok-jobs-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-memo23-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": {
          "startUrls": {
            "title": "Start URLs",
            "type": "array",
            "description": "Full remoteok.com URLs to crawl. Mix listing and job-detail URLs in the same array.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "tag": {
            "title": "Tag",
            "type": "string",
            "description": "RemoteOK tag matched against each job's rendered tag chips, e.g. `dev`, `python`, `design`, `machine learning`. **Matched client-side over the full board** — verified: RemoteOK has no working server-side tag filter (tag boards interleave unrelated jobs), so the actor scans everything and keeps only real chip matches. Merged with the Tags filter below. Ignored if Start URLs is non-empty.",
            "default": ""
          },
          "searchKeyword": {
            "title": "Search keyword",
            "type": "string",
            "description": "Keyword filter matched **client-side** over title + company + industry + location (RemoteOK's own `?search=` barely filters server-side, so the actor scans the full board and matches exactly). Every word must match, e.g. `senior engineer` keeps only jobs matching both. For skill tags (`python`, `react`), use the **Tags filter** instead — RemoteOK auto-tags some listings with 40+ generic tags, so tag matching is a separate, deliberate filter. Non-matching rows are never counted toward Maximum items.",
            "default": ""
          },
          "minSalary": {
            "title": "Minimum salary (USD/year)",
            "minimum": 0,
            "type": "integer",
            "description": "Drives RemoteOK's server-side `?min_salary=N` filter AND a client-side check on the parsed salary range. **Permissive**: jobs without a listed salary are NOT dropped. Leave 0 for no filter.",
            "default": 0
          },
          "countries": {
            "title": "Country filter",
            "type": "array",
            "description": "Post-filter on `applicantCountries[]` — keeps jobs open to workers from at least ONE of the listed countries. RemoteOK stores full names (`United States`, `Europe`, `Latin America`); common ISO-2 codes (`US`, `GB`, `DE`, …) are accepted too. Jobs marked `Anywhere`/`Worldwide` always pass. Leave empty for no filter.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "tagsFilter": {
            "title": "Tags filter",
            "type": "array",
            "description": "Post-filter on the job's `tags[]` — keeps jobs carrying ANY of these tags (case-insensitive substring, e.g. `python`, `senior`, `crypto`). The Tag field above merges into this list. Leave empty for no filter.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "jobTypes": {
            "title": "Job types filter",
            "type": "array",
            "description": "Post-filter on `employmentType[]`. Common values: `FULL_TIME`, `PART_TIME`, `CONTRACT`, `INTERNSHIP` (spelling like `Full-Time` works too). Empty = no filter.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "timeFilter": {
            "title": "Time filter (posted within)",
            "enum": [
              "",
              "24h",
              "7d",
              "30d",
              "90d"
            ],
            "type": "string",
            "description": "Post-filter on `postedDate`. Returns only jobs posted within the selected window.",
            "default": ""
          },
          "includeDetailPages": {
            "title": "Fetch detail pages (slower, adds ogImage)",
            "type": "boolean",
            "description": "**OFF (default)** — emit complete rows straight from the board listing. Fast and cheap: the whole ~1,000-job board costs ~21 requests. All fields are populated except `ogImage`.\n\n**ON** — additionally fetch every job's detail page (~1 request per job). Same schema plus `ogImage`; row content is otherwise identical, so leave this off unless you need it.",
            "default": false
          },
          "includeDescription": {
            "title": "Include description fields",
            "type": "boolean",
            "description": "When **off**, the actor drops `description`, `descriptionHtml`, and `descriptionText` from every row. Useful when you only need the metadata + apply URL and want a smaller dataset.",
            "default": true
          },
          "cleanHtml": {
            "title": "Clean HTML (plain-text only)",
            "type": "boolean",
            "description": "When **on**, only the plain-text `description` is emitted (taken from our normalised `descriptionText`); the HTML variants (`description` with markup, `descriptionHtml`) are stripped. Ignored when `includeDescription` is off.",
            "default": false
          },
          "enrichEmails": {
            "title": "Enrich with employer contact emails (experimental, billed per email)",
            "type": "boolean",
            "description": "If enabled, tries to find a contact email for each employer by discovering the company's website (Clearbit) and reading its contact/about pages. Adds contactEmail + contactWebsite columns plus a detailed emailEnrichment object. Best-effort, billed per contact email found; only charged when an email is returned, never for misses.",
            "default": false
          },
          "maxItems": {
            "title": "Maximum items to scrape",
            "minimum": 1,
            "type": "integer",
            "description": "Hard cap on the number of jobs collected. The live RemoteOK board holds ~1,000 jobs; filtered-out rows never count toward this cap. Use it to control billing.",
            "default": 1000
          },
          "maxConcurrency": {
            "title": "Max concurrency",
            "minimum": 1,
            "type": "integer",
            "description": "Maximum number of parallel HTTP tasks (detail pages and email-enrichment lookups).",
            "default": 10
          },
          "minConcurrency": {
            "title": "Min concurrency",
            "minimum": 1,
            "type": "integer",
            "description": "Minimum number of parallel HTTP tasks.",
            "default": 1
          },
          "maxRequestRetries": {
            "title": "Max request retries",
            "minimum": 0,
            "type": "integer",
            "description": "Number of retries before a failed request is given up.",
            "default": 5
          },
          "proxy": {
            "title": "Proxy configuration (optional override)",
            "type": "object",
            "description": "Leave empty — the actor already routes all traffic through its own built-in residential proxy at no extra cost to you. Only set this if you want to use your own proxies."
          }
        }
      },
      "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}