{
  "openapi": "3.0.1",
  "info": {
    "title": "Russia Jobs Feed Вакансии: hh.ru, Habr Career, Rabota.ru & More",
    "description": "Russian job vacancies (вакансии) from hh.ru, Habr Career (Хабр Карьера), Rabota.ru, Работа России (Trudvsem) and Zarplata.ru in one feed. Same fields from every board: RUB pay with the gross or net flag, 85 regions, metro, duplicate groups, and new, updated or closed jobs on each scheduled run.",
    "version": "0.1",
    "x-build-id": "NZEQiEddBL45Euyub"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/getascraper~russia-jobs-feed/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-getascraper-russia-jobs-feed",
        "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~russia-jobs-feed/runs": {
      "post": {
        "operationId": "runs-sync-getascraper-russia-jobs-feed",
        "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~russia-jobs-feed/run-sync": {
      "post": {
        "operationId": "run-sync-getascraper-russia-jobs-feed",
        "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": {
          "sources": {
            "title": "Job boards",
            "type": "array",
            "description": "Which Russian job boards to read. Each board is searched with the same keywords, cities and filters, and every row says which board it came from. hh.ru is the largest general board and Habr Career is the IT board; both are on by default. Rabota.ru adds mass-market and blue-collar jobs with a gross or net pay flag, Работа России is the government portal (slower, every job has a salary), and Zarplata.ru adds the few jobs posted there that are not on hh.ru. Add them when you need them.",
            "items": {
              "type": "string",
              "enum": [
                "hh-ru",
                "habr-career",
                "rabota-ru",
                "trudvsem",
                "zarplata-ru"
              ],
              "enumTitles": [
                "hh.ru HeadHunter (all job types, gross or net pay, metro, employer rating)",
                "Habr Career Хабр Карьера (IT jobs, skills, seniority)",
                "Rabota.ru Работа.ру (mass-market and blue-collar jobs, gross or net pay)",
                "Работа России Trudvsem (government portal, salary on almost every job; slower)",
                "Zarplata.ru Зарплата.ру (only its own postings when hh.ru is also selected)"
              ]
            },
            "default": [
              "hh-ru",
              "habr-career"
            ]
          },
          "startUrls": {
            "title": "Board links",
            "type": "array",
            "description": "Optional links copied from a supported board: an hh.ru or Zarplata.ru search page or vacancy, a Habr Career search, specialisation, skill or vacancy page, a Rabota.ru search or vacancy page, or a Работа России vacancy card. The board is detected from each link. Empty the Job boards list to read only the pasted links. A link that belongs to no supported board is reported and skipped.",
            "items": {
              "type": "object",
              "required": [
                "url"
              ],
              "properties": {
                "url": {
                  "type": "string",
                  "title": "URL of a web page",
                  "format": "uri"
                }
              }
            }
          },
          "keywords": {
            "title": "Keywords",
            "type": "array",
            "description": "Job titles or skills to search, in Russian or English, for example Python, водитель or менеджер по продажам. Every keyword is searched in every city with each board's own search. Leave empty to browse the newest jobs without a keyword.",
            "default": [
              "Python"
            ],
            "items": {
              "type": "string"
            }
          },
          "expandKeywords": {
            "title": "Add Russian synonyms for English keywords",
            "type": "boolean",
            "description": "Also search a short built-in list of Russian titles for common English ones (for example developer also searches разработчик and программист). Finds more jobs and uses more requests.",
            "default": false
          },
          "cities": {
            "title": "Cities and regions",
            "type": "array",
            "description": "Cities or regions in Russian or English, for example Moscow, Санкт-Петербург, Казань, Татарстан or Свердловская область. All 85 federal subjects and about 170 cities are known. Enter Remote for remote jobs, or Russia (or leave the list empty) to search the whole country. An unknown place is reported with suggestions and never turned into a whole-country search.",
            "default": [
              "Moscow"
            ],
            "items": {
              "type": "string"
            }
          },
          "employmentKind": {
            "title": "Employment types",
            "type": "array",
            "description": "Keep only these kinds of employment. Leave empty for all. Jobs whose type is not stated are dropped when a type is chosen.",
            "items": {
              "type": "string",
              "enum": [
                "fulltime",
                "parttime",
                "project",
                "internship",
                "temporary",
                "rotation",
                "volunteer"
              ],
              "enumTitles": [
                "Full-time (полная занятость)",
                "Part-time (частичная занятость)",
                "Project work (проектная работа)",
                "Internship (стажировка)",
                "Temporary or seasonal (временная работа)",
                "Rotation (вахта)",
                "Volunteer (волонтёрство)"
              ]
            },
            "default": []
          },
          "remoteOnly": {
            "title": "Remote jobs only",
            "type": "boolean",
            "description": "Keep only jobs the board describes as remote or partly remote (hybrid). Jobs that do not say are dropped.",
            "default": false
          },
          "experience": {
            "title": "Experience",
            "enum": [
              "any",
              "none",
              "1-3",
              "3-6",
              "6-plus"
            ],
            "type": "string",
            "description": "Keep jobs whose required experience falls in this band, using the same four bands as hh.ru. Jobs that do not state experience are dropped when a band is chosen.",
            "default": "any"
          },
          "education": {
            "title": "Minimum education",
            "enum": [
              "any",
              "secondary",
              "vocational",
              "higher",
              "master",
              "phd"
            ],
            "type": "string",
            "description": "Keep jobs that ask for at least this level. Jobs that do not state an education level are dropped when a level is chosen.",
            "default": "any"
          },
          "minMonthlySalaryRub": {
            "title": "Minimum monthly salary (RUB)",
            "minimum": 0,
            "maximum": 100000000,
            "type": "integer",
            "description": "Keep jobs whose published monthly pay reaches at least this amount in roubles. Yearly pay is divided by 12. Hourly, shift and daily pay is compared only when the board itself publishes a monthly figure for it. Jobs with no published pay are dropped when this is set. Each row keeps the board's own gross (before tax) or net (take-home) flag, so you can tell the two apart."
          },
          "maxMonthlySalaryRub": {
            "title": "Maximum monthly salary (RUB)",
            "minimum": 0,
            "maximum": 100000000,
            "type": "integer",
            "description": "Keep jobs whose published monthly pay starts at or below this amount in roubles."
          },
          "onlyDisclosedSalary": {
            "title": "Only jobs with a published salary",
            "type": "boolean",
            "description": "Drop jobs that say pay is negotiable (по договорённости) or show no pay at all.",
            "default": false
          },
          "postedWithinDays": {
            "title": "Posted within (days)",
            "minimum": 1,
            "maximum": 365,
            "type": "integer",
            "description": "Keep jobs posted or updated within this many days. Jobs that carry no date cannot be checked and are dropped when this is set."
          },
          "companyNames": {
            "title": "Company names",
            "type": "array",
            "description": "Keep only jobs from companies whose name contains one of these words, for example Сбер or Яндекс.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "excludeKeywords": {
            "title": "Exclude words",
            "type": "array",
            "description": "Drop jobs whose title, company, category, skills or tags contain any of these words.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "includeDescription": {
            "title": "Include full description",
            "type": "boolean",
            "description": "Add the job description, key skills and listing end date. On hh.ru, Zarplata.ru, Habr Career and Rabota.ru this reads one extra page per job, so runs are slower and rows are larger.",
            "default": false
          },
          "includeRecruiterSignals": {
            "title": "Include viewer and response counts",
            "type": "boolean",
            "description": "Add how many people are viewing a job right now and how many have responded, where the board shows it (hh.ru, Zarplata.ru). Counts only, never names.",
            "default": false
          },
          "includeSourceFields": {
            "title": "Include board source record",
            "type": "boolean",
            "description": "Attach the board's own record under provenance, for audits and fields not mapped to the common format. Recruiter names, phones and e-mails are removed first.",
            "default": false
          },
          "convertToUsd": {
            "title": "Add USD salary figures",
            "type": "boolean",
            "description": "Add monthly pay in US dollars using the current exchange rate. Salaries already published in dollars always get USD figures. If the rate cannot be loaded the USD fields are left out.",
            "default": false
          },
          "monitorScope": {
            "title": "Monitor name",
            "type": "string",
            "description": "Give a name to track this search over time. Each run marks every row NEW, UPDATED, UNCHANGED or REOPENED, and a job that stays gone on two complete scans is reported CLOSED. Use the same name and settings on every scheduled run. Leave empty for a one-off run.",
            "default": ""
          },
          "outputMode": {
            "title": "Output mode",
            "enum": [
              "all",
              "changesOnly",
              "compact"
            ],
            "type": "string",
            "description": "All rows with every field, only rows that are new or changed since the last run, or a short compact row for feeds. Compact rows keep one row per job.",
            "default": "all"
          },
          "uniqueOnly": {
            "title": "One row per job across boards",
            "type": "boolean",
            "description": "When the same job is listed on several boards, keep only the richest copy. Every row carries a cluster id either way, so you can also group them yourself.",
            "default": false
          },
          "includeClosed": {
            "title": "Report closed jobs",
            "type": "boolean",
            "description": "When monitoring, add a short CLOSED row for each job that disappeared on two complete scans. Closed rows count as delivered rows.",
            "default": true
          },
          "maxTotalRows": {
            "title": "Maximum rows in total",
            "minimum": 1,
            "maximum": 10000,
            "type": "integer",
            "description": "Hard limit on rows delivered by the whole run. It is shared fairly between the boards, and a board that finds less hands its share to the others.",
            "default": 25
          },
          "maxItemsPerSource": {
            "title": "Maximum rows per board",
            "minimum": 1,
            "maximum": 2000,
            "type": "integer",
            "description": "Most jobs read from one board in this run (split across your keyword and city combinations).",
            "default": 25
          },
          "maxPagesPerSource": {
            "title": "Maximum result pages per search",
            "minimum": 1,
            "maximum": 100,
            "type": "integer",
            "description": "Most result pages read for each keyword and city on a board. hh.ru and Zarplata.ru pages hold up to 100 jobs and the sites show at most 2,000 per search; Работа России pages hold 100, Rabota.ru 30 and Habr Career 25. A search that stops here is not treated as complete, so it can not report closed jobs.",
            "default": 5
          },
          "proxyConfiguration": {
            "title": "Proxy",
            "type": "object",
            "description": "Optional. By default each board is read without a proxy first and moves to a datacenter proxy only if it is refused. A proxy chosen here is used for every board instead."
          },
          "boardOptions": {
            "title": "Board-specific options",
            "type": "object",
            "description": "Optional per-board settings as JSON, keyed by board id. hh-ru and zarplata-ru accept orderBy (relevance, publication_time, salary_desc, salary_asc). habr-career accepts qid (seniority, for example 4 for Middle, 5 for Senior), s (specialisation ids), skills (skill ids) and sort. Unknown keys are ignored.",
            "default": {}
          }
        }
      },
      "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}