{
  "openapi": "3.0.1",
  "info": {
    "title": "Multi Board Job Scraper — Indeed, LinkedIn & Employer Boards",
    "description": "Search Indeed, LinkedIn and 56 employer career boards (Greenhouse, Lever, Ashby) in one run. Every posting is mapped onto one schema, deduplicated across boards and runs, with pay parsed into min/max/currency/period and seniority inferred from the title. No login, no browser.",
    "version": "0.0",
    "x-build-id": "sZkUrc3dXgQ1cbII4"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/brilliant_gum~jobs-aggregator/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-brilliant_gum-jobs-aggregator",
        "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/brilliant_gum~jobs-aggregator/runs": {
      "post": {
        "operationId": "runs-sync-brilliant_gum-jobs-aggregator",
        "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/brilliant_gum~jobs-aggregator/run-sync": {
      "post": {
        "operationId": "run-sync-brilliant_gum-jobs-aggregator",
        "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": {
          "query": {
            "title": "Search query",
            "type": "string",
            "description": "Job title, keyword or skill to search across every selected board (e.g. \"software engineer\", \"data analyst\"). Required unless you use \"Multiple queries\" below.",
            "default": "software engineer"
          },
          "queries": {
            "title": "Multiple queries (OR search)",
            "maxItems": 5,
            "type": "array",
            "description": "Optional. Run several queries in one go — results are merged and deduplicated, each row tagged with matchedQuery. Max 5. Leave empty to use the single query above.",
            "items": {
              "type": "string"
            }
          },
          "location": {
            "title": "Location",
            "type": "string",
            "description": "City / state / country, or \"remote\". Applies to Indeed, LinkedIn and Glassdoor; ATS boards are filtered client-side. Empty = anywhere. Note: Glassdoor cannot be filtered by location and is skipped (with a reason in the log) when one is set.",
            "default": "remote"
          },
          "boards": {
            "title": "Job boards",
            "type": "array",
            "description": "Which job boards to search. Verified working: indeed, linkedin, greenhouse, ashby, lever. glassdoor works only WITHOUT a `location` (Glassdoor blocks its location lookup). ziprecruiter covers the US and Canada only. google is experimental — Google guards its jobs widget and it usually returns nothing.",
            "items": {
              "type": "string",
              "enum": [
                "indeed",
                "linkedin",
                "glassdoor",
                "ziprecruiter",
                "greenhouse",
                "lever",
                "ashby",
                "google"
              ],
              "enumTitles": [
                "Indeed",
                "LinkedIn",
                "Glassdoor",
                "ZipRecruiter",
                "Greenhouse (ATS)",
                "Lever (ATS)",
                "Ashby (ATS)",
                "Google Jobs (best-effort)"
              ]
            },
            "default": [
              "indeed",
              "linkedin",
              "glassdoor",
              "greenhouse"
            ]
          },
          "maxItemsPerBoard": {
            "title": "Max items per board",
            "minimum": 0,
            "type": "integer",
            "description": "Maximum postings to collect per board (per query). Total ≈ this × boards × queries, before dedup. 0 = board maximum.",
            "default": 25
          },
          "remoteOnly": {
            "title": "Remote only",
            "type": "boolean",
            "description": "Keep only remote postings (filters both the board query and the normalized results).",
            "default": false
          },
          "jobType": {
            "title": "Job type",
            "enum": [
              "",
              "fulltime",
              "parttime",
              "contract",
              "internship",
              "temporary"
            ],
            "type": "string",
            "description": "Filter by employment type. \"Any\" returns all types.",
            "default": ""
          },
          "maxDaysOld": {
            "title": "Posted within (days)",
            "minimum": 0,
            "type": "integer",
            "description": "Only keep jobs posted within the last N days (converted to hours for Indeed/LinkedIn, to a fromAge filter for Glassdoor). 0 = any age.",
            "default": 0
          },
          "country": {
            "title": "Country (Indeed & Glassdoor)",
            "type": "string",
            "description": "Country for Indeed and Glassdoor (us, uk, canada, australia, germany, france, india, netherlands, singapore, ...). Defaults to us.",
            "default": "us"
          },
          "distance": {
            "title": "Search radius (miles)",
            "minimum": 0,
            "maximum": 200,
            "type": "integer",
            "description": "Radius in miles from the location for Indeed and LinkedIn.",
            "default": 50
          },
          "fetchDescription": {
            "title": "Fetch full descriptions (LinkedIn)",
            "type": "boolean",
            "description": "Fetch the full job description + seniority/employment-type/industry from each LinkedIn job page (one extra request per posting; slower + more proxy usage). Indeed/Glassdoor/ATS descriptions come with the search response.",
            "default": true
          },
          "glassdoorFullDescription": {
            "title": "Glassdoor: fetch full descriptions",
            "type": "boolean",
            "description": "By default Glassdoor postings carry the short description snippet from the search page (no extra request). Enable this to fetch each Glassdoor job's full description from its detail page (one extra UNBLOCKER request per posting — slower and more proxy usage).",
            "default": false
          },
          "descriptionFormat": {
            "title": "Description format",
            "enum": [
              "text",
              "markdown",
              "html"
            ],
            "type": "string",
            "description": "Output format for the job description text.",
            "default": "text"
          },
          "greenhouseCompanies": {
            "title": "Greenhouse board tokens",
            "type": "array",
            "description": "Greenhouse board tokens to search (the slug in boards.greenhouse.io/<token>, e.g. \"stripe\"). Empty = a curated set of popular public boards. These are Greenhouse board tokens, i.e. the name in the careers URL — a company not hosted on Greenhouse simply returns nothing.",
            "items": {
              "type": "string"
            }
          },
          "leverCompanies": {
            "title": "Lever board tokens",
            "type": "array",
            "description": "Lever board tokens to search (the slug in jobs.lever.co/<token>, e.g. \"palantir\"). Empty = a curated set. These are Lever board tokens, i.e. the name in the careers URL — a company not hosted on Lever simply returns nothing.",
            "items": {
              "type": "string"
            }
          },
          "ashbyCompanies": {
            "title": "Ashby board tokens",
            "type": "array",
            "description": "Ashby board tokens to search (the slug in jobs.ashbyhq.com/<token>, e.g. \"ramp\"). Empty = a curated set. These are Ashby board tokens, i.e. the name in the careers URL — a company not hosted on Ashby simply returns nothing.",
            "items": {
              "type": "string"
            }
          },
          "parseSalary": {
            "title": "Parse salary from text",
            "type": "boolean",
            "description": "When a posting has no structured salary, parse min/max/currency/period from the salary text or description (best-effort).",
            "default": true
          },
          "enforceAnnualSalary": {
            "title": "Normalize salary to annual",
            "type": "boolean",
            "description": "Convert every parsed/structured salary to an annual equivalent (hourly × 2080, monthly × 12, ...) for easy comparison.",
            "default": false
          },
          "computeAnalytics": {
            "title": "Run analytics summary",
            "type": "boolean",
            "description": "Save a RUN_SUMMARY record (per-board counts, salary coverage, remote share, seniority/job-type breakdown, top companies, blocked boards) to the key-value store.",
            "default": true
          },
          "deduplicate": {
            "title": "Deduplicate",
            "type": "boolean",
            "description": "Drop duplicate postings across boards using a company+title+location hash (dedupKey).",
            "default": true
          },
          "deduplicateKeyStore": {
            "title": "Cross-run dedup key store",
            "type": "string",
            "description": "Named key-value store to persist seen dedupKeys across scheduled runs. Empty = in-run dedup only."
          },
          "monitoringMode": {
            "title": "Monitoring mode (new only)",
            "type": "boolean",
            "description": "Only output postings not seen in a previous run (requires a cross-run dedup key store). Great for scheduled new-job alerts.",
            "default": false
          },
          "maxConcurrency": {
            "title": "Max concurrency",
            "minimum": 1,
            "maximum": 20,
            "type": "integer",
            "description": "Concurrency for per-item detail fetches (LinkedIn descriptions) and ATS board fetches.",
            "default": 5
          },
          "maxChallengeRetries": {
            "title": "Max challenge retries",
            "minimum": 0,
            "maximum": 10,
            "type": "integer",
            "description": "Retries with fresh proxy sessions on 403/429/5xx/timeout responses.",
            "default": 3
          },
          "proxy": {
            "title": "Proxy",
            "type": "object",
            "description": "Egress proxy for Indeed/LinkedIn/Google. Residential US is recommended (LinkedIn rate-limits per IP). Glassdoor always uses the Apify UNBLOCKER group internally regardless of this setting.",
            "default": {
              "useApifyProxy": true,
              "apifyProxyGroups": [
                "RESIDENTIAL"
              ],
              "apifyProxyCountry": "US"
            }
          }
        }
      },
      "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}