{
  "title": "Hiring.cafe Jobs Scraper Input",
  "type": "object",
  "schemaVersion": 1,
  "properties": {
    "searchQueries": {
      "title": "Search Queries",
      "type": "array",
      "description": "Keywords to search on hiring.cafe (e.g., 'software engineer', 'data scientist'). Empty array or empty string returns unfiltered results.",
      "editor": "stringList",
      "prefill": [
        "software engineer"
      ]
    },
    "workplaceTypes": {
      "title": "Workplace Types",
      "type": "array",
      "description": "Filter by workplace type. Defaults to all three.",
      "editor": "select",
      "prefill": [
        "Remote",
        "Hybrid",
        "Onsite"
      ],
      "items": {
        "type": "string",
        "enum": [
          "Remote",
          "Hybrid",
          "Onsite"
        ]
      },
      "default": [
        "Remote",
        "Hybrid",
        "Onsite"
      ]
    },
    "locations": {
      "title": "Locations",
      "type": "array",
      "description": "Filter to jobs in these locations. Pass plain strings like [\"San Francisco\", \"London\", \"United States\"] OR objects with {label, value, countryCode, stateCode, city, lat, lng}. Empty list = global (all locations). Hiring.cafe matches both city names and country names.",
      "editor": "stringList",
      "nullable": true,
      "prefill": []
    },
    "jobTitleQuery": {
      "title": "Job title contains",
      "type": "string",
      "description": "Filter to jobs whose TITLE contains this phrase. More precise than the general search query.",
      "editor": "textfield",
      "nullable": true
    },
    "jobDescriptionQuery": {
      "title": "Job description contains",
      "type": "string",
      "description": "Filter to jobs whose DESCRIPTION contains this phrase.",
      "editor": "textfield",
      "nullable": true
    },
    "technologyKeywordsQuery": {
      "title": "Technology keywords",
      "type": "string",
      "description": "Match against the parsed tech-stack tags (e.g. python, react, kubernetes).",
      "editor": "textfield",
      "nullable": true
    },
    "requirementsKeywordsQuery": {
      "title": "Requirements keywords",
      "type": "string",
      "description": "Match against parsed requirement bullets.",
      "editor": "textfield",
      "nullable": true
    },
    "companyNames": {
      "title": "Companies (whitelist)",
      "type": "array",
      "description": "Only return jobs from these companies. Empty = all companies.",
      "editor": "stringList",
      "nullable": true
    },
    "excludedCompanyNames": {
      "title": "Companies (blacklist)",
      "type": "array",
      "description": "Exclude jobs from these companies.",
      "editor": "stringList",
      "nullable": true
    },
    "companyKeywords": {
      "title": "Company name keywords",
      "type": "array",
      "description": "Substring match on company name.",
      "editor": "stringList",
      "nullable": true
    },
    "excludedCompanyKeywords": {
      "title": "Excluded company keywords",
      "type": "array",
      "description": "Substring match on company name; exclude these.",
      "editor": "stringList",
      "nullable": true
    },
    "industries": {
      "title": "Industries",
      "type": "array",
      "description": "Filter to companies in these industries.",
      "editor": "stringList",
      "nullable": true
    },
    "excludedIndustries": {
      "title": "Excluded industries",
      "type": "array",
      "description": "Exclude companies in these industries.",
      "editor": "stringList",
      "nullable": true
    },
    "salaryCurrency": {
      "title": "Salary currency",
      "type": "string",
      "description": "Filter salary thresholds against this currency. Empty = any.",
      "editor": "select",
      "enum": [
        "",
        "USD",
        "EUR",
        "GBP",
        "CAD",
        "AUD",
        "INR",
        "JPY",
        "CNY",
        "MXN",
        "BRL"
      ],
      "default": ""
    },
    "salaryFrequency": {
      "title": "Salary frequency",
      "type": "string",
      "description": "Pay period for salary thresholds.",
      "editor": "select",
      "enum": [
        "",
        "Yearly",
        "Monthly",
        "Weekly",
        "Daily",
        "Hourly"
      ],
      "default": ""
    },
    "minSalary": {
      "title": "Minimum salary",
      "type": "integer",
      "description": "Lower bound for compensation. Combined with currency + frequency.",
      "editor": "number",
      "minimum": 0,
      "nullable": true
    },
    "maxSalary": {
      "title": "Maximum salary",
      "type": "integer",
      "description": "Upper bound for compensation.",
      "editor": "number",
      "minimum": 0,
      "nullable": true
    },
    "onlyTransparentSalaries": {
      "title": "Only transparent salaries",
      "type": "boolean",
      "description": "Exclude jobs that dont publish a salary range.",
      "default": false,
      "prefill": false
    },
    "minYearsExperience": {
      "title": "Minimum years of experience",
      "type": "integer",
      "description": "Filter to jobs requiring at least this many years experience.",
      "editor": "number",
      "minimum": 0,
      "maximum": 50,
      "default": 0
    },
    "maxYearsExperience": {
      "title": "Maximum years of experience",
      "type": "integer",
      "description": "Filter to jobs requiring at most this many years experience.",
      "editor": "number",
      "minimum": 0,
      "maximum": 50,
      "default": 20
    },
    "securityClearances": {
      "title": "Security clearances",
      "type": "array",
      "description": "Filter by clearance level. Empty = all jobs.",
      "editor": "select",
      "items": {
        "type": "string",
        "enum": [
          "None",
          "Confidential",
          "Secret",
          "Top Secret",
          "Top Secret/SCI",
          "Public Trust",
          "Interim Clearances",
          "Other"
        ]
      },
      "nullable": true
    },
    "sortBy": {
      "title": "Sort order",
      "type": "string",
      "description": "Result ordering.",
      "editor": "select",
      "enum": [
        "default",
        "newest",
        "oldest",
        "salary_high_to_low",
        "salary_low_to_high"
      ],
      "enumTitles": [
        "Relevance (default)",
        "Newest first",
        "Oldest first",
        "Salary (high → low)",
        "Salary (low → high)"
      ],
      "default": "default"
    },
    "seniorityLevels": {
      "title": "Seniority Levels",
      "type": "array",
      "description": "Filter by seniority level.",
      "editor": "select",
      "items": {
        "type": "string",
        "enum": [
          "No Prior Experience Required",
          "Entry Level",
          "Mid Level",
          "Senior Level",
          "Director",
          "Executive"
        ]
      },
      "default": [
        "No Prior Experience Required",
        "Entry Level",
        "Mid Level",
        "Senior Level",
        "Director",
        "Executive"
      ]
    },
    "commitmentTypes": {
      "title": "Commitment Types",
      "type": "array",
      "description": "Filter by employment commitment.",
      "editor": "select",
      "items": {
        "type": "string",
        "enum": [
          "Full Time",
          "Part Time",
          "Contract",
          "Internship",
          "Temporary",
          "Seasonal",
          "Volunteer"
        ]
      },
      "default": [
        "Full Time",
        "Part Time",
        "Contract",
        "Internship",
        "Temporary",
        "Seasonal",
        "Volunteer"
      ]
    },
    "dateFetchedPastNDays": {
      "title": "Posted Within (days)",
      "type": "integer",
      "description": "Only include jobs fetched within the last N days.",
      "minimum": 1,
      "maximum": 365,
      "default": 30
    },
    "maxItems": {
      "title": "Max Items",
      "type": "integer",
      "description": "Maximum number of jobs to return across all queries.",
      "minimum": 1,
      "maximum": 1000,
      "default": 50,
      "prefill": 3
    }
  },
  "required": []
}
