> ## Documentation Index
> Fetch the complete documentation index at: https://docs.pubrio.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Поиск вакансий

> Находите открытые вакансии по компании, должности, функции, уровню опыта, стране и дате запуска — и читайте классификацию, которую Pubrio добавляет к каждой публикации.

[Job Search](/ru/api-reference/endpoint/companies/job_search) возвращает открытые вакансии, зафиксированные Pubrio, по одной строке на публикацию, каждая связана с компанией, которая её опубликовала. Каждая строка несёт исходную публикацию (должность, локация, URL, дата публикации) плюс три поля, которые Pubrio выводит из должности: `functions`, `seniority_rank` и `location_id`.

```bash theme={null}
curl -X POST https://api.pubrio.com/companies/jobs/search \
  -H "pubrio-api-key: $PUBRIO_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "domains": ["stripe.com"],
    "seniority_ranks": [4, 5],
    "launch_dates": ["2026-08-01", "2026-08-31"],
    "per_page": 25
  }'
```

## Когда это использовать

* **Сигналы найма по одному аккаунту** — передайте компанию и посмотрите, на кого они нанимают, где и на каком уровне.
* **Поиск потенциальных клиентов по роли** — ищите по стране компании, открывающие вакансии старших инженеров или продавцов, затем переходите к [People Search](/ru/api-reference/endpoint/people/search) с `domain_search_id` из каждой строки.
* **Инкрементальная синхронизация** — опрашивайте с `created_at`, установленным на самое новое время загрузки, которое у вас сохранено.

Если вам нужен текущий подсчёт, а не строки, используйте [Job Insights](/ru/api-reference/endpoint/companies/job_insights). Если вы хотите получать уведомление, когда компания публикует вакансию, создайте [Monitor](/ru/developer-guides/examples/tracking-job-postings) с `signal_types: ["jobs"]`.

## Область охвата по компании

Самые быстрые поиски называют компанию. Все три идентификатора разрешаются в одну и ту же запись и могут смешиваться:

| Ключ            | Значение                                      | Примечания                                                     |
| --------------- | --------------------------------------------- | -------------------------------------------------------------- |
| `domains`       | `["stripe.com"]`                              | URL вида `https://www.stripe.com/jobs` нормализуются до домена |
| `linkedin_urls` | `["https://www.linkedin.com/company/stripe"]` | Только страницы компаний                                       |
| `companies`     | `["5378845d-7726-4817-aba9-ced8c5f41dee"]`    | `domain_search_id` из любого предыдущего ответа                |

Поиски без указания компании разрешены — `{"locations": ["SG"], "seniority_ranks": [5]}` работает — но они учитываются относительно всего индекса. `total_entries` в этом случае является оценкой, и `is_timeout` может быть `true` при очень широких фильтрах.

## Фильтры

### Текст

| Ключ           | Тип        | Совпадает                                                                                                                                    |
| -------------- | ---------- | -------------------------------------------------------------------------------------------------------------------------------------------- |
| `titles`       | `string[]` | Должности. Совпадение на уровне слов, поэтому `["engineer"]` также возвращает `Senior Software Engineer`. Любая из перечисленных должностей. |
| `search_term`  | `string`   | Свободный текст по заголовку публикации.                                                                                                     |
| `search_terms` | `string[]` | Несколько терминов свободного текста, любой из которых может совпасть.                                                                       |

### Классификация

