{
  "openapi": "3.0.1",
  "info": {
    "title": "Workable Jobs by Company: ATS Career Page Postings API",
    "description": "Published jobs of any company hosted on Workable, read through the account's public jobs endpoint: title, department, function, city, state, country, remote flag, employment type, publish date, apply link and optional description. Two extra modes count open jobs per department and per location.",
    "version": "0.1",
    "x-build-id": "OGYF9piEFsALEwCKK"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/yadroo~workable-jobs/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-yadroo-workable-jobs",
        "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/yadroo~workable-jobs/runs": {
      "post": {
        "operationId": "runs-sync-yadroo-workable-jobs",
        "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/yadroo~workable-jobs/run-sync": {
      "post": {
        "operationId": "run-sync-yadroo-workable-jobs",
        "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",
        "required": [
          "accounts"
        ],
        "properties": {
          "accounts": {
            "title": "Career pages",
            "type": "array",
            "description": "One or more Workable account slugs, e.g. `devsinc-17`, `prox-works`, `wantable-careers`. The slug is the part after the host in a hosted career page URL (`apply.workable.com/<slug>/`) — paste the whole career page URL and the slug is taken from it. A link to a single job (`apply.workable.com/j/<code>`) carries no slug and is rejected with a message naming the slug form. Each entry costs one request; a slug the platform does not serve comes back as one row with `found: false` instead of failing the run.",
            "items": {
              "type": "string"
            }
          },
          "mode": {
            "title": "What to return",
            "enum": [
              "jobs",
              "departments",
              "locations"
            ],
            "type": "string",
            "description": "`jobs` writes a row per published job of every career page. `departments` and `locations` return the same company's own dictionaries with a job count each — the cheap way to see how a company is organised, where it hires, and which values the filters below accept. `jobs` costs one request per career page; the two dictionary modes add a small second one for the company name, because the dictionary endpoints answer a bare list.",
            "default": "jobs"
          },
          "titleKeywords": {
            "title": "Job title contains any of",
            "type": "array",
            "description": "Keep a job when its title contains at least one of these words, case-insensitive, e.g. [\"engineer\", \"designer\"]. Empty = every published job of the career page.",
            "items": {
              "type": "string"
            }
          },
          "excludeTitleKeywords": {
            "title": "Job title must not contain",
            "type": "array",
            "description": "Drop a job when its title contains any of these words, e.g. [\"intern\", \"volunteer\"]. Applied after *Job title contains any of*.",
            "items": {
              "type": "string"
            }
          },
          "departments": {
            "title": "Department contains any of",
            "type": "array",
            "description": "Keep jobs whose department contains one of these, case-insensitive, e.g. [\"Engineering\", \"Sales\"]. Departments are free text each company types itself, so run mode `departments` once to see the exact list of a career page. Jobs with no department are dropped by this filter.",
            "items": {
              "type": "string"
            }
          },
          "locationContains": {
            "title": "Location contains any of",
            "type": "array",
            "description": "Keep jobs whose city, state or country contains one of these, e.g. [\"Lahore\", \"Texas\", \"India\"]. Matched against every location of a job, so a posting open in three cities is kept when one of them matches.",
            "items": {
              "type": "string"
            }
          },
          "countryCodes": {
            "title": "Countries (ISO 3166-1 alpha-2)",
            "type": "array",
            "description": "Keep jobs in these countries by two-letter code, e.g. [\"US\", \"GB\", \"PK\"]. The code comes from the job's own location record, so it is exact where *Location contains any of* is a text match. Mode `locations` lists the codes a career page actually uses.",
            "items": {
              "type": "string"
            }
          },
          "workplace": {
            "title": "Remote or on-site",
            "enum": [
              "any",
              "remote",
              "onsite"
            ],
            "type": "string",
            "description": "The source carries one remote flag per job (`isRemote` in the output), set by the company. It has no separate hybrid value, so a hybrid job appears as remote or on-site depending on how the employer filled the form.",
            "default": "any"
          },
          "employmentTypes": {
            "title": "Employment types",
            "type": "array",
            "description": "Keep jobs of these employment types. Empty = all types, including jobs where the employer left the field blank; setting any value drops those blank ones, because the type is optional on the platform and many small companies skip it.",
            "items": {
              "type": "string",
              "enum": [
                "Full-time",
                "Part-time",
                "Contract",
                "Temporary",
                "Internship",
                "Other"
              ],
              "enumTitles": [
                "Full-time",
                "Part-time",
                "Contract",
                "Temporary",
                "Internship",
                "Other"
              ]
            }
          },
          "experienceLevels": {
            "title": "Experience levels",
            "type": "array",
            "description": "Keep jobs with these seniority values (`experienceLevel` in the output). Optional on the platform as well: only part of the career pages fill it, so use it to narrow a large board, not as your only filter.",
            "items": {
              "type": "string",
              "enum": [
                "Internship",
                "Entry level",
                "Associate",
                "Mid-Senior level",
                "Director",
                "Executive",
                "Not Applicable"
              ],
              "enumTitles": [
                "Internship",
                "Entry level",
                "Associate",
                "Mid-Senior level",
                "Director",
                "Executive",
                "Not Applicable"
              ]
            }
          },
          "postedWithinDays": {
            "title": "Published within the last N days",
            "minimum": 1,
            "maximum": 3650,
            "type": "integer",
            "description": "Keep jobs first published in the last N days — the \"who started hiring recently\" filter for hiring-signal and lead pipelines. The source gives the publish date without a clock time, so a day is the finest window it can answer. Empty = no age limit."
          },
          "onlyNew": {
            "title": "Only jobs not seen before",
            "type": "boolean",
            "description": "Remember career page and job code in this actor's key-value store and write only jobs that were not there on the previous run. The first run writes everything it finds, later runs write the openings that appeared since. Use it on a schedule to follow a list of companies without paying for the same rows twice.",
            "default": false
          },
          "includeDescription": {
            "title": "Include the job description",
            "type": "boolean",
            "description": "Add `descriptionHtml` (as the employer published it) and `descriptionText` (tags stripped, entities decoded, blank lines kept) to every job row. The descriptions arrive in the same request, so this costs no extra calls — it only makes rows about twenty times larger, which is why it is off by default.",
            "default": false
          },
          "sortBy": {
            "title": "Sort rows by",
            "enum": [
              "publishedDesc",
              "publishedAsc",
              "titleAsc",
              "departmentAsc",
              "pageOrder"
            ],
            "type": "string",
            "description": "Order of the rows before *Max rows* cuts the list. With several career pages the rows are sorted across all of them, after *Max rows per career page* was applied. In the dictionary modes the rows are ordered by job count, largest first.",
            "default": "publishedDesc"
          },
          "maxItems": {
            "title": "Max rows",
            "minimum": 1,
            "maximum": 5000,
            "type": "integer",
            "description": "Stop after this many rows in total. A small employer publishes 1-10 jobs, a mid-size one 30-100, the largest career pages a few hundred.",
            "default": 50
          },
          "maxItemsPerAccount": {
            "title": "Max rows per career page",
            "minimum": 1,
            "maximum": 2000,
            "type": "integer",
            "description": "Cap the rows taken from each career page before the global *Max rows*, so one big employer cannot fill the whole dataset when you watch a list of companies. Empty = no per-company cap."
          },
          "fields": {
            "title": "Output fields",
            "type": "array",
            "description": "Keep only these fields, in this order, e.g. [\"companyName\", \"title\", \"city\", \"url\"]. Empty = every field the mode produces.",
            "items": {
              "type": "string"
            }
          }
        }
      },
      "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}