{
  "openapi": "3.0.1",
  "info": {
    "title": "Big Four Careers Scraper - Deloitte, PwC, EY, KPMG & More",
    "description": "Pull every open role at the Big Four and adjacent professional-services firms across Europe, verified from their own career pages, not a job board index. Covers Deloitte, PwC, EY, KPMG and more, with real location, language and ATS platform per role. Diff mode reports new/removed roles.",
    "version": "0.1",
    "x-build-id": "SNke6egeLUcoKgLpX"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/studio-amba~big-four-careers-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-studio-amba-big-four-careers-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/studio-amba~big-four-careers-scraper/runs": {
      "post": {
        "operationId": "runs-sync-studio-amba-big-four-careers-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/studio-amba~big-four-careers-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-studio-amba-big-four-careers-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",
        "properties": {
          "mode": {
            "title": "Mode",
            "enum": [
              "full",
              "diff"
            ],
            "type": "string",
            "description": "'full' returns every verified-live role found this run. 'diff' compares against the previous run (per-employer persistent state) and returns only roles that newly appeared or disappeared since then — the hiring-signal product. Both modes always refresh the underlying state, so you can switch modes run to run.",
            "default": "full"
          },
          "countries": {
            "title": "Countries",
            "maxItems": 32,
            "type": "array",
            "description": "Return only roles located in these countries (ISO 3166-1 alpha-2 codes, e.g. DE, FR, PL — any EU/EEA + UK + CH code). Pan-European boards (PwC, EY) are included automatically and filtered down to your countries.",
            "items": {
              "type": "string",
              "enum": [
                "AT",
                "BE",
                "BG",
                "HR",
                "CY",
                "CZ",
                "DK",
                "EE",
                "FI",
                "FR",
                "DE",
                "GR",
                "HU",
                "IE",
                "IS",
                "IT",
                "LV",
                "LI",
                "LT",
                "LU",
                "MT",
                "NL",
                "NO",
                "PL",
                "PT",
                "RO",
                "SK",
                "SI",
                "ES",
                "SE",
                "CH",
                "GB"
              ],
              "enumTitles": [
                "Austria",
                "Belgium",
                "Bulgaria",
                "Croatia",
                "Cyprus",
                "Czech Republic",
                "Denmark",
                "Estonia",
                "Finland",
                "France",
                "Germany",
                "Greece",
                "Hungary",
                "Ireland",
                "Iceland",
                "Italy",
                "Latvia",
                "Liechtenstein",
                "Lithuania",
                "Luxembourg",
                "Malta",
                "Netherlands",
                "Norway",
                "Poland",
                "Portugal",
                "Romania",
                "Slovakia",
                "Slovenia",
                "Spain",
                "Sweden",
                "Switzerland",
                "United Kingdom"
              ]
            }
          },
          "keywords": {
            "title": "Keywords",
            "type": "array",
            "description": "Return only roles whose title contains at least one of these terms (case-insensitive), e.g. tax, VAT, business analyst. Applied before the per-employer cap, so a 233-role board is searched for your terms instead of truncated to its first roles. Leave empty for every role. Diff mode skips 'disappeared' events when keywords are set.",
            "items": {
              "type": "string"
            }
          },
          "employerNames": {
            "title": "Employer Name Filter",
            "maxItems": 100,
            "type": "array",
            "description": "Only include employers whose name contains one of these strings (case-insensitive), e.g. 'Deloitte', 'PwC', 'ING'. Leave empty to use every employer in the built-in roster (after any country filter).",
            "items": {
              "type": "string"
            }
          },
          "customEmployers": {
            "title": "Custom Employers",
            "maxItems": 200,
            "type": "array",
            "description": "Add your own employers instead of (or alongside) the built-in roster. Each entry: {\"name\": \"Acme Bank\", \"country\": \"BE\", \"careersUrl\": \"https://acme.com/careers\"}. The same ATS-detection pipeline runs against these — no per-employer scraper code needed, just a real careers-page URL."
          },
          "maxRolesPerEmployer": {
            "title": "Max Roles Per Employer",
            "minimum": 1,
            "maximum": 2000,
            "type": "integer",
            "description": "Cap on live roles pulled per employer per run. Large tenants (e.g. EY's SuccessFactors board carries 7,000+ roles worldwide) are paginated up to this cap; the ATS-reported total is always included in the run summary even when capped. Higher values mean a longer, heavier run.",
            "default": 150
          },
          "fetchDescriptions": {
            "title": "Fetch descriptions",
            "type": "boolean",
            "description": "Add the posting body (plain text) to each live role as `description`, read from the employer's own posting page or ATS detail endpoint. Costs one extra request per role, capped by Max description fetches. Off by default. Narrow the run with countries, keywords or employerNames first.",
            "default": false
          },
          "maxDescriptionFetches": {
            "title": "Max description fetches",
            "minimum": 1,
            "maximum": 1000,
            "type": "integer",
            "description": "Hard cap on description fetches per run (only used when Fetch descriptions is on). Rows beyond the cap are returned with descriptionStatus 'skipped_cap'.",
            "default": 200
          },
          "minEmployerCoverage": {
            "title": "Minimum employer coverage",
            "minimum": 0,
            "maximum": 1,
            "type": "number",
            "description": "Fail the run when the share of employers fetched successfully falls below this value (0 to 1, for example 0.7). The default 0 never fails on coverage. Per-employer status is always written to the RUN_SUMMARY record in the key-value store and shown as the run status message.",
            "default": 0
          },
          "resetState": {
            "title": "Reset Diff State (testing only)",
            "type": "boolean",
            "description": "Clears this actor's persistent per-employer seen-roles state before the run, so diff mode treats every role as a fresh first-run seed (no appeared/disappeared events) and a full-mode run starts state tracking over. Never enable this on a real scheduled run — it defeats diff mode's whole purpose.",
            "default": false
          },
          "proxyConfiguration": {
            "title": "Proxy Configuration",
            "type": "object",
            "description": "Every employer ATS this actor targets (Workday, SuccessFactors, Avature, Radancy, skeeled, Greenhouse, Ashby, Lever, SmartRecruiters) is a public JSON API or plain server-rendered HTML page with no anti-bot — confirmed in the POC with zero proxy and zero blocks. Automatic/no-groups is the correct default; escalate only if you see blocks in the run log.",
            "default": {
              "useApifyProxy": true,
              "apifyProxyGroups": [
                "RESIDENTIAL"
              ]
            }
          }
        }
      },
      "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}