| Ключ              | Тип         | Совпадает                                                                                                                                                                                                  |
| ----------------- | ----------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `functions`       | `string[]`  | Slug функций, выведенные из должности: `engineering`, `sales`, `marketing`, `finance`, `product_management`, … Любой из перечисленных slug. См. [Функции вакансий](/ru/api-reference/enums#job-functions). |
| `seniority_ranks` | `integer[]` | `1` junior · `2` senior · `3` manager · `4` director · `5` executive. См. [Уровни опыта](/ru/api-reference/enums#seniority-ranks).                                                                         |

<Warning>
  Эти два ведут себя по-разному при некорректном вводе. Неизвестный slug `functions` возвращает **ноль** строк. Значение `seniority_ranks` вне диапазона 1–5 **игнорируется** и возвращает каждую строку. Ни один из случаев не вызывает ошибку.
</Warning>

### Даты

| Ключ           | Тип                        | Совпадает                                                                                                                                                                                                    |
| -------------- | -------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| `launch_dates` | `[from, to]`               | Дата запуска публикации — `posting_date`, когда издатель её указывает, иначе день, когда Pubrio впервые её увидел. Границы дня по UTC; согласуется с Job Insights, поэтому **используйте это по умолчанию.** |
| `posted_dates` | `[from, to]`               | Только `posting_date`. Границы дня следуют часовому поясу вашей рабочей области.                                                                                                                             |
| `created_at`   | дата или ISO-метка времени | Загружено в этот момент или позже (UTC). Передайте точный `created_at` самой новой сохранённой строки для инкрементального опроса.                                                                           |

Оба окна включительны. `launch_dates` с одним элементом совпадает с этим единственным днём.

### Локация

| Ключ                | Тип         | Совпадает                                                                                                                                                                |
| ------------------- | ----------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| `locations`         | `string[]`  | Страна публикации, ISO alpha-2.                                                                                                                                          |
| `exclude_locations` | `string[]`  | Страна публикации для исключения.                                                                                                                                        |
| `location_ids`      | `integer[]` | Страна публикации по `location_id` Pubrio — тем же числам, что несёт эндпоинт [Locations](/ru/api-reference/endpoint/locations/locations) и `location_id` каждой строки. |
| `company_locations` | `string[]`  | Страна **штаб-квартиры компании**, которая может отличаться от места публикации вакансии.                                                                                |

### Пагинация и порядок

| Ключ                 | По умолчанию | Примечания                                                                               |
| -------------------- | ------------ | ---------------------------------------------------------------------------------------- |
| `per_page`           | 25           | Ограничено `max_search_per_page` вашего тарифа.                                          |
| `page`               | 1            | Ограничено `max_search_page`; `total_display_pages` ответа сообщает вам потолок.         |
| `is_ascending_order` | `false`      | Строки упорядочены по `created_at`, сначала новые. `true` переключает на сначала старые. |

## Как выглядит строка

```json theme={null}
{
  "job_id": "4418496a-6a4f-4432-8910-50153e9ba27c",
  "job_search_id": "4418496a-6a4f-4432-8910-50153e9ba27c",
  "created_at": "2026-08-30T00:02:52.531Z",
  "last_modified": "2026-09-01T16:08:09.324Z",
  "title": "Finance and Strategy Partner",
  "job_url": "https://www.linkedin.com/jobs/view/4460586030",
  "location": "United States",
  "location_id": 357,
  "country": "United States",
  "country_code": "US",
  "posting_date": "2026-08-29",
  "source_type": "linkedin",
  "functions": ["consulting"],
  "seniority_rank": 5,
  "base_salary": null,
  "experience_requirement": null,
  "education_requirement": null,
  "employment_type": null,
  "companies": {
    "domain_search_id": "5378845d-7726-4817-aba9-ced8c5f41dee",
    "company_name": "Stripe",
    "linkedin_name": "stripe",
    "country_code": "US",
    "company_url": "https://stripe.com/",
    "domain": "stripe.com",
    "logo_url": "https://buckets.pubrio.com/company-logo/....jpg"
  }
}
```

* `functions` равно `null`, а `seniority_rank` равно `0`, когда должность не удалось классифицировать. Всё равно фильтруйте по ним — неклассифицированные строки просто не совпадают.
* `posting_date` — дата издателя; `created_at` — момент, когда Pubrio впервые увидел публикацию, и является ключом сортировки по умолчанию.
* `job_id` и `job_search_id` — одно и то же значение; передайте любое из них в [Job Lookup](/ru/api-reference/endpoint/companies/job_lookup).

### Проверяйте `metadata`, прежде чем доверять результату

```json theme={null}
"metadata": {
  "profile": null,
  "filters": { "domains": ["stripe.com"], "seniority_ranks": [4, 5], "per_page": 25, "language": "en" },
  "ignored_fields": []
}
```

`ignored_fields` перечисляет любой ключ тела, который эндпоинт не распознал. Опечатка вроде `"seniorty_ranks"` не приводит к сбою запроса — она молча расширяет его. Проверяйте, что этот массив пуст в любой автоматизации.

## Рецепты

<Tabs>
  <Tab title="Найм старших инженеров за последние 30 дней">
    <CodeGroup>
      ```bash cURL theme={null}
      curl -X POST https://api.pubrio.com/companies/jobs/search \
        -H "pubrio-api-key: $PUBRIO_API_KEY" \
        -H "Content-Type: application/json" \
        -d '{
          "domains": ["stripe.com", "adyen.com", "checkout.com"],
          "functions": ["engineering", "data_science"],
          "seniority_ranks": [3, 4, 5],
          "launch_dates": ["2026-08-05", "2026-09-04"],
          "per_page": 25
        }'
      ```

      ```python Python theme={null}
      import os, requests

      r = requests.post(
          "https://api.pubrio.com/companies/jobs/search",
          headers={"pubrio-api-key": os.environ["PUBRIO_API_KEY"], "Content-Type": "application/json"},
          json={
              "domains": ["stripe.com", "adyen.com", "checkout.com"],
              "functions": ["engineering", "data_science"],
              "seniority_ranks": [3, 4, 5],
              "launch_dates": ["2026-08-05", "2026-09-04"],
              "per_page": 25,
          },
      )
      body = r.json()
      assert body["metadata"]["ignored_fields"] == []
      for job in body["data"]["jobs"]:
          print(job["companies"]["company_name"], "-", job["title"], job["seniority_rank"])
      ```
    </CodeGroup>
  </Tab>

  <Tab title="Кто нанимает руководителей продаж в Сингапуре">
    ```bash cURL theme={null}
    curl -X POST https://api.pubrio.com/companies/jobs/search \
      -H "pubrio-api-key: $PUBRIO_API_KEY" \
      -H "Content-Type: application/json" \
      -d '{
        "locations": ["SG"],
        "functions": ["sales", "business_development"],
        "seniority_ranks": [4, 5],
        "launch_dates": ["2026-08-01", "2026-09-04"],
        "per_page": 25
      }'
    ```

    Сгруппируйте строки по `companies.domain_search_id` — каждая отдельная компания является потенциальным клиентом, и её id идёт напрямую в `companies` в [People Search](/ru/api-reference/endpoint/people/search).
  </Tab>

  <Tab title="Инкрементальная синхронизация">
    ```python Python theme={null}
    import os, requests

    API = "https://api.pubrio.com/companies/jobs/search"
    HEADERS = {"pubrio-api-key": os.environ["PUBRIO_API_KEY"]}

    def sync(domains, since):
        """Получить каждую публикацию, загруженную в `since` (ISO-метка времени) или позже. Возвращает новый курсор."""
        newest = since
        page = 1
        while True:
            body = requests.post(API, headers=HEADERS, json={
                "domains": domains, "created_at": since, "page": page, "per_page": 25,
            }).json()
            rows = body["data"]["jobs"]
            if not rows:
                break
            for job in rows:  # сначала новые
                newest = max(newest, job["created_at"])
                print(job["job_id"], job["title"])  # обновите здесь свою базу данных (upsert)
            if page >= body["data"]["pagination"]["total_display_pages"]:
                break
            page += 1
        return newest

    cursor = sync(["stripe.com"], "2026-09-01T00:00:00Z")
    # сохраните `cursor` и передайте его как `since` в следующем запуске
    ```

    Курсор — это полное значение `created_at` самой новой сохранённой строки, поэтому при следующем запуске повторно доставляется только эта одна строка. Выполняйте upsert по `job_id`. Строки приходят сначала новые, поэтому загруженный день никогда не сдвигает курсор за предел страничного лимита вашего тарифа.
  </Tab>
</Tabs>

## Связанное

<CardGroup cols={2}>
  <Card title="Справочник Job Search" icon="code" href="/ru/api-reference/endpoint/companies/job_search">
    Каждый параметр и поле ответа.
  </Card>

  <Card title="Job Insights" icon="chart-column" href="/ru/api-reference/endpoint/companies/job_insights">
    Количество по функциям, уровню опыта, стране и неделе для одной компании.
  </Card>

  <Card title="Перечисления и константы" icon="list" href="/ru/api-reference/enums">
    Уровни опыта и полный словарь функций вакансий.
  </Card>

  <Card title="Отслеживание вакансий с помощью мониторов" icon="bell" href="/ru/developer-guides/examples/tracking-job-postings">
    Получайте вебхук вместо опроса.
  </Card>
</CardGroup>
