{
  "openapi": "3.0.1",
  "info": {
    "title": "Multi Job Board Scraper — Career Pages, Listings Aggregator",
    "description": "Job board jobs: one keyword across Indeed and the company boards you name, merged and de-duplicated into one feed — the same role on two boards is one row and one charge. One price for the whole feed, no add-on events, from $1.80 per 1,000 job listings; a scheduled run pays only for new jobs.",
    "version": "1.0",
    "x-build-id": "ISrkJMTgpxPqgLqW6"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/steadyfetch~multi-job-board-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-steadyfetch-multi-job-board-scraper",
        "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/steadyfetch~multi-job-board-scraper/runs": {
      "post": {
        "operationId": "runs-sync-steadyfetch-multi-job-board-scraper",
        "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/steadyfetch~multi-job-board-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-steadyfetch-multi-job-board-scraper",
        "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": [
          "query"
        ],
        "properties": {
          "query": {
            "title": "Search keyword",
            "type": "string",
            "description": "Job title or keyword, for example \"software engineer\" — or a full Indeed search URL such as https://uk.indeed.com/jobs?q=data+analyst. No result fee for a keyword that matches nothing, or for a board that fails or blocks. One company's own hiring board alone is steadyfetch/company-jobs-by-domain; Indeed alone is steadyfetch/indeed-jobs-scraper. Called with no input at all (an empty {} from the API or an agent), the run is a 5-job sample — \"software engineer\" on Indeed US plus vercel.com's own board — charged like any run, and setting only the filters below leaves that sample running under them.",
            "default": "_demo"
          },
          "countries": {
            "title": "Indeed countries",
            "type": "array",
            "description": "Which Indeed country sites to search. Each country is a separate search. United States, United Kingdom and Germany are verified end to end; any listing that comes back outside the country you asked for is reported and never charged.",
            "items": {
              "type": "string",
              "enum": [
                "US",
                "GB",
                "DE",
                "CA",
                "AU",
                "IE",
                "NZ",
                "FR",
                "ES",
                "IT",
                "NL",
                "BE",
                "CH",
                "AT",
                "SE",
                "DK",
                "NO",
                "FI",
                "PL",
                "PT",
                "GR",
                "IN",
                "SG",
                "JP",
                "AE",
                "ZA",
                "MX",
                "BR",
                "TR"
              ],
              "enumTitles": [
                "United States",
                "United Kingdom",
                "Germany",
                "Canada",
                "Australia",
                "Ireland",
                "New Zealand",
                "France",
                "Spain",
                "Italy",
                "Netherlands",
                "Belgium",
                "Switzerland",
                "Austria",
                "Sweden",
                "Denmark",
                "Norway",
                "Finland",
                "Poland",
                "Portugal",
                "Greece",
                "India",
                "Singapore",
                "Japan",
                "United Arab Emirates",
                "South Africa",
                "Mexico",
                "Brazil",
                "Turkey"
              ]
            },
            "default": [
              "US"
            ]
          },
          "location": {
            "title": "Indeed location",
            "type": "string",
            "description": "City, region or postcode to search Indeed near, as you would type it there (for example \"Austin, TX\"). Leave empty to search the whole country."
          },
          "radiusKm": {
            "title": "Radius",
            "minimum": 1,
            "type": "integer",
            "description": "How far around the Indeed location to search, in kilometres. Only used when a location is set. Indeed's own radius selector stops at 160 km (100 miles), so ask for more and the run continues at 160, with one uncharged row saying so."
          },
          "companies": {
            "title": "Company boards",
            "type": "array",
            "description": "Company domains (stripe.com), careers-page URLs, board URLs (https://jobs.lever.co/leverdemo) or plain company names. Their boards are filtered to roles that match your keyword.",
            "items": {
              "type": "string"
            }
          },
          "atsFilter": {
            "title": "Only these hiring platforms",
            "type": "array",
            "description": "Restrict company-board resolution to named platforms. Leave empty to check all of them.",
            "items": {
              "type": "string",
              "enum": [
                "greenhouse",
                "lever",
                "ashby",
                "workday",
                "workable",
                "smartrecruiters",
                "rippling",
                "personio",
                "teamtailor"
              ],
              "enumTitles": [
                "Greenhouse",
                "Lever",
                "Ashby",
                "Workday",
                "Workable",
                "SmartRecruiters",
                "Rippling",
                "Personio",
                "Teamtailor"
              ]
            }
          },
          "sources": {
            "title": "Sources",
            "type": "array",
            "description": "Which job sources to include. Leave empty for both. \"Indeed\" needs a keyword; \"Company boards\" needs company domains.",
            "items": {
              "type": "string",
              "enum": [
                "indeed",
                "ats"
              ],
              "enumTitles": [
                "Indeed",
                "Company boards (ATS)"
              ]
            },
            "default": [
              "indeed",
              "ats"
            ]
          },
          "dedupe": {
            "title": "Merge duplicate jobs across boards",
            "type": "boolean",
            "description": "On by default. When on, the same role found on more than one board becomes ONE row with every source link kept — and one charge. When off, each board's copy is its own row (the identical posting fetched twice is still never charged twice).",
            "default": true
          },
          "postedWithinDays": {
            "title": "Posted within (days)",
            "minimum": 1,
            "type": "integer",
            "description": "Only jobs Indeed posted in the last N days. Indeed's own window stops at 30 days, so ask for a longer one and the run continues at 30, with one uncharged row saying so."
          },
          "sortBy": {
            "title": "Sort by",
            "type": "string",
            "description": "Ask Indeed to order its results by date instead of relevance. Company boards are unaffected.",
            "default": "relevance"
          },
          "remoteOnly": {
            "title": "Remote jobs only",
            "type": "boolean",
            "description": "Keep only listings marked remote. Listings filtered out are never charged.",
            "default": false
          },
          "maxItems": {
            "title": "Max unique jobs for the whole run",
            "minimum": 1,
            "type": "integer",
            "description": "Hard cap on delivered UNIQUE jobs (after de-duplication) across every source in this run. This actor delivers up to 10,000 unique jobs in one run; ask for more and the run continues at 10,000, with one uncharged row saying so.",
            "default": 100
          },
          "maxItemsPerCompany": {
            "title": "Max jobs per company board",
            "minimum": 1,
            "type": "integer",
            "description": "Hard cap on roles pulled from any single company board before keyword filtering. This actor pulls up to 5,000 roles from one board in a run; ask for more and the run continues at 5,000, with one uncharged row saying so.",
            "default": 200
          },
          "maxRunSeconds": {
            "title": "Max run seconds",
            "type": "integer",
            "description": "The run stops cleanly before this many seconds and reports what is left, instead of being killed by a timeout. A run is given between 30 and 3,600 seconds; ask for more or less and the run continues at whichever of the two is nearer, with one uncharged row saying so.",
            "default": 1200
          },
          "includeSeen": {
            "title": "Include postings you already have",
            "type": "boolean",
            "description": "OFF (default): a posting already delivered to your account is skipped before it takes a row slot — not delivered again, not charged, not counted against your row cap. ON: those rows come back anyway, marked `repeat: true` with `firstSeenAt` and `firstSeenRunId` naming the run that first delivered them, and still not charged. Use it when you want one complete dataset per run rather than only what changed.",
            "default": false
          },
          "resumeFromDatasetId": {
            "title": "Continue from an earlier run's dataset",
            "type": "string",
            "description": "The default dataset ID of an earlier run of this actor. Leave empty to start fresh. If the dataset cannot be read, the run stops before fetching anything and charges nothing, rather than risk billing you twice."
          }
        }
      },
      "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}