{
  "openapi": "3.0.1",
  "info": {
    "title": "Job Board Hiring Signals: Greenhouse, Lever, Ashby",
    "description": "Find companies hiring for the tools you sell or support. Reads public Greenhouse, Lever and Ashby job boards, flags posts that mention your tools with the matching sentence as proof, and tracks changes week over week. Also returns clean, filtered job listings.",
    "version": "0.3",
    "x-build-id": "wsTal2vZcAZuP0M1x"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/propheto~job-board-hiring-signals/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-propheto-job-board-hiring-signals",
        "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/propheto~job-board-hiring-signals/runs": {
      "post": {
        "operationId": "runs-sync-propheto-job-board-hiring-signals",
        "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/propheto~job-board-hiring-signals/run-sync": {
      "post": {
        "operationId": "run-sync-propheto-job-board-hiring-signals",
        "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": "Mode",
            "enum": [
              "signals",
              "jobs"
            ],
            "type": "string",
            "description": "signals: flag job posts that mention the tools you list, with the matching sentence and a confidence score; weekly runs return only new or changed signals plus a per-company rollup. jobs: one normalized record per job post.",
            "default": "signals"
          },
          "boards": {
            "title": "Job boards",
            "type": "array",
            "description": "Boards as {\"ats\": \"greenhouse\" | \"lever\" | \"lever_eu\" | \"ashby\", \"token\": \"<board slug>\", \"companyName\": \"optional label\"}. The token is the last part of the public board URL, e.g. jobs.lever.co/<token>. Give boards here, in Companies, or both. Only Greenhouse, Lever and Ashby are supported. \"companyName\" is your display name: it is output as companyNameInput and never replaces the name the ATS returns."
          },
          "companies": {
            "title": "Companies (board URLs or slugs)",
            "type": "array",
            "description": "Board URLs or slugs. Supported URL forms: boards.greenhouse.io/<slug>, job-boards.greenhouse.io/<slug>, jobs.lever.co/<slug>, jobs.eu.lever.co/<slug>, jobs.ashbyhq.com/<slug> (and their API URLs). Other sites (Workday, company career pages, etc.) are not supported and are reported in the log and the summary. Items can also be objects: {\"url\" or \"slug\", \"platform\", \"companyName\"}.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "platform": {
            "title": "Platform for bare slugs",
            "enum": [
              "auto",
              "greenhouse",
              "lever",
              "lever_eu",
              "ashby"
            ],
            "type": "string",
            "description": "auto tries Greenhouse, then Lever, then Ashby, and uses the first board that exists (up to 3 requests per slug).",
            "default": "auto"
          },
          "discovery": {
            "title": "Discovery by company name",
            "type": "object",
            "description": "{\"enabled\": true, \"companyNames\": [\"Example Corp\"], \"maxProbesPerCompany\": 6}. Builds slug guesses (examplecorp, example-corp, …) and probes only the official board APIs; 404 = skip. No search engines, no HTML crawling.",
            "default": {
              "enabled": false,
              "companyNames": [],
              "maxProbesPerCompany": 6
            }
          },
          "tools": {
            "title": "Tools to detect",
            "type": "array",
            "description": "Signals mode. Built-in ids (salesforce, hubspot, snowflake, dbt, workday, looker, looker_studio, notion, go, ruby, excel, monday, asana, zendesk, jira, servicenow, marketo, netsuite, sap, oracle_ebs, tableau, power_bi, databricks, segment, gong, outreach, intercom) or any other name, which is matched as written (case-insensitive, word-boundary safe, e.g. C++, .NET, Node.js).",
            "default": [
              "snowflake",
              "dbt",
              "salesforce",
              "workday",
              "go"
            ],
            "items": {
              "type": "string"
            }
          },
          "toolAliases": {
            "title": "Extra aliases / overrides",
            "type": "object",
            "description": "{\"salesforce\": [\"SF CRM\"], \"mytool\": [\"MyTool\", \"MT Cloud\"], \"looker\": {\"contextRequired\": false}}. A list adds aliases; contextRequired=false turns off the context check for ambiguous names.",
            "default": {}
          },
          "requireAllTools": {
            "title": "Require all tools in the same post",
            "type": "boolean",
            "description": "Keep a post only if every listed tool matches it.",
            "default": false
          },
          "signalTypes": {
            "title": "Signal types",
            "type": "array",
            "description": "Empty = all. Options: replacing, migrating_from, migrating_to, implementing, experience_with, nice_to_have, mention.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "minConfidence": {
            "title": "Minimum confidence",
            "minimum": 0,
            "maximum": 1,
            "type": "number",
            "description": "0 to 1. Signals below this are dropped and not charged. Body-text mentions of ambiguous names score 0.48, so they need 0.45 or lower.",
            "default": 0.6
          },
          "outputLevel": {
            "title": "Output",
            "enum": [
              "both",
              "signals",
              "rollups"
            ],
            "type": "string",
            "description": "Which charged rows to output. A free summary row is always added.",
            "default": "both"
          },
          "onlyNewOrChanged": {
            "title": "Only new or changed signals",
            "type": "boolean",
            "description": "Compare with the previous run stored under State key and output only signals that are new, or whose post text or confidence changed (≥0.1). Turn off to output every current signal.",
            "default": true
          },
          "stateKey": {
            "title": "State key",
            "type": "string",
            "description": "Names the persistent store hiring-signals-state-{stateKey}. Use one fixed key per weekly schedule.",
            "default": "default"
          },
          "includeSelfPostings": {
            "title": "Include the tool vendor's own job posts",
            "type": "boolean",
            "description": "Off: drop matches where the employer is the vendor of the tool (e.g. Salesforce hiring for Salesforce).",
            "default": false
          },
          "removeRepeatedText": {
            "title": "Ignore text repeated across a company's posts",
            "type": "boolean",
            "description": "Signals mode. Skip sentences that appear in at least half of a company's posts (at least 3 posts; boards with 4+ posts), or in 25+ of its posts, when matching tools. Job rows and descriptions are not changed. See README.",
            "default": true
          },
          "keywords": {
            "title": "Keywords (title or description)",
            "type": "array",
            "description": "Phrases. Case-insensitive, whole words, words in this order and adjacent (spaces or hyphens between them; \"people systems\" does not match \"people, systems\").",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "keywordsMode": {
            "title": "Keywords match",
            "enum": [
              "any",
              "all"
            ],
            "type": "string",
            "description": "any = at least one keyword; all = every keyword.",
            "default": "any"
          },
          "keywordsIn": {
            "title": "Search keywords in",
            "enum": [
              "title_or_description",
              "title",
              "description"
            ],
            "type": "string",
            "description": "Where keywords and exclude keywords are looked for.",
            "default": "title_or_description"
          },
          "excludeKeywords": {
            "title": "Exclude keywords",
            "type": "array",
            "description": "Drop a job if ANY of these phrases is found (same matching rules and scope as Keywords).",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "locations": {
            "title": "Location contains",
            "type": "array",
            "description": "Case-insensitive substring of any location string as the ATS gives it. \"Remote\" also matches jobs where isRemoteDerived is true.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "remote": {
            "title": "Remote",
            "enum": [
              "any",
              "remote_only",
              "exclude_remote"
            ],
            "type": "string",
            "description": "Uses isRemoteDerived: true when the ATS workplace type is remote or a location string contains \"remote\". Hybrid alone is not remote.",
            "default": "any"
          },
          "departments": {
            "title": "Department or team contains",
            "type": "array",
            "description": "Case-insensitive substring match on department or team.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "lookbackDays": {
            "title": "Posted/updated in the last N days",
            "minimum": 0,
            "type": "integer",
            "description": "Uses updatedAt, falling back to postedAt (signals spec). Empty = 30 in signals mode, no limit in jobs mode. 0 = no limit. Jobs with no date are kept."
          },
          "postedAfter": {
            "title": "Posted on or after",
            "type": "string",
            "description": "Keep jobs whose postedAt is on/after this date. Absolute (YYYY-MM-DD) or relative (\"30 days\"). Jobs without postedAt are dropped when a posted date filter is set."
          },
          "postedBefore": {
            "title": "Posted before",
            "type": "string",
            "description": "Keep jobs whose postedAt is before this date, e.g. \"42 days\" finds roles still open after 6 weeks. Combine with Posted on or after for a date range."
          },
          "salaryMin": {
            "title": "Minimum yearly salary",
            "minimum": 0,
            "type": "integer",
            "description": "Keep jobs whose published yearly pay range reaches at least this amount (job max >= value). Uses only pay published by the ATS: Lever salaryRange and Ashby compensation. Greenhouse job lists carry no pay, so Greenhouse jobs count as unknown."
          },
          "salaryMax": {
            "title": "Maximum yearly salary",
            "minimum": 0,
            "type": "integer",
            "description": "Keep jobs whose published yearly pay range starts at or below this amount (job min <= value)."
          },
          "salaryCurrency": {
            "title": "Salary currency",
            "type": "string",
            "description": "3-letter code. Only pay in this currency is compared; nothing is converted.",
            "default": "USD"
          },
          "includeUnknownSalary": {
            "title": "Keep jobs with unknown salary",
            "type": "boolean",
            "description": "When a salary filter is set: keep jobs with no published yearly pay in that currency (hourly pay, other currencies, Greenhouse). Off = drop them.",
            "default": false
          },
          "experienceBands": {
            "title": "Experience bands (inferred)",
            "type": "array",
            "description": "Keep jobs whose inferred minimum years of experience falls in these bands: 0 (entry level / no experience), 1-2, 3-4, 5-7, 8-10, 11+. Bands do not overlap. Inferred from the post text; see README.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "includeUnknownExperience": {
            "title": "Keep jobs with unknown experience",
            "type": "boolean",
            "description": "When experience bands are set: keep jobs where no requirement could be read.",
            "default": false
          },
          "includeDescription": {
            "title": "Include description text",
            "type": "boolean",
            "description": "Jobs mode: add the plain-text description to each job record (larger dataset).",
            "default": false
          },
          "maxItems": {
            "title": "Max charged results",
            "minimum": 0,
            "type": "integer",
            "description": "Cap on charged rows (jobs, signals and rollups together). 0 = no limit. The free summary row is not counted.",
            "default": 500
          },
          "maxRequestsPerMinute": {
            "title": "Max requests per minute",
            "minimum": 1,
            "maximum": 600,
            "type": "integer",
            "description": "Global throttle. Each host also gets at most 1 request per second (Lever asks for Crawl-delay: 1).",
            "default": 60
          },
          "debugLog": {
            "title": "Debug log",
            "type": "boolean",
            "description": "Verbose logging.",
            "default": false
          }
        }
      },
      "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}