{
  "openapi": "3.0.1",
  "info": {
    "title": "Hiring.Cafe Scraper 💰 $1.15/1K — 2.8M AI Jobs, 46 ATS",
    "description": "Scrape Hiring.Cafe (hiring.cafe) — AI-enriched job aggregator with 2.8M+ listings from 46 ATS platforms. Extract structured salary and company data, filter listings by centre-radius location, and track changes incrementally across recurring runs.",
    "version": "0.1",
    "x-build-id": "Ui77ATqohOdonxSiE"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/blackfalcondata~hiringcafe-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-blackfalcondata-hiringcafe-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/blackfalcondata~hiringcafe-scraper/runs": {
      "post": {
        "operationId": "runs-sync-blackfalcondata-hiringcafe-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/blackfalcondata~hiringcafe-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-blackfalcondata-hiringcafe-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": {
          "query": {
            "title": "🔍 Search Term(s)",
            "type": "string",
            "description": "Job search keywords. Leave blank to browse all jobs."
          },
          "startUrls": {
            "title": "🔗 Hiring.Cafe Search URLs",
            "type": "array",
            "description": "Optional Hiring.Cafe search result URLs (hiringcafe.com or hiring.cafe). Supports slug URLs such as https://hiringcafe.com/jobs/software-engineer/locations/united-kingdom (a country slug selects that market; a city slug filters within the selected Country) and URLs with ?searchState=... for the exact filters and locations chosen on Hiring.Cafe. For simple country searches, use the Country dropdown.",
            "items": {
              "type": "object",
              "required": [
                "url"
              ],
              "properties": {
                "url": {
                  "type": "string",
                  "title": "URL of a web page",
                  "format": "uri"
                }
              }
            }
          },
          "country": {
            "title": "🌍 Country",
            "enum": [
              "US",
              "GB",
              "CA",
              "DE",
              "NL",
              "FR",
              "ES",
              "SE",
              "NO",
              "DK",
              "IE",
              "AU",
              "AT",
              "BE",
              "CH",
              "FI",
              "IT",
              "PL",
              "PT",
              "RO",
              "GR",
              "HU",
              "CZ",
              "SK",
              "SI",
              "NZ",
              "SG",
              "ZA",
              "CN",
              "IN",
              "ID",
              "PK",
              "JP",
              "KR",
              "BR",
              "MX",
              "TR",
              "VN",
              "PH",
              "TH",
              "MY",
              "EG",
              "NG",
              "SA",
              "AE",
              "TW",
              "IL",
              "CO",
              "CR",
              "BG"
            ],
            "type": "string",
            "description": "Country market to search. The dropdown runs country-level searches across 50 verified markets. United States also supports direct city/region slugs through Location and Start URLs; non-US Location is applied as a result filter after country search.",
            "default": "US"
          },
          "countries": {
            "title": "🌍 Countries",
            "uniqueItems": true,
            "type": "array",
            "description": "Optional multi-country mode. Select multiple country-level markets to search in one run. When set, this overrides Country and uses Max Results Per Country; Start URLs still take priority if provided.",
            "items": {
              "type": "string",
              "enum": [
                "US",
                "GB",
                "CA",
                "DE",
                "NL",
                "FR",
                "ES",
                "SE",
                "NO",
                "DK",
                "IE",
                "AU",
                "AT",
                "BE",
                "CH",
                "FI",
                "IT",
                "PL",
                "PT",
                "RO",
                "GR",
                "HU",
                "CZ",
                "SK",
                "SI",
                "NZ",
                "SG",
                "ZA",
                "CN",
                "IN",
                "ID",
                "PK",
                "JP",
                "KR",
                "BR",
                "MX",
                "TR",
                "VN",
                "PH",
                "TH",
                "MY",
                "EG",
                "NG",
                "SA",
                "AE",
                "TW",
                "IL",
                "CO",
                "CR",
                "BG"
              ],
              "enumTitles": [
                "United States",
                "United Kingdom",
                "Canada",
                "Germany",
                "Netherlands",
                "France",
                "Spain",
                "Sweden",
                "Norway",
                "Denmark",
                "Ireland",
                "Australia",
                "Austria",
                "Belgium",
                "Switzerland",
                "Finland",
                "Italy",
                "Poland",
                "Portugal",
                "Romania",
                "Greece",
                "Hungary",
                "Czechia",
                "Slovakia",
                "Slovenia",
                "New Zealand",
                "Singapore",
                "South Africa",
                "China",
                "India",
                "Indonesia",
                "Pakistan",
                "Japan",
                "South Korea",
                "Brazil",
                "Mexico",
                "Turkey",
                "Vietnam",
                "Philippines",
                "Thailand",
                "Malaysia",
                "Egypt",
                "Nigeria",
                "Saudi Arabia",
                "United Arab Emirates",
                "Taiwan",
                "Israel",
                "Colombia",
                "Costa Rica",
                "Bulgaria"
              ]
            }
          },
          "location": {
            "title": "📍 Location",
            "type": "string",
            "description": "City, state, or region. For every country, the United States included, only listings whose location text mentions it are kept. For exact city or region targeting, paste a Hiring.Cafe URL with ?searchState=... into Start URLs; otherwise leave empty to run a country-level search."
          },
          "workplaceTypes": {
            "title": "🏢 Workplace Type",
            "uniqueItems": true,
            "type": "array",
            "description": "Filter results by workplace type.",
            "items": {
              "type": "string",
              "enum": [
                "Remote",
                "Hybrid",
                "Onsite"
              ],
              "enumTitles": [
                "Remote",
                "Hybrid",
                "Onsite"
              ]
            }
          },
          "seniorityLevels": {
            "title": "📈 Seniority Levels",
            "uniqueItems": true,
            "type": "array",
            "description": "Filter results by seniority level.",
            "items": {
              "type": "string",
              "enum": [
                "Entry Level",
                "Mid Level",
                "Senior Level",
                "Executive"
              ],
              "enumTitles": [
                "Entry Level",
                "Mid Level",
                "Senior Level",
                "Executive"
              ]
            }
          },
          "commitmentTypes": {
            "title": "🕒 Commitment Types",
            "uniqueItems": true,
            "type": "array",
            "description": "Filter results by employment commitment.",
            "items": {
              "type": "string",
              "enum": [
                "Full Time",
                "Part Time",
                "Contract",
                "Internship",
                "Temporary"
              ],
              "enumTitles": [
                "Full Time",
                "Part Time",
                "Contract",
                "Internship",
                "Temporary"
              ]
            }
          },
          "onlyTransparentSalaries": {
            "title": "💵 Only Transparent Salaries",
            "type": "boolean",
            "description": "Only include jobs where Hiring.Cafe reports transparent compensation.",
            "default": false
          },
          "minSalary": {
            "title": "💰 Minimum Salary",
            "minimum": 0,
            "type": "integer",
            "description": "Only include jobs whose reported salary range reaches at least this amount."
          },
          "maxSalary": {
            "title": "💰 Maximum Salary",
            "minimum": 0,
            "type": "integer",
            "description": "Only include jobs whose reported salary range starts at or below this amount."
          },
          "postedWithinDays": {
            "title": "🗓️ Posted Within Days",
            "minimum": 0,
            "type": "integer",
            "description": "Only include jobs with an estimated posted date within the last N days. 0 = no date filter.",
            "default": 0
          },
          "sortBy": {
            "title": "↕️ Sort Order",
            "enum": [
              "date",
              "date_asc",
              "compensation_desc",
              "compensation_asc",
              "experience_desc",
              "experience_asc",
              "default"
            ],
            "type": "string",
            "description": "Order of the results, as Hiring.Cafe ranks them. Newest first by default; salary and experience orders are available too. A pasted Start URL keeps its own sort order unless you pick a different one here.",
            "default": "date"
          },
          "companyNames": {
            "title": "🏢 Company Names",
            "type": "array",
            "description": "Only jobs from these companies, as named on Hiring.Cafe. Hiring.Cafe also matches a company's subsidiaries (Google includes Waymo).",
            "items": {
              "type": "string"
            }
          },
          "excludedCompanyNames": {
            "title": "🚫 Excluded Company Names",
            "type": "array",
            "description": "Leave out jobs from these companies, as named on Hiring.Cafe.",
            "items": {
              "type": "string"
            }
          },
          "industries": {
            "title": "🏭 Industries",
            "type": "array",
            "description": "Only jobs at companies in these industries, e.g. Healthcare, Software, Education.",
            "items": {
              "type": "string"
            }
          },
          "excludedIndustries": {
            "title": "🚫 Excluded Industries",
            "type": "array",
            "description": "Leave out jobs at companies in these industries.",
            "items": {
              "type": "string"
            }
          },
          "companyKeywords": {
            "title": "🔎 Company Keywords",
            "type": "array",
            "description": "Only companies whose name or profile contains one of these words, e.g. bank, clinic. Broader than Company Names.",
            "items": {
              "type": "string"
            }
          },
          "jobDescriptionQuery": {
            "title": "📝 Description Contains",
            "type": "string",
            "description": "Only jobs whose description matches this text, as Hiring.Cafe searches it (supports AND / OR / NOT, e.g. kubernetes AND NOT intern)."
          },
          "technologyKeywordsQuery": {
            "title": "🧰 Technology Keywords",
            "type": "string",
            "description": "Only jobs whose listed technical tools match this text, as Hiring.Cafe searches them (e.g. python OR go)."
          },
          "requirementsKeywordsQuery": {
            "title": "📋 Requirements Keywords",
            "type": "string",
            "description": "Only jobs whose requirements match this text, as Hiring.Cafe searches them (e.g. clearance, CPA)."
          },
          "minYearsExperience": {
            "title": "⏳ Min Years of Experience",
            "minimum": 0,
            "type": "integer",
            "description": "Only jobs whose stated minimum experience is at least this many years. Listings that state no requirement are left out."
          },
          "maxYearsExperience": {
            "title": "⌛ Max Years of Experience",
            "minimum": 0,
            "type": "integer",
            "description": "Only jobs whose stated minimum experience is at most this many years. Listings that state no requirement are left out."
          },
          "maxResults": {
            "title": "💯 Max Results",
            "minimum": 0,
            "maximum": 5000,
            "type": "integer",
            "description": "Maximum total results (0 = unlimited). Ignored when Countries is set — size a multi-country run with Max Results Per Country instead. Memory scales automatically: 256 MB up to 100 results, 512 MB up to 500, 1024 MB above — large runs stream results, so no manual memory change is needed.",
            "default": 25
          },
          "maxResultsPerCountry": {
            "title": "💯 Max Results Per Country",
            "minimum": 0,
            "maximum": 5000,
            "type": "integer",
            "description": "Used only when Countries is set. Limits results per selected country before cross-country deduplication. 0 = unlimited per country.",
            "default": 25
          },
          "includeDetails": {
            "title": "📋 Include Full Details",
            "type": "boolean",
            "description": "Fetch full job descriptions plus email, phone, URL, and social-profile extraction. Core fields (title, company, location, salary, skills, company data, geo) are always returned regardless.",
            "default": true
          },
          "deliverWithoutDescription": {
            "title": "📭 Also Deliver Jobs Without a Description",
            "type": "boolean",
            "description": "Only applies when Include Full Details is on. A run has a time limit, and descriptions are much slower to collect than core fields — so a large run may reach its limit with some jobs not yet enriched. By default those jobs are NOT delivered, so you are not charged for results that lack the description you asked for. Turn this on to receive them anyway, with their core fields, charged as normal results.",
            "default": false
          },
          "descriptionMaxLength": {
            "title": "✂️ Description Max Length",
            "minimum": 0,
            "type": "integer",
            "description": "Truncate description to N chars. 0 = no truncation.",
            "default": 0
          },
          "outputMode": {
            "title": "🧾 Output Mode",
            "enum": [
              "full",
              "table",
              "compact"
            ],
            "type": "string",
            "description": "Choose full structured output, a table-friendly subset, or compact AI-agent output.",
            "default": "full"
          },
          "compact": {
            "title": "📦 Compact Output",
            "type": "boolean",
            "description": "Legacy alias for outputMode=compact. Core fields only for AI-agent/MCP workflows.",
            "default": false
          },
          "incrementalMode": {
            "title": "♻️ Incremental Mode",
            "type": "boolean",
            "description": "Compare against previous run state.",
            "default": false
          },
          "stateKey": {
            "title": "🔑 State Key",
            "type": "string",
            "description": "Optional stable identifier for the tracked search universe. Leave empty to auto-derive a stable identifier from your search inputs — different keyword/location/filter combinations get isolated state automatically."
          },
          "skipReposts": {
            "title": "🚫 Skip Reposts",
            "type": "boolean",
            "description": "In incremental mode, skip jobs that appear to be reposts of previously-seen expired jobs (same content hash).",
            "default": false
          },
          "emitUnchanged": {
            "title": "📤 Emit Unchanged",
            "type": "boolean",
            "description": "In incremental mode, include unchanged jobs in the dataset. Useful when you want a full snapshot with changeType on every record.",
            "default": false
          },
          "emitExpired": {
            "title": "🧹 Emit Expired",
            "type": "boolean",
            "description": "In incremental mode, include EXPIRED tombstone records for jobs that were active in previous state but are absent from the current result window.",
            "default": false
          },
          "telegramToken": {
            "title": "🤖 Telegram Bot Token",
            "type": "string",
            "description": "Telegram bot token from @BotFather. Required for Telegram notifications."
          },
          "telegramChatId": {
            "title": "💬 Telegram Chat ID",
            "type": "string",
            "description": "Telegram chat or channel ID where alerts are sent (e.g. \"-100123456789\" for a private group, or \"@yourchannel\")."
          },
          "discordWebhookUrl": {
            "title": "🎮 Discord Webhook URL",
            "type": "string",
            "description": "Discord incoming webhook URL. Get one from Server Settings → Integrations → Webhooks."
          },
          "slackWebhookUrl": {
            "title": "💼 Slack Webhook URL",
            "type": "string",
            "description": "Slack incoming webhook URL. Create at api.slack.com/messaging/webhooks."
          },
          "whatsappPhoneNumberId": {
            "title": "📱 WhatsApp Phone Number ID",
            "type": "string",
            "description": "WhatsApp Business phone number ID from Meta Business Manager (NOT the phone number itself — the numeric ID shown next to your business number). Free service-conversation messages within 24 hours of last user-initiated contact."
          },
          "whatsappAccessToken": {
            "title": "🔐 WhatsApp Access Token",
            "type": "string",
            "description": "Meta Cloud API access token with `whatsapp_business_messaging` scope. Get a permanent token from a system user in Meta Business Manager."
          },
          "whatsappTo": {
            "title": "📨 WhatsApp Recipient",
            "type": "string",
            "description": "Recipient phone in E.164 format (e.g. +919876543210). Recipient must have messaged your business number within the last 24 hours — outside that window, free-form text is rejected by Meta."
          },
          "webhookUrl": {
            "title": "🪝 Generic Webhook URL",
            "type": "string",
            "description": "Generic webhook URL that receives a JSON POST with the full job payload + run metadata. Universal escape hatch for n8n / Make / Zapier / your own backend."
          },
          "webhookHeaders": {
            "title": "🔑 Webhook Headers",
            "type": "object",
            "description": "Optional headers (e.g. {\"Authorization\": \"Bearer xyz\"}) sent with the webhook POST."
          },
          "notificationLimit": {
            "title": "📊 Max Jobs Per Notification",
            "minimum": 1,
            "maximum": 20,
            "type": "integer",
            "description": "Maximum number of jobs included in each notification message (1–20). Excess jobs are still in the dataset; notifications get a summary line.",
            "default": 5
          },
          "notifyOnlyChanges": {
            "title": "🔄 Notify Only New/Updated",
            "type": "boolean",
            "description": "When Incremental Mode is on, only send notifications for NEW / UPDATED / REAPPEARED jobs. Has no effect outside incremental mode.",
            "default": false
          },
          "descriptionFormat": {
            "title": "Description format",
            "enum": [
              "all",
              "text",
              "html",
              "markdown"
            ],
            "type": "string",
            "description": "Pick a single description representation. `all` keeps every variant; `text` / `html` / `markdown` drop the others.",
            "default": "all"
          },
          "excludeEmptyFields": {
            "title": "Exclude empty fields from output",
            "type": "boolean",
            "description": "Drop null, empty-string, and empty-array fields from each record before push. Smaller payloads for AI agents and dashboards.",
            "default": false
          },
          "appConnector": {
            "title": "Send results to Notion (or another connected app)",
            "type": "string",
            "description": "Optional. Pick a connected app under Settings → API & Integrations to receive your results. Notion is supported today (a run-summary page); other MCP connectors are best-effort as Apify expands its catalog."
          },
          "mcpIssueTeam": {
            "title": "Issue tracker team",
            "type": "string",
            "description": "Only when the connected app is an issue tracker: the team (name or ID) the summary issue is created under, if that app requires one."
          },
          "lat": {
            "title": "🌐 Latitude",
            "minimum": -90,
            "maximum": 90,
            "type": "number",
            "description": "GPS latitude of the search centre. Pair with Longitude and Search Radius to keep only listings within that radius of this point. The search market is chosen from the centre (a Copenhagen centre searches Denmark), overriding Country; Countries still takes precedence."
          },
          "lon": {
            "title": "🌐 Longitude",
            "minimum": -180,
            "maximum": 180,
            "type": "number",
            "description": "GPS longitude of the search centre. Pair with Latitude."
          },
          "radiusKm": {
            "title": "📏 Search Radius (km)",
            "minimum": 1,
            "maximum": 500,
            "type": "integer",
            "description": "Keep only listings within this many kilometres of the (Latitude, Longitude) centre. Listings whose coordinates are unknown are always kept."
          }
        }
      },
      "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}