{
  "openapi": "3.0.1",
  "info": {
    "title": "Recruitee Jobs by Company: Careers Site Offers API",
    "description": "Published offers of any company careers site on Recruitee, from its keyless offers endpoint: title, department, city, country, work model, employment type, experience level, weekly hours, tags, publish date and apply URL. A summary mode counts open jobs per department, city, country or tag.",
    "version": "0.1",
    "x-build-id": "Tj2pbNgWnbSdtBqfY"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/yadroo~recruitee-jobs/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-yadroo-recruitee-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~recruitee-jobs/runs": {
      "post": {
        "operationId": "runs-sync-yadroo-recruitee-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~recruitee-jobs/run-sync": {
      "post": {
        "operationId": "run-sync-yadroo-recruitee-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": [
          "companies"
        ],
        "properties": {
          "companies": {
            "title": "Careers sites",
            "type": "array",
            "description": "One or more careers-site slugs, e.g. `fastned`, `deephealth`, `nmbrs`. The slug is the label in front of `.recruitee.com` on the careers site — paste a whole careers-site or job URL (`https://fastned.recruitee.com/o/<job>`) and the slug is taken from it. Custom careers-site domains (`jobs.company.com`) hide the slug: open any job on that site, the apply page still carries the `<slug>.recruitee.com` host. One entry costs one request; a slug nobody publishes on answers 404 and becomes a single row with `found: false` instead of failing the run.",
            "items": {
              "type": "string"
            }
          },
          "mode": {
            "title": "What to return",
            "enum": [
              "jobs",
              "summary"
            ],
            "type": "string",
            "description": "`jobs` writes a row per published offer of every careers site. `summary` groups the same offers by the field chosen below and writes a count per value — the cheap way to see how a company is organised, where it hires and which codes its filters accept. Both modes read the same single request per careers site, so a summary never costs extra calls.",
            "default": "jobs"
          },
          "groupBy": {
            "title": "Group the summary by",
            "enum": [
              "department",
              "city",
              "country",
              "workModel",
              "employmentType",
              "category",
              "experienceLevel",
              "tag"
            ],
            "type": "string",
            "description": "Only used when *What to return* is `summary`. An offer open in three cities counts once per city; an offer with two tags counts once per tag. Offers where the field is empty are collected under the value `(unspecified)`, so the counts always add up to the board. The platform never documented the `employmentType`, `category` and `experienceLevel` vocabularies — grouping by them is how you read the codes a careers site really uses before you filter on them.",
            "default": "department"
          },
          "titleKeywords": {
            "title": "Job title contains any of",
            "type": "array",
            "description": "Keep an offer when its title contains at least one of these words, case-insensitive, e.g. [\"engineer\", \"scientist\"]. Empty = every published offer of the careers site.",
            "items": {
              "type": "string"
            }
          },
          "excludeTitleKeywords": {
            "title": "Job title must not contain",
            "type": "array",
            "description": "Drop an offer when its title contains any of these words, e.g. [\"intern\", \"open application\"]. Applied after *Job title contains any of*. Careers sites often keep a permanent \"Open Application\" offer online — this is how you leave it out.",
            "items": {
              "type": "string"
            }
          },
          "departments": {
            "title": "Department contains any of",
            "type": "array",
            "description": "Keep offers whose department contains one of these, case-insensitive, e.g. [\"Engineering\", \"Sales\"]. Departments are free text every company types itself, so run `summary` grouped by department once to read the exact list. Offers with no department are dropped by this filter.",
            "items": {
              "type": "string"
            }
          },
          "tags": {
            "title": "Tag is any of",
            "type": "array",
            "description": "Keep offers carrying one of these tags, matched in full and case-insensitive. Tags are optional labels the employer sets; many careers sites use none at all, so check with `summary` grouped by tag before you rely on this filter.",
            "items": {
              "type": "string"
            }
          },
          "locationContains": {
            "title": "Location contains any of",
            "type": "array",
            "description": "Keep offers whose city, state or country contains one of these, e.g. [\"Amsterdam\", \"London\", \"Suriname\"]. Matched against every location of an offer, 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 offers with a location in these countries by two-letter code, e.g. [\"NL\", \"US\", \"GB\"]. The code comes from the offer's own location record, so it is exact where *Location contains any of* is a text match. Every matched code of a row is listed in the output field `countryCodes`.",
            "items": {
              "type": "string"
            }
          },
          "workModel": {
            "title": "Remote, hybrid or on-site",
            "enum": [
              "any",
              "remote",
              "hybrid",
              "onsite",
              "unspecified"
            ],
            "type": "string",
            "description": "The source carries three separate flags per offer (remote, hybrid, on-site) instead of one boolean, so hybrid work is a value of its own here and not a guess. Employers who left all three flags off appear as `unspecified` — pick that value to find them, they are invisible to a plain remote/on-site split.",
            "default": "any"
          },
          "employmentTypes": {
            "title": "Employment type code contains any of",
            "type": "array",
            "description": "Keep offers whose employment-type code contains one of these, case-insensitive. Codes seen on live careers sites: `fulltime_permanent`, `fulltime_fixed_term`, `fulltime`, `parttime`, `contract`, `internship`, `freelance`. The platform documents no closed list, which is why this is a text match: `fulltime` keeps both fulltime codes. Run `summary` grouped by employment type to read the codes of your own list of companies.",
            "items": {
              "type": "string"
            }
          },
          "experienceLevels": {
            "title": "Experience level code contains any of",
            "type": "array",
            "description": "Keep offers whose experience code contains one of these, e.g. [\"entry_level\", \"mid_level\", \"experienced\", \"manager\", \"student\", \"doctorate\"]. Optional on the platform: part of the careers sites leave it empty, so use it to narrow a large board, not as your only filter.",
            "items": {
              "type": "string"
            }
          },
          "categories": {
            "title": "Category code contains any of",
            "type": "array",
            "description": "Keep offers whose job-family code contains one of these, e.g. [\"information_technology\", \"sales\", \"marketing\", \"internet\", \"finance\"]. Like the other codes this vocabulary is undocumented — `summary` grouped by category lists what your companies actually use.",
            "items": {
              "type": "string"
            }
          },
          "postedWithinDays": {
            "title": "Published within the last N days",
            "minimum": 1,
            "maximum": 3650,
            "type": "integer",
            "description": "Keep offers first published in the last N days — the \"who started hiring recently\" filter for hiring-signal and lead pipelines. The source gives the publish moment with a clock time in UTC, so short windows work as well. Empty = no age limit."
          },
          "onlyNew": {
            "title": "Only offers not seen before",
            "type": "boolean",
            "description": "Remember careers site and offer id in this actor's key-value store and write only offers 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 description and requirements",
            "type": "boolean",
            "description": "Add `descriptionHtml` and `requirementsHtml` (as the employer published them) plus `descriptionText` and `requirementsText` (tags stripped, entities decoded, blank lines kept) to every offer row. The texts arrive in the same request, so this costs no extra call — it only makes rows roughly twenty times larger, which is why it is off by default.",
            "default": false
          },
          "sortBy": {
            "title": "Sort rows by",
            "enum": [
              "publishedDesc",
              "publishedAsc",
              "titleAsc",
              "departmentAsc",
              "siteOrder"
            ],
            "type": "string",
            "description": "Order of the rows before *Max rows* cuts the list. With several careers sites the rows are sorted across all of them, after *Max rows per careers site* was applied. In `summary` mode 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 offers, a mid-size one 20-60; boards above a few hundred are rare on this platform.",
            "default": 50
          },
          "maxItemsPerCompany": {
            "title": "Max rows per careers site",
            "minimum": 1,
            "maximum": 2000,
            "type": "integer",
            "description": "Cap the rows taken from each careers site 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\", \"applyUrl\"]. 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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}