{
  "openapi": "3.0.1",
  "info": {
    "title": "Remote Jobs Scraper: Remote OK & Jobicy + New Job Alerts",
    "description": "Remote jobs from Remote OK and Jobicy in one clean schema: salaries, where applicants may live, seniority, cross-board de-duplication and new/closed job tracking between runs. Board attribution built in, no personal-data fields. $1 per 1,000 jobs.",
    "version": "1.0",
    "x-build-id": "hp3CqegpOZxMqqdjD"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/fairfetch~remote-jobs-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-fairfetch-remote-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/fairfetch~remote-jobs-scraper/runs": {
      "post": {
        "operationId": "runs-sync-fairfetch-remote-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/fairfetch~remote-jobs-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-fairfetch-remote-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": {
          "sources": {
            "title": "Job boards",
            "type": "array",
            "description": "Boards to read; leave empty (or omit via API) for both. Remote OK: its newest ~100 jobs. Jobicy: every job published in the last 7 days (the largest feed). Jobicy allows one automated read per hour, so a run of your account less than 55 minutes after the last Jobicy read reuses it.",
            "items": {
              "type": "string",
              "enum": [
                "remoteok",
                "jobicy"
              ],
              "enumTitles": [
                "Remote OK",
                "Jobicy"
              ]
            },
            "default": [
              "remoteok",
              "jobicy"
            ]
          },
          "keywords": {
            "title": "Keywords (any of)",
            "type": "array",
            "description": "Keep jobs whose title contains at least one of these words (whole words, case-insensitive: \"python\" does not match \"pythonic\", \"go\" does not match \"Google\"). Board tags are not searched because Remote OK tags many jobs with unrelated words. Leave empty for all jobs.",
            "items": {
              "type": "string"
            }
          },
          "searchDescription": {
            "title": "Also search keywords in the job description",
            "type": "boolean",
            "description": "Match keywords in the job description too. Finds more jobs, but also jobs that only mention the word in passing.",
            "default": false
          },
          "excludeKeywords": {
            "title": "Exclude keywords",
            "type": "array",
            "description": "Drop jobs whose title or company contains any of these words, e.g. \"senior\", \"intern\" or a company name.",
            "items": {
              "type": "string"
            }
          },
          "categories": {
            "title": "Categories (any of)",
            "type": "array",
            "description": "One shared category list for both boards. Jobicy's category is mapped to it (the title decides within a combined one such as \"Marketing & Sales\"); Remote OK has no categories, so its jobs are categorised from the title. Jobs whose category can't be told are dropped by this filter. The board's own category is kept in sourceCategory.",
            "items": {
              "type": "string",
              "enum": [
                "Software Development",
                "DevOps & Sysadmin",
                "Data & AI",
                "Security",
                "QA & Testing",
                "Design",
                "Product",
                "Project Management",
                "Customer Support",
                "Marketing",
                "Sales & Business Development",
                "Writing & Content",
                "HR & Recruiting",
                "Finance & Accounting",
                "Legal & Compliance",
                "Healthcare",
                "Education",
                "Operations & Admin",
                "Other"
              ]
            }
          },
          "locations": {
            "title": "Where you can work from (any of)",
            "type": "array",
            "description": "Countries or regions applicants must be in, e.g. \"Germany\", \"United States\", \"Europe\", \"LATAM\" or \"Worldwide\". A job open to a region matches its countries (open to Europe matches Germany); names are matched as whole words (\"India\" doesn't match \"Indiana\"). Jobs whose eligibility is unknown (no location, or only an office city on Remote OK) are kept unless \"Strict filters\" is on.",
            "items": {
              "type": "string"
            }
          },
          "includeWorldwide": {
            "title": "Include jobs open worldwide",
            "type": "boolean",
            "description": "When you filter by location, also keep jobs that accept applicants from anywhere.",
            "default": true
          },
          "employmentTypes": {
            "title": "Employment types (any of)",
            "type": "array",
            "description": "Remote OK rarely publishes the type, so its jobs are kept unless \"Strict filters\" is on.",
            "items": {
              "type": "string",
              "enum": [
                "full-time",
                "part-time",
                "contract",
                "freelance",
                "internship",
                "temporary"
              ],
              "enumTitles": [
                "Full-time",
                "Part-time",
                "Contract",
                "Freelance",
                "Internship",
                "Temporary"
              ]
            }
          },
          "seniority": {
            "title": "Seniority (any of)",
            "type": "array",
            "description": "Taken from the job title (Senior, Staff, Lead, Head of, VP, Junior, Intern...) or the board's level where it is reliable. Jobs without a clear level are kept unless \"Strict filters\" is on.",
            "items": {
              "type": "string",
              "enum": [
                "intern",
                "junior",
                "mid",
                "senior",
                "lead",
                "director",
                "executive"
              ],
              "enumTitles": [
                "Intern",
                "Junior / entry level",
                "Mid level",
                "Senior",
                "Lead / Staff / Principal",
                "Director / Head of",
                "Executive (VP, C-level)"
              ]
            }
          },
          "minSalary": {
            "title": "Minimum yearly salary",
            "minimum": 0,
            "type": "integer",
            "description": "Keep jobs whose published maximum salary, as a yearly amount, is at least this much. Hourly pay counts x 2,080, monthly x 12; amounts without a published period are read by size (e.g. 25 as hourly). Only salaries in the currency below are compared (no exchange-rate conversion): jobs paying in another currency are dropped, jobs without a salary are kept unless \"Strict filters\" is on."
          },
          "minSalaryCurrency": {
            "title": "Salary currency",
            "enum": [
              "USD",
              "EUR",
              "GBP",
              "CAD",
              "AUD",
              "INR",
              "CHF"
            ],
            "type": "string",
            "description": "Currency of the minimum salary (ISO code).",
            "default": "USD"
          },
          "postedWithinDays": {
            "title": "Posted within the last N days",
            "minimum": 1,
            "maximum": 365,
            "type": "integer",
            "description": "Keep only jobs published in the last N days. Leave empty for no limit."
          },
          "strictFilters": {
            "title": "Strict filters",
            "type": "boolean",
            "description": "Drop jobs that don't publish the field you filter on (location, employment type, seniority, salary, posted date) instead of keeping them.",
            "default": false
          },
          "maxJobs": {
            "title": "Max jobs",
            "minimum": 0,
            "type": "integer",
            "description": "Maximum number of jobs returned (newest first). 0 = no limit. Closed jobs reported by change tracking don't count against it.",
            "default": 0
          },
          "includeDescription": {
            "title": "Include job description (clean text)",
            "type": "boolean",
            "description": "Add the full job description converted from HTML to plain text. E-mail addresses and phone numbers in common formats are replaced with [email removed] / [phone removed].",
            "default": true
          },
          "trackChanges": {
            "title": "Track new and closed jobs",
            "type": "boolean",
            "description": "Remember the jobs returned so far in a named key-value store in your account (remote-jobs-tracking). Later runs mark each job \"new\" or \"existing\" and return jobs that have closed since as \"closed\" (Jobicy: confirmed by Jobicy's status check; Remote OK: not available, its feed only shows the newest jobs). Schedule the Actor, e.g. daily, for job alerts.",
            "default": false
          },
          "onlyNew": {
            "title": "Return only new jobs (and closed ones)",
            "type": "boolean",
            "description": "With tracking, skip jobs already returned in an earlier run, so you only pay for what changed. The same job seen earlier on the other board is not new; a new posting on the same board is, even with the same title. The first run returns every job as new. Turns tracking on automatically.",
            "default": false
          },
          "reportClosed": {
            "title": "Report closed jobs",
            "type": "boolean",
            "description": "With tracking, also return jobs that closed since the previous run (status \"closed\"), whatever the current filters: every stored job matched the filters when it was returned.",
            "default": true
          },
          "trackingId": {
            "title": "Tracking ID",
            "pattern": "^[A-Za-z0-9_-]{1,60}$",
            "type": "string",
            "description": "Name of the tracking state. Runs with the same ID share what has been seen; use different IDs for independent alerts (e.g. one per filter set). Letters, numbers, \"-\" and \"_\".",
            "default": "default"
          },
          "requestTimeoutSecs": {
            "title": "Request timeout (seconds)",
            "minimum": 5,
            "maximum": 300,
            "type": "integer",
            "description": "Timeout for one HTTP request.",
            "default": 60
          },
          "maxRetries": {
            "title": "Max retries per request",
            "minimum": 0,
            "maximum": 8,
            "type": "integer",
            "description": "Retries for network errors, HTTP 429 and 5xx responses (exponential backoff, honours Retry-After).",
            "default": 4
          }
        }
      },
      "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}