{
  "openapi": "3.0.1",
  "info": {
    "title": "WeWorkRemotely Scraper - Remote Jobs, Salaries & Companies",
    "description": "Extract current remote job listings from weworkremotely.com. Use keyword search or WWR feed, category, and remote-jobs URLs. Returns clean job rows with title, company, category, region, tags, salary text, description matches, and filtered structured output.",
    "version": "0.1",
    "x-build-id": "p8cg2A01d3QQzcjbB"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/abotapi~we-work-remotely-jobs-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-abotapi-we-work-remotely-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/abotapi~we-work-remotely-jobs-scraper/runs": {
      "post": {
        "operationId": "runs-sync-abotapi-we-work-remotely-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/abotapi~we-work-remotely-jobs-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-abotapi-we-work-remotely-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": {
          "mode": {
            "title": "Input mode",
            "enum": [
              "keyword",
              "url"
            ],
            "type": "string",
            "description": "Keyword search filters live WWR job feeds by search terms. URL list reads WWR feed, category, or remote-jobs URLs. Precedence: the selected mode decides which source is used; the other mode's field (Start URLs or Keyword search terms) is ignored.",
            "default": "keyword"
          },
          "startUrls": {
            "title": "We Work Remotely URLs",
            "type": "array",
            "description": "Accepts WWR RSS feeds, category pages (with or without .rss), the main remote jobs page, search URLs (the term becomes a keyword filter) and job posting URLs (matched by job slug across the feeds).",
            "default": [
              {
                "url": "https://weworkremotely.com/remote-jobs.rss"
              },
              {
                "url": "https://weworkremotely.com/categories/remote-design-jobs.rss"
              },
              {
                "url": "https://weworkremotely.com/categories/remote-programming-jobs"
              },
              {
                "url": "https://weworkremotely.com/categories/remote-devops-sysadmin-jobs.rss"
              },
              {
                "url": "https://weworkremotely.com/categories/remote-full-stack-programming-jobs"
              }
            ],
            "items": {
              "type": "object",
              "required": [
                "url"
              ],
              "properties": {
                "url": {
                  "type": "string",
                  "title": "URL of a web page",
                  "format": "uri"
                }
              }
            }
          },
          "searchTerms": {
            "title": "Keyword search terms",
            "type": "array",
            "description": "Search terms to match in current remote job listings. Left empty with no category chosen, the run searches the example term python instead of stopping; that example run never saves or expires Incremental mode state.",
            "items": {
              "type": "string"
            }
          },
          "categories": {
            "title": "Categories",
            "type": "array",
            "description": "Restrict keyword search to selected WWR categories. Leave empty or choose All categories to scan all supported category feeds.",
            "items": {
              "type": "string",
              "enum": [
                "all",
                "programming",
                "front-end-programming",
                "back-end-programming",
                "full-stack-programming",
                "design",
                "customer-support",
                "sales-and-marketing",
                "product",
                "devops-and-sysadmin",
                "management-and-finance",
                "all-other-remote-jobs"
              ],
              "enumTitles": [
                "All categories",
                "Programming",
                "Front-End Programming",
                "Back-End Programming",
                "Full-Stack Programming",
                "Design",
                "Customer Support",
                "Sales and Marketing",
                "Product",
                "DevOps and Sysadmin",
                "Management and Finance",
                "All other remote jobs"
              ]
            },
            "default": [
              "all"
            ]
          },
          "regions": {
            "title": "Region filters",
            "type": "array",
            "description": "Only keep listings whose region contains one of these values. Examples: Anywhere in the World, United States, Europe.",
            "items": {
              "type": "string"
            }
          },
          "includeDetails": {
            "title": "Include full description fields",
            "type": "boolean",
            "description": "When enabled, each row includes full description HTML and cleaned description text.",
            "default": true
          },
          "maxItems": {
            "title": "Max items",
            "minimum": 1,
            "maximum": 100000,
            "type": "integer",
            "description": "Maximum number of matching job rows to save. The run can return fewer rows when the selected keywords and filters match fewer current listings.",
            "default": 20
          },
          "sort": {
            "title": "Sort by",
            "enum": [
              "feed",
              "newest",
              "company"
            ],
            "type": "string",
            "description": "Order of the saved rows, applied after the filters and before Max items. Feed order is the site's own order. With incremental mode on, the sort orders only the rows returned in this run.",
            "default": "feed"
          },
          "results_wanted": {
            "title": "Results wanted (alias of Max items)",
            "minimum": 1,
            "type": "integer",
            "description": "Alias of Max items; when set it wins."
          },
          "search_urls": {
            "title": "Search URLs (alias)",
            "type": "array",
            "description": "Alias input: We Work Remotely URLs (search, category, feed or job URLs). When set the actor runs in URL list mode with these URLs.",
            "items": {
              "type": "string"
            }
          },
          "category": {
            "title": "Category (alias)",
            "enum": [
              "all",
              "remote-full-stack-programming-jobs",
              "remote-front-end-programming-jobs",
              "remote-back-end-programming-jobs",
              "remote-programming-jobs",
              "remote-design-jobs",
              "remote-devops-sysadmin-jobs",
              "remote-management-and-finance-jobs",
              "remote-product-jobs",
              "remote-customer-support-jobs",
              "remote-sales-and-marketing-jobs",
              "all-other-remote-jobs"
            ],
            "type": "string",
            "description": "Alias of Categories for a single category, using the remote-*-jobs feed names. Keyword mode then runs without search terms."
          },
          "postedWithinDays": {
            "title": "Posted within days",
            "minimum": 0,
            "maximum": 3650,
            "type": "integer",
            "description": "Only keep jobs posted within this many days. Leave empty for no date filter."
          },
          "requireSalary": {
            "title": "Require salary",
            "type": "boolean",
            "description": "Only keep rows where a salary hint was found in the listing text.",
            "default": false
          },
          "requireCompanyWebsite": {
            "title": "Require company website",
            "type": "boolean",
            "description": "Only keep rows with a company website URL.",
            "default": false
          },
          "requireApplyUrl": {
            "title": "Require apply URL",
            "type": "boolean",
            "description": "Only keep rows with an apply URL.",
            "default": false
          },
          "minDescriptionLength": {
            "title": "Minimum description length",
            "minimum": 0,
            "maximum": 100000,
            "type": "integer",
            "description": "Only keep rows whose cleaned description text has at least this many characters."
          },
          "proxy": {
            "title": "Proxy configuration",
            "type": "object",
            "description": "Uses Apify Proxy by default with the standard datacenter pool. Adjust only if your run environment needs a different route."
          },
          "resumeFromRunId": {
            "title": "Resume from a previous run (optional)",
            "type": "string",
            "description": "ID of a previous run of this actor (or a dataset ID). Jobs already collected by that run (matched by job id) are skipped, so this run returns only the remainder, a delta. Combine both runs' datasets for the full set. Use this when a run was aborted, timed out, or stopped early at its Max items cap before every selected feed was read. Leave empty for a normal fresh run. For recurring daily monitoring of the same search, use Incremental mode below instead."
          },
          "incrementalMode": {
            "title": "Incremental changes for scheduled runs",
            "type": "boolean",
            "description": "Turn this on for daily or recurring monitoring. The first run returns all matching jobs as NEW. Later runs normally return only NEW, UPDATED, and REAPPEARED jobs. Turn on \"Emit unchanged\" or \"Emit expired\" only when you also want those jobs returned (and billed). Jobs are compared on every output field except scrapedAt, postedAgeDays, expiresInDays and isExpired (always excluded because they change with the clock) and anything you list in \"Ignore fields when detecting changes\". State is kept separately per search/URL, filter, and detail-mode setup; use State key to name or deliberately share a monitoring campaign. To continue one specific interrupted run instead, use Resume from a previous run above.",
            "default": false
          },
          "stateKey": {
            "title": "State key (optional, incremental mode only)",
            "type": "string",
            "description": "Optional. Name this monitoring campaign to keep its state stable, or to deliberately share state across differently-configured runs. Leave empty to let the actor derive a key automatically from the search/URL, filters, and detail settings: different searches then never mix state with each other. With your own State key and Incremental mode on, keyword mode needs a search term or a category: with neither, the run stops with an input message and collects nothing."
          },
          "emitUnchanged": {
            "title": "Emit unchanged jobs (incremental mode only)",
            "type": "boolean",
            "description": "Off by default. Turn on to also return jobs that have not changed since the last run, marked UNCHANGED. This returns (and bills) extra rows you already have, so leave it off unless you specifically want the full snapshot every run.",
            "default": false
          },
          "emitExpired": {
            "title": "Emit expired jobs (incremental mode only)",
            "type": "boolean",
            "description": "Off by default. Turn on to also return jobs that were present in a previous run but are no longer found in the feed, marked EXPIRED. Only produced once a run has fetched and fully scanned every requested feed, not when Max items capped it and not when Resume from a previous run was used (a resumed run deliberately skips jobs, so it cannot tell missing from already collected). This returns (and bills) extra synthetic rows, so leave it off unless you need expiry tracking.",
            "default": false
          },
          "ignoreFieldsForChanges": {
            "title": "Ignore fields when detecting changes (incremental mode only)",
            "type": "array",
            "description": "Incremental mode only. Field names (for example title, or a dotted path such as salary.min) whose changes do NOT make a job UPDATED and are left out of changedFields. The fields stay in the output. Always excluded already: scrapedAt, postedAgeDays, expiresInDays and isExpired, which change with the clock rather than with the posting. Changing this list never causes a wave of UPDATED rows.",
            "items": {
              "type": "string"
            }
          },
          "mcpConnectors": {
            "title": "Pipe results into your apps (optional)",
            "type": "array",
            "description": "Optionally send the scraped jobs into the apps you already use, via Model Context Protocol (MCP) connectors. Authorize a connector once under Apify → Settings → API & Integrations, then select it here. Notion gets a rich page-per-job export; other connectors receive a best-effort write/digest. Leave empty to skip; this never changes the dataset output. Supported: Notion (https://mcp.notion.com/mcp), Linear (https://mcp.linear.app/sse), Airtable (https://mcp.airtable.com/mcp), Apify (https://mcp.apify.com)."
          },
          "notionParentPageUrl": {
            "title": "Notion parent page",
            "type": "string",
            "description": "URL (or id) of the Notion page under which job pages are created. Required to enable the Notion export; ignored by other connectors."
          },
          "maxNotifyListings": {
            "title": "Max jobs to export per connector",
            "minimum": 1,
            "maximum": 1000,
            "type": "integer",
            "description": "Cap on how many jobs are written to each selected connector per run. Does not affect the dataset.",
            "default": 50
          }
        }
      },
      "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}