{
  "openapi": "3.0.1",
  "info": {
    "title": "Company Jobs Feed: Greenhouse, Lever & Ashby",
    "description": "Live, open jobs from companies' own Greenhouse, Lever and Ashby boards via official public APIs (no login, no proxies). Age, long-open and repost signals, filters, change tracking, de-dup, MCP. $0.99 per 1,000 jobs. Pairs with the Competitor Change Tracker to watch hiring and pricing together.",
    "version": "1.0",
    "x-build-id": "3jT52VTeXGQKkq9g0"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/fairquery~company-jobs-feed/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-fairquery-company-jobs-feed",
        "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/fairquery~company-jobs-feed/runs": {
      "post": {
        "operationId": "runs-sync-fairquery-company-jobs-feed",
        "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/fairquery~company-jobs-feed/run-sync": {
      "post": {
        "operationId": "run-sync-fairquery-company-jobs-feed",
        "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": {
          "companies": {
            "title": "Companies",
            "type": "array",
            "description": "Company names, domains (ramp.com) or board URLs (https://jobs.lever.co/palantir). Seeded companies and board URLs resolve for free; others use discovery (see below). Max 200.",
            "items": {
              "type": "string"
            }
          },
          "boards": {
            "title": "Boards (explicit)",
            "type": "array",
            "description": "Exact boards: [{\"ats\":\"greenhouse|lever|ashby\",\"slug\":\"...\"}], or strings like \"ashby:ramp\" or board URLs. Optional company/domain per board. Max 500."
          },
          "useSeedList": {
            "title": "Scan the verified starter list",
            "type": "boolean",
            "description": "Add every board from the shipped starter list (51 verified company boards) so you can search them without bringing your own list. Each board is billed as one board scanned.",
            "default": false
          },
          "discover": {
            "title": "Discover boards for unknown companies",
            "type": "boolean",
            "description": "For a company that is not a board URL or in the starter list: read up to 3 pages of its own website (only where robots.txt allows) for links to a supported ATS, then try up to 6 slug probes on the documented APIs. Results are cached for 30 days; cached lookups are free.",
            "default": true
          },
          "titleIncludes": {
            "title": "Title includes (any)",
            "type": "array",
            "description": "Keep jobs whose title contains any of these words or phrases (case-insensitive, whole words: \"engineer\" does not match \"Engineering\").",
            "items": {
              "type": "string"
            }
          },
          "titleExcludes": {
            "title": "Title excludes (any)",
            "type": "array",
            "description": "Drop jobs whose title contains any of these words.",
            "items": {
              "type": "string"
            }
          },
          "titleRegex": {
            "title": "Title regex",
            "type": "string",
            "description": "Optional case-insensitive regular expression the title must match (max 200 characters, no nested quantifiers)."
          },
          "locations": {
            "title": "Locations (any)",
            "type": "array",
            "description": "Substring match on the job's location text, e.g. \"new york\", \"berlin\". \"remote\" also matches jobs the ATS flags as remote.",
            "items": {
              "type": "string"
            }
          },
          "countries": {
            "title": "Countries (ISO-2, any)",
            "type": "array",
            "description": "ISO-2 codes like US, DE, GB. Uses the ATS's structured country where it has one (Lever, Ashby), otherwise a small place-name list on the location text (country_basis says which). Jobs with no country information are dropped when this is set.",
            "items": {
              "type": "string"
            }
          },
          "remote": {
            "title": "Remote",
            "enum": [
              "any",
              "only",
              "exclude"
            ],
            "type": "string",
            "description": "only = remote jobs only; exclude = drop remote jobs. Uses the ATS's remote flag where present, otherwise the location text (remote_basis says which).",
            "default": "any"
          },
          "companyFilter": {
            "title": "Company name contains (any)",
            "type": "array",
            "description": "Keep only jobs whose company name or board slug contains any of these (useful with the starter list).",
            "items": {
              "type": "string"
            }
          },
          "departments": {
            "title": "Departments / teams (any)",
            "type": "array",
            "description": "Substring match on department or team, e.g. \"engineering\", \"sales\".",
            "items": {
              "type": "string"
            }
          },
          "employmentTypes": {
            "title": "Employment types (any)",
            "type": "array",
            "description": "Substring match on employment type, e.g. \"full time\", \"contract\", \"intern\".",
            "items": {
              "type": "string"
            }
          },
          "postedWithinDays": {
            "title": "Posted within (days)",
            "minimum": 1,
            "maximum": 3650,
            "type": "integer",
            "description": "Keep jobs whose ATS publish date (posted_at) is at most this many days ago. Jobs without a publish date are dropped unless 'Include unknown posted date' is on."
          },
          "includeUnknownPostedDate": {
            "title": "Include unknown posted date",
            "type": "boolean",
            "description": "With 'Posted within', also keep jobs whose ATS gives no publish date.",
            "default": false
          },
          "maxAgeDays": {
            "title": "Max age (days)",
            "minimum": 1,
            "maximum": 3650,
            "type": "integer",
            "description": "Drop jobs older than this. Age = now − posted_at, or now − first_seen_at when the ATS has no date (age_basis)."
          },
          "hasSalary": {
            "title": "Only jobs with published pay",
            "type": "boolean",
            "description": "Keep only jobs where the ATS publishes compensation (mainly Ashby and some Lever boards).",
            "default": false
          },
          "excludeStale": {
            "title": "Exclude stale signals",
            "type": "boolean",
            "description": "Drop jobs flagged long_open (older than 'Long-open threshold') or reposted. These are heuristics, not proof either way.",
            "default": false
          },
          "longOpenDays": {
            "title": "Long-open threshold (days)",
            "minimum": 1,
            "maximum": 3650,
            "type": "integer",
            "description": "A job older than this is flagged long_open.",
            "default": 60
          },
          "onlyNew": {
            "title": "Only new or changed jobs",
            "type": "boolean",
            "description": "Return only jobs that are new or changed since the last tracked run with the same state store (plus free 'closed' rows). The first run is the baseline: everything is new.",
            "default": false
          },
          "trackChanges": {
            "title": "Track history",
            "type": "boolean",
            "description": "Keep per-board history (first_seen_at, last_seen_at, closed and repost detection) in a named key-value store in your account. Turn off to store nothing; history fields then describe this run only.",
            "default": true
          },
          "emitClosed": {
            "title": "Emit closed rows",
            "type": "boolean",
            "description": "When tracking, emit one free row (change: closed) for each job that was open last run and is gone from a complete fetch now.",
            "default": true
          },
          "stateStoreName": {
            "title": "State store name",
            "type": "string",
            "description": "Named key-value store for history and the discovery cache. Use a different name per saved search/monitor.",
            "default": "fairquery-jobs-feed-state"
          },
          "dedupe": {
            "title": "De-duplication",
            "enum": [
              "exact",
              "role",
              "none"
            ],
            "type": "string",
            "description": "exact = one row per ats+board+job id; role = also merge one board's rows with the same title + department into one row listing all locations (merged rows are free); none = no de-duplication. Every row carries a fingerprint and duplicate_of; nothing is silently dropped across boards.",
            "default": "exact"
          },
          "includeDescription": {
            "title": "Description",
            "enum": [
              "none",
              "text"
            ],
            "type": "string",
            "description": "text = plain-text job description (up to 20,000 characters).",
            "default": "none"
          },
          "scrubPII": {
            "title": "Scrub e-mails and phone numbers",
            "type": "boolean",
            "description": "Remove e-mail addresses and phone numbers (e.g. recruiter contacts) from descriptions.",
            "default": true
          },
          "confirmOpen": {
            "title": "Re-check each job (detail endpoint)",
            "enum": [
              "none",
              "detail"
            ],
            "type": "string",
            "description": "detail = re-fetch each emitted job from the ATS's documented per-job endpoint (Greenhouse, Lever; Ashby has none). A 404 marks it closed. $0.00029 per re-check; off by default because the board listing is already the employer's live list.",
            "default": "none"
          },
          "maxOpenChecks": {
            "title": "Max re-checks",
            "minimum": 1,
            "maximum": 2000,
            "type": "integer",
            "description": "Cap on detail re-checks per run.",
            "default": 200
          },
          "maxJobs": {
            "title": "Max jobs",
            "minimum": 1,
            "maximum": 50000,
            "type": "integer",
            "description": "Stop after this many job rows (the main cost driver: $0.99 per 1,000).",
            "default": 5000
          },
          "maxJobsPerBoard": {
            "title": "Max jobs read per board",
            "minimum": 1,
            "maximum": 20000,
            "type": "integer",
            "description": "Safety cap on postings read from one board. A truncated board skips closed detection.",
            "default": 10000
          }
        }
      },
      "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}