{
  "openapi": "3.0.1",
  "info": {
    "title": "Habr Career Scraper: Вакансии Хабр Карьера",
    "description": "Scrape Habr Career (Хабр Карьера) tech job vacancies with structured skill tags, specialization, and full description, plus real, large-sample Russian IT salary benchmarks by seniority level from Habr's own public salary survey. Includes a new-postings monitor for a saved search. No login required.",
    "version": "0.1",
    "x-build-id": "BOG8Dfb1eEFTXoPPC"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/getascraper~habr-career-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-getascraper-habr-career-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/getascraper~habr-career-scraper/runs": {
      "post": {
        "operationId": "runs-sync-getascraper-habr-career-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/getascraper~habr-career-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-getascraper-habr-career-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": {
          "keywords": {
            "title": "Keywords",
            "type": "string",
            "description": "Free-text search query, matching sibling actor hh-ru-jobs-scraper's field name so results can be merged across both. Sent as Habr Career's own search query. Ignored when Division or Skills below is set, since Habr Career only supports one filter dimension per search (see the README for details).",
            "default": ""
          },
          "vacancyUrls": {
            "title": "Vacancy URLs",
            "type": "array",
            "description": "Specific Habr Career vacancy URLs (or bare numeric vacancy IDs) to scrape instead of running a search. When set, this replaces Keywords/Division/Skills/City entirely. Also the source for a repeat check of a known shortlist across runs.",
            "default": [],
            "items": {
              "type": "object",
              "required": [
                "url"
              ],
              "properties": {
                "url": {
                  "type": "string",
                  "title": "URL of a web page",
                  "format": "uri"
                }
              }
            }
          },
          "division": {
            "title": "Division (Specialization)",
            "type": "string",
            "description": "Browse a single specialization/division, using Habr Career's own taxonomy path (group/alias). Real, confirmed slugs are suggested below, but any valid Habr Career division path can be typed in. Takes priority over Skills and Keywords/City when set, since Habr Career's site only supports one filter dimension per search.",
            "default": ""
          },
          "skills": {
            "title": "Skills",
            "type": "array",
            "description": "Filter by a single skill tag, using Habr Career's own canonical skill slug (e.g. spring-boot, docker, kubernetes). Real, confirmed slugs are suggested below. Only the first value is used if more than one is given, since Habr Career's skill browse page does not support combining skills. Ignored when Division is set.",
            "items": {
              "type": "string",
              "enum": [
                "spring-boot",
                "docker",
                "kubernetes",
                "kafka",
                "jenkins",
                "python",
                "java",
                "javascript",
                "react",
                "postgresql"
              ],
              "enumTitles": [
                "Spring Boot",
                "Docker",
                "Kubernetes",
                "Apache Kafka",
                "Jenkins",
                "Python",
                "Java",
                "JavaScript",
                "React",
                "PostgreSQL"
              ]
            },
            "default": []
          },
          "city": {
            "title": "City",
            "type": "string",
            "description": "Filter to vacancies located in one Russian city. Resolved to Habr Career's own internal city ID via a small built-in lookup of major tech hubs; an unrecognized city is ignored with a warning rather than guessed. Combines with Keywords, but ignored when Division or Skills is set.",
            "default": ""
          },
          "proxyConfiguration": {
            "title": "Proxy Configuration",
            "type": "object",
            "description": "Datacenter proxy is sufficient for Habr Career: real-Chrome, Googlebot, and empty-User-Agent requests all reached full real content with no CAPTCHA or WAF challenge encountered at the depth tested (QRATOR, present in the server header, is confirmed purely passive).",
            "default": {
              "useApifyProxy": true
            }
          },
          "includeSalaryBenchmarks": {
            "title": "Include Salary Benchmarks",
            "type": "boolean",
            "description": "Fetches Habr Career's own public Russian IT salary survey once per run and adds it as a separate Salary Benchmarks dataset view: real, large-sample compensation data (min/max/percentiles/sample size) broken down by seniority level (Junior/Middle/Senior/Lead). Cheap regardless of Maximum Vacancies, since it is one extra page fetch per run, not per vacancy, so it defaults on.",
            "default": true
          },
          "maxItems": {
            "title": "Maximum Vacancies",
            "minimum": 1,
            "maximum": 200,
            "type": "integer",
            "description": "Maximum number of vacancies to return per run. Kept low by default so the unmodified default input finishes quickly; raise it for a larger pull once you know your search returns useful results.",
            "default": 20
          },
          "onlyNewListings": {
            "title": "Alert on New Listings",
            "type": "boolean",
            "description": "New-postings monitor mode: re-runs the same search (or Vacancy URLs list) and outputs only vacancies not seen in a previous run that used the same State Name below, a standing-search new-listing alert. Run this Actor on a schedule with the same State Name to build a watch.",
            "default": false
          },
          "stateName": {
            "title": "State Name",
            "type": "string",
            "description": "Identifies which saved search this run's monitor state belongs to. Use a different value for each independent watch you want to track in parallel (e.g. \"backend-moscow\" vs \"devops-remote\").",
            "default": "default"
          },
          "resetState": {
            "title": "Reset State",
            "type": "boolean",
            "description": "Clears the persisted monitor state for State Name before this run, so the next run treats every vacancy as new again. Use this to start a watch over from scratch.",
            "default": false
          }
        }
      },
      "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}