{
  "openapi": "3.0.1",
  "info": {
    "title": "Hiring.Cafe Scraper - Jobs, Salaries, Companies & Benefits",
    "description": "Scrape Hiring.Cafe jobs from $1/1K results. Search with advanced filters or URLs and extract 100+ fields per job, including salaries, company insights, benefits and job details. Fast, scalable job data extraction with Gold discounts starting at $1.",
    "version": "0.2",
    "x-build-id": "d6fwa6KfyjgjGeuEO"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/abotapi~hiring-cafe-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-abotapi-hiring-cafe-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/abotapi~hiring-cafe-scraper/runs": {
      "post": {
        "operationId": "runs-sync-abotapi-hiring-cafe-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/abotapi~hiring-cafe-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-abotapi-hiring-cafe-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": {
          "startUrls": {
            "title": "Start URLs",
            "type": "array",
            "description": "Paste Hiring.Cafe search URLs (links with ?searchState=…) and/or single job URLs (…/job/…). Each search link is walked forward from its own page (a ?page=N in the link is honoured). Start URLs you change take priority and the filters are ignored; the untouched example links give way to a keyword or filter you set. Supported link shapes: /classic search, /classic with ?page=N, root-path ?searchState=, a bare /classic page, the legacy base64 searchState form, and single /job/<id> pages.",
            "default": [
              {
                "url": "https://hiringcafe.com/classic"
              },
              {
                "url": "https://hiringcafe.com/classic?searchState=%7B%22searchQuery%22%3A%22software%20engineer%22%7D"
              },
              {
                "url": "https://hiringcafe.com/classic?searchState=%7B%22searchQuery%22%3A%22software%20engineer%22%7D&page=2"
              },
              {
                "url": "https://hiringcafe.com/?searchState=%7B%22searchQuery%22%3A%22software%20engineer%22%7D"
              },
              {
                "url": "https://hiringcafe.com/?searchState=eyJzZWFyY2hRdWVyeSI6InNvZnR3YXJlIGVuZ2luZWVyIn0%3D"
              },
              {
                "url": "https://hiringcafe.com/job/bt38fz2pqe76nimr"
              }
            ],
            "items": {
              "type": "object",
              "required": [
                "url"
              ],
              "properties": {
                "url": {
                  "type": "string",
                  "title": "URL of a web page",
                  "format": "uri"
                }
              }
            }
          },
          "keyword": {
            "title": "Search keyword",
            "type": "string",
            "description": "Job title, skill, or company name (for example: python developer, data scientist). Used when Start URLs is empty or still holds the example links; any other Start URLs you set take priority over this field."
          },
          "location": {
            "title": "Location",
            "type": "string",
            "description": "Country or city (for example: United States, London, Germany). Combined with the keyword; leave empty for worldwide results."
          },
          "workplaceType": {
            "title": "Workplace Type",
            "enum": [
              "Any",
              "Remote",
              "Hybrid",
              "Onsite"
            ],
            "type": "string",
            "description": "Filter by workplace arrangement: Remote, Hybrid, or Onsite.",
            "default": "Any"
          },
          "commitmentType": {
            "title": "Employment Type",
            "enum": [
              "Any",
              "Full Time",
              "Part Time",
              "Contract",
              "Internship"
            ],
            "type": "string",
            "description": "Filter by employment type: Full Time, Part Time, Contract, or Internship.",
            "default": "Any"
          },
          "seniorityLevel": {
            "title": "Seniority Level",
            "enum": [
              "Any",
              "No Prior Experience Required",
              "Entry Level",
              "Mid Level",
              "Senior Level"
            ],
            "type": "string",
            "description": "Filter by experience level, from No Prior Experience Required to Senior Level.",
            "default": "Any"
          },
          "postedWithinDays": {
            "title": "Posted within (days)",
            "minimum": 1,
            "maximum": 1440,
            "type": "integer",
            "description": "Only jobs published in the last N days. Default 30; maximum 1440. Approximate: the site applies this window only for some values (measured: 2, 14 and 1440 days narrowed the results, 30 did not), so treat it as a hint, not an exact cut-off.",
            "default": 30
          },
          "salaryTransparentOnly": {
            "title": "Salary transparent only",
            "type": "boolean",
            "description": "Return only jobs whose pay is publicly disclosed.",
            "default": false
          },
          "sortBy": {
            "title": "Sort by",
            "enum": [
              "default",
              "date",
              "date_asc",
              "compensation",
              "experience"
            ],
            "type": "string",
            "description": "Result order: default (relevance), date (newest first), date_asc (oldest first), compensation, experience.",
            "default": "default"
          },
          "workplaceTypes": {
            "title": "Workplace types (multi)",
            "type": "array",
            "description": "Several workplace arrangements at once. When set, overrides Workplace Type.",
            "items": {
              "type": "string",
              "enum": [
                "Remote",
                "Hybrid",
                "Onsite"
              ]
            }
          },
          "commitmentTypes": {
            "title": "Commitment types (multi)",
            "type": "array",
            "description": "Several commitment types at once. When set, overrides Commitment Type.",
            "items": {
              "type": "string",
              "enum": [
                "Full Time",
                "Part Time",
                "Contract",
                "Internship",
                "Temporary",
                "Seasonal",
                "Volunteer"
              ]
            }
          },
          "seniorityLevels": {
            "title": "Seniority levels (multi)",
            "type": "array",
            "description": "Several seniority levels at once. When set, overrides Seniority Level.",
            "items": {
              "type": "string",
              "enum": [
                "No Prior Experience Required",
                "Entry Level",
                "Mid Level",
                "Senior Level"
              ]
            }
          },
          "jobTitleQuery": {
            "title": "Job title contains",
            "type": "string",
            "description": "Match this text against the job title only."
          },
          "companyNames": {
            "title": "Only these companies",
            "type": "array",
            "description": "Company names to include.",
            "items": {
              "type": "string"
            }
          },
          "excludedCompanyNames": {
            "title": "Exclude companies",
            "type": "array",
            "description": "Company names to leave out.",
            "items": {
              "type": "string"
            }
          },
          "industries": {
            "title": "Only these industries",
            "type": "array",
            "description": "Industry names to include.",
            "items": {
              "type": "string"
            }
          },
          "excludedIndustries": {
            "title": "Exclude industries",
            "type": "array",
            "description": "Industry names to leave out.",
            "items": {
              "type": "string"
            }
          },
          "minSalary": {
            "title": "Minimum salary",
            "minimum": 0,
            "type": "integer",
            "description": "Lowest yearly compensation (site currency units). Setting it also limits results to jobs that disclose their pay."
          },
          "maxSalary": {
            "title": "Maximum salary",
            "minimum": 0,
            "type": "integer",
            "description": "Highest yearly compensation. Setting it also limits results to jobs that disclose their pay."
          },
          "minYoe": {
            "title": "Min years of experience",
            "minimum": 0,
            "maximum": 40,
            "type": "integer",
            "description": "Lower bound of required years of experience."
          },
          "maxYoe": {
            "title": "Max years of experience",
            "minimum": 0,
            "maximum": 40,
            "type": "integer",
            "description": "Upper bound of required years of experience."
          },
          "maxItems": {
            "title": "Maximum jobs",
            "type": "integer",
            "description": "Stop after this many jobs (0 = unlimited). Each results page carries up to ~100 jobs.",
            "default": 1000
          },
          "fetchDetails": {
            "title": "Fetch full job descriptions",
            "type": "boolean",
            "description": "On by default. Reads each matched job's own page so every record carries the full description (the search listings themselves do not include it), plus the freshest on-site view/apply counts. Adds one page read per job (~200 KB of traffic per job on your proxy plan). Each delivered job whose page was read is charged as one detail-page event on top of the per-result charge; jobs whose page the source refuses, jobs read with this toggle off, and jobs incremental mode suppresses as unchanged are not charged. Turn off for a fast, listing-only crawl.",
            "default": true
          },
          "proxy": {
            "title": "Proxy configuration",
            "type": "object",
            "description": "Residential proxy is strongly recommended: hiring.cafe blocks datacenter IP ranges, so non-residential runs may return no results.",
            "default": {
              "useApifyProxy": true,
              "apifyProxyGroups": [
                "RESIDENTIAL"
              ]
            }
          },
          "resumeFromRunId": {
            "title": "Resume from a previous run",
            "type": "string",
            "description": "Paste a previous run ID or dataset ID to continue a large search without returning or charging for jobs already collected there. Use this after an interrupted run, or when continuing a jobs pull in another run. For recurring daily monitoring of the same search, use Incremental mode below instead."
          },
          "incrementalMode": {
            "title": "Incremental changes for scheduled runs",
            "type": "boolean",
            "description": "Turn this on for daily or recurring monitoring. The first run returns all matching jobs as NEW. Later runs normally return only NEW, UPDATED, and REAPPEARED jobs. A job counts as UPDATED when any of its published fields changes (title, description, salary, location, the structured job and company attributes); views_on_site and applies_on_site (running counters) and any field you list in Ignore fields never trigger UPDATED. Turn on \\\"Emit unchanged\\\" or \\\"Emit expired\\\" only when you also want those jobs returned (and billed). State is kept separately per search/filter/URL setup; use State key when you want to name or deliberately share a monitoring campaign. To continue one specific interrupted run instead, use Resume from a previous run above.",
            "default": false
          },
          "stateKey": {
            "title": "State key (optional, incremental mode only)",
            "type": "string",
            "description": "Optional. Name this monitoring campaign to keep its state stable, or to deliberately share state across differently-configured runs. Leave empty to let the actor derive a key automatically from the search/filters/URLs; different searches then never mix state with each other."
          },
          "emitUnchanged": {
            "title": "Emit unchanged jobs (incremental mode only)",
            "type": "boolean",
            "description": "Off by default. Turn on to also return jobs that have not changed since the last run, marked UNCHANGED. This returns: and bills: extra rows you already have, so leave it off unless you specifically want the full snapshot every run.",
            "default": false
          },
          "emitExpired": {
            "title": "Emit expired jobs (incremental mode only)",
            "type": "boolean",
            "description": "Off by default. Turn on to also return jobs that were present in a previous run but are no longer found, marked EXPIRED. Only produced once a run has fully scanned the tracked search: not when Maximum jobs capped it or when Resume was used. This returns: and bills: extra synthetic rows, so leave it off unless you need expiry tracking.",
            "default": false
          },
          "ignoreFieldsForChanges": {
            "title": "Ignore fields when detecting changes (incremental mode only)",
            "type": "array",
            "description": "Optional. Field names to leave out of UPDATED change detection (still present in the output). Use a top-level name such as company_name or a dotted path such as v5_processed_job_data.some_field. Built in: views_on_site and applies_on_site never trigger UPDATED, because they are running counters that rise on their own.",
            "items": {
              "type": "string"
            }
          },
          "mcpConnectors": {
            "title": "Pipe results into your apps (optional)",
            "type": "array",
            "description": "Optionally send the scraped results into the apps you already use, via Model Context Protocol (MCP) connectors. Authorize a connector once under Apify → Settings → Integrations, then select it here. The connector receives a condensed, human-readable summary per item (title + key fields), not the full JSON: the complete record stays in the dataset. Leave empty to skip. Supported: Notion (https://mcp.notion.com/mcp), Linear (https://mcp.linear.app/sse), Airtable (https://mcp.airtable.com/mcp), Apify (https://mcp.apify.com)."
          },
          "notionParentPageUrl": {
            "title": "Notion parent page (Notion connector only)",
            "type": "string",
            "description": "URL (or id) of the Notion page under which item pages are created. Required to enable the Notion export; ignored by other connectors."
          },
          "maxNotifyListings": {
            "title": "Max items to export per connector",
            "minimum": 1,
            "maximum": 1000,
            "type": "integer",
            "description": "Cap on items written to each connector per run. Does not affect the dataset.",
            "default": 50
          }
        }
      },
      "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}