{
  "openapi": "3.0.1",
  "info": {
    "title": "Company Careers Scraper — Greenhouse Lever Ashby",
    "description": "Turn a list of companies into their live job postings. For every company slug this Actor probes Greenhouse, Lever, Ashby and Workable, fetches from whichever ATS hosts the board and returns one merged, deduped dataset: title, department, location, remote flag and apply URL. No per-ATS setup.",
    "version": "0.1",
    "x-build-id": "Mz3BR0ZNLez6lXgdm"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/nomad-agent~company-careers-bundle/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-nomad-agent-company-careers-bundle",
        "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/nomad-agent~company-careers-bundle/runs": {
      "post": {
        "operationId": "runs-sync-nomad-agent-company-careers-bundle",
        "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/nomad-agent~company-careers-bundle/run-sync": {
      "post": {
        "operationId": "run-sync-nomad-agent-company-careers-bundle",
        "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": "Companies",
            "type": "array",
            "description": "Company slugs as used on their ATS board (full board URLs also accepted). Use the company's careers-page slug. When unsure, pass your best guess — slugs are probed on all four ATS providers and misses are just logged.",
            "items": {
              "type": "string"
            }
          },
          "atsProviders": {
            "title": "ATS providers to probe",
            "type": "array",
            "description": "Restrict which ATS this Actor probes per company. Fewer providers means fewer upstream requests per company — faster and slightly cheaper runs. Leave empty to probe all four (default).",
            "items": {
              "type": "string",
              "enum": [
                "greenhouse",
                "lever",
                "ashby",
                "workable"
              ],
              "enumTitles": [
                "Greenhouse",
                "Lever",
                "Ashby",
                "Workable"
              ]
            },
            "default": [
              "greenhouse",
              "lever",
              "ashby",
              "workable"
            ]
          },
          "keyword": {
            "title": "Keyword filter",
            "type": "string",
            "description": "Optional case-insensitive substring match on the job title (e.g. <code>engineer</code>)."
          },
          "titleExclude": {
            "title": "Exclude titles containing",
            "type": "array",
            "description": "Drop postings whose title contains any of these substrings (case-insensitive). Example: [<code>intern</code>, <code>staffing</code>].",
            "items": {
              "type": "string"
            }
          },
          "locationFilter": {
            "title": "Location filter",
            "type": "string",
            "description": "Optional case-insensitive substring match on the location (e.g. <code>remote</code>, <code>london</code>)."
          },
          "postedSince": {
            "title": "Posted in the last N days",
            "minimum": 0,
            "type": "integer",
            "description": "Only keep postings first published within this many days. Leave empty (or 0) for no date filter. When this is set, postings the source didn't give a posting date for are dropped rather than guessed at."
          },
          "remoteOnly": {
            "title": "Remote only",
            "type": "boolean",
            "description": "Keep only postings the source ATS explicitly flags as remote. Greenhouse never reports a remote flag, so companies hosted only on Greenhouse yield zero results with this on; Lever/Ashby/Workable results are filtered normally.",
            "default": false
          },
          "includeDescription": {
            "title": "Include description",
            "type": "boolean",
            "description": "Include a plain-text description snippet per posting. Turn off for lighter, faster output.",
            "default": true
          },
          "maxItemsPerCompany": {
            "title": "Max items per company",
            "minimum": 0,
            "maximum": 5000,
            "type": "integer",
            "description": "Cap postings returned per company. Each posting returned is a billed result, so this keeps one large board from dominating the run's cost. 0 = no cap.",
            "default": 100
          },
          "maxItems": {
            "title": "Max items (total)",
            "minimum": 0,
            "maximum": 5000,
            "type": "integer",
            "description": "Hard cap on total postings returned across all companies. Each posting returned is billed as a paid result — raise this only as high as you actually need. 0 = no cap (not recommended for large company lists).",
            "default": 200
          },
          "onlyNewSinceLastRun": {
            "title": "Only new since last run",
            "type": "boolean",
            "description": "Delta/monitoring mode: only output postings not seen in a previous run that also had this flag on. Already-seen postings are dropped before push (not billed), so this is the cheapest way to run this Actor on a cron schedule and only pay for genuinely new postings. State is tracked per Actor in a dedicated key-value store, keyed by each posting's globalId. See README “Delta mode / monitoring”.",
            "default": false
          },
          "aiEnrichment": {
            "title": "AI enrichment",
            "type": "boolean",
            "description": "Adds aiKeySkills / aiExperienceLevel / aiWorkArrangement / aiVisaSponsorship to every posting via the Anthropic or Mistral API (pick which below). Requires your own API key for the provider you pick — billed separately by that provider, not by this Actor (see README “AI enrichment”). If turned on without a matching key, enrichment is skipped (with a warning) and postings are still returned normally, without the ai* fields.",
            "default": false
          },
          "aiProvider": {
            "title": "AI provider",
            "enum": [
              "anthropic",
              "mistral"
            ],
            "type": "string",
            "description": "Which AI provider runs enrichment (only relevant when “AI enrichment” is on). <code>anthropic</code> (default) uses Claude via anthropicApiKey. <code>mistral</code> uses a Mistral model via mistralApiKey instead — pick this if you'd rather bring a Mistral key than an Anthropic one.",
            "default": "anthropic"
          },
          "anthropicApiKey": {
            "title": "Anthropic API key",
            "type": "string",
            "description": "Your Anthropic API key (sk-ant-…). Only used when “AI enrichment” is on and aiProvider is <code>anthropic</code>; billed separately by Anthropic. Not required unless aiEnrichment is on."
          },
          "aiModel": {
            "title": "AI enrichment model (Anthropic)",
            "enum": [
              "claude-haiku-4-5-20251001",
              "claude-sonnet-4-5"
            ],
            "type": "string",
            "description": "Claude model used for AI enrichment when aiProvider is <code>anthropic</code> (only relevant when “AI enrichment” is on). Haiku is fast and inexpensive; Sonnet gives higher-quality extraction on longer, more nuanced descriptions.",
            "default": "claude-haiku-4-5-20251001"
          },
          "mistralApiKey": {
            "title": "Mistral API key",
            "type": "string",
            "description": "Your Mistral API key. Only used when “AI enrichment” is on and aiProvider is <code>mistral</code>; billed separately by Mistral. Not required unless aiEnrichment is on with aiProvider=mistral."
          },
          "mistralModel": {
            "title": "AI enrichment model (Mistral)",
            "enum": [
              "mistral-small-latest",
              "mistral-medium-latest",
              "mistral-large-latest"
            ],
            "type": "string",
            "description": "Mistral model used for AI enrichment when aiProvider is <code>mistral</code> (only relevant when “AI enrichment” is on). Small is the default — testing found it matches larger Mistral models on this extraction task (small, well-scoped fields) at a fraction of the cost.",
            "default": "mistral-small-latest"
          },
          "concurrency": {
            "title": "Concurrency",
            "minimum": 1,
            "maximum": 16,
            "type": "integer",
            "description": "How many companies to fetch at the same time. Higher is faster but hits the source APIs harder — the default is a safe, fast setting for almost every run.",
            "default": 8
          }
        }
      },
      "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
                  }
                }
              },
              "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}