Rework Public API
API вакансий и откликов для работодателей, ATS и сторонних разработчиков. Поля вакансий пишутся в JobSearch (таксономии sector/jobtype/skill, meta опыта, локации, зарплаты и способа отклика) — как в кабинете и XML-фидах.
Базовый URL: https://rework.by/api/v2
Как получить доступ
1. Работодатель
- Кабинет работодателя → «Настройки API».
- Создайте приложение (Trusted ATS для
client_credentials). - Сохраните
client_id/client_secret(secret один раз; есть «Новый secret»). - «Согласие на ПДн» — для чтения откликов.
- Опционально: webhooks в том же разделе кабинета.
2. ATS / интегратор
- Заявка → статус
pending(secret ещё нет). - После approve — ключи на email.
- Либо OAuth с каждым employer, либо trusted + привязка employer_id (по договору).
OAuth2
TTL: access 3600 с (1 ч) · refresh 2592000 с (30 дн) · authorization code 600 с (10 мин).
Scopes: vacancies, negotiations (нужно ПДн), webhook, employer.
Client credentials (Trusted)
Требует app: is_trusted=1 и привязанный employer_id. Иначе 403 unauthorized_client. Токен с consent_pdn=0 — для откликов всё равно нужно согласие в кабинете.
POST https://rework.by/api/v2/oauth/token
Content-Type: application/json
{"grant_type":"client_credentials","client_id":"...","client_secret":"..."}
{"access_token":"...","token_type":"bearer","expires_in":3600,"refresh_token":"...","scope":"vacancies,negotiations,webhook,employer"}
Authorization code
Employer должен быть залогинен. redirect_uri — из списка приложения. При scope с negotiations — чекбокс ПДн на authorize.
GET https://rework.by/oauth/authorize?client_id=...&redirect_uri=...&scope=vacancies,negotiations,webhook,employer&state=...
POST https://rework.by/api/v2/oauth/token
{"grant_type":"authorization_code","client_id":"...","client_secret":"...","code":"...","redirect_uri":"..."}
Refresh
{"grant_type":"refresh_token","client_id":"...","client_secret":"...","refresh_token":"..."}
Создание вакансии
Списывается слот пакета JobSearch. Без слотов — 402. Город — только из GET /areas (Беларусь). ПДн кандидатов — только через /negotiations, отдельного поиска резюме нет.
POST https://rework.by/api/v2/vacancies
Authorization: Bearer ACCESS_TOKEN
Content-Type: application/json
{
"name": "Оператор линии",
"description": "<p>Обязанности…</p>",
"location": {
"city_id": "164308",
"address": "ул. Примерная, 1"
},
"sector_id": "145",
"employment_id": "176",
"experience": { "id": "1-3-years" },
"salary": { "from": 1500, "to": 2200, "currency": "BYN", "type": "type_1" },
"application": { "type": "external", "url": "https://company.by/apply" },
"skill_ids": ["267", "272"],
"contact_phones": [{ "phone": "+375 25 536-17-17", "comment": "" }],
"billing_type": "standard"
}
Алиасы: position/body; city_id / area.id; salary.type = type_1…type_5 или negotiable; application.type = internal | external (+ url) | with_email (+ email) | none.
Поля API → JobSearch
| API | JobSearch meta / taxonomy |
|---|---|
name | post_title |
description (+ req/cond) | post_content |
salary.from/to | jobsearch_field_job_salary / _max_salary |
salary.type | jobsearch_field_job_salary_type (type_1…type_5, negotiable) |
location.country/region/city | location_location1/2/3 (таблицы JobSearch, только BY) |
location.address | jobsearch_field_location_address (адрес на карте, не словарь) |
sector_id | taxonomy sector |
employment_id | taxonomy jobtype |
experience.id | meta experience |
skill_ids | taxonomy skill |
application.type | jobsearch_field_job_apply_type |
application.url | jobsearch_field_job_apply_url (при external) |
application.email | jobsearch_field_job_apply_email (при with_email) |
contact_phones[] | jobsearch_field_job_contact_phones (до 3) |
| (авто) | job_expiry_date из пакета |
Словари
Локации — только Беларусь (таблицы jobsearch_*, ~330 городов). country_id в запросе игнорируется.
GET /areas— города BY (+region_id, пагинацияpage/per_page)GET /dictionaries/locations?depth=1|2|3— дерево страна → область → городGET /dictionaries/sectors— деревоsectorGET /dictionaries/employment—jobtypeGET /dictionaries/experience—fresh,1-3-years,3-6-years,6-yearsGET /dictionaries/skills— taxonomyskill(плоский список)GET /dictionaries/salary-types—type_1…type_5,negotiableGET /dictionaries/apply-types—internal,external,with_email,none
Базовые URL и методы
| Метод | Auth | Назначение |
|---|---|---|
| GET /vacancies | нет | Поиск опубликованных |
| GET /employers/me/vacancies | Bearer + vacancies | Список своих вакансий (тот же формат, что поиск) |
| GET /vacancies/{id} | нет | Карточка |
| POST/PUT/DELETE /vacancies/{id} | Bearer + vacancies | CRUD своих |
| GET /vacancies/{id}/negotiations[/{nid}] | Bearer + negotiations + ПДн | Отклики; PATCH status/comment |
| GET /me · /me/vacancy_types | Bearer | Контекст, слоты |
| GET/POST /webhooks · DELETE /webhooks/{id} | Bearer + webhook | Подписки |
| GET /employers/{id} | нет | Профиль компании |
| GET /areas · /dictionaries/* | нет | Словари (локации — только BY) |
GET /resumes не поддерживается — данные кандидатов только в /vacancies/{id}/negotiations при scope negotiations и согласии на ПДн.
Negotiations
Id отклика: префиксы user_ / email_ / ext_. PATCH: {"status":"...","comment":"..."}.
Webhooks
События: vacancy.created, vacancy.updated, negotiation.created.
POST JSON на ваш URL. Заголовки: X-Rework-Event, X-Rework-Signature = HMAC-SHA256(body, secret) hex. Secret показывается один раз при создании (кабинет или API).
{"event":"vacancy.created","created_at":"...","data":{ ... }}
Ошибки
| HTTP | Когда |
|---|---|
| 400 | Валидация (нет name, город не из /areas, неверный application и т.п.) |
| 401 | Неверный client / токен |
| 402 | Нет слотов пакета на публикацию |
| 403 | Нет scope, не trusted CC, нет ПДн на negotiations |
| 404 | Вакансия / ресурс не найден |
Адаптеры ATS
Huntflow
Base: https://rework.by/api/ats/huntflow/v0.1 · Bearer или Basic.
- GET /version
- POST/GET/PUT/DELETE /vacancies[/{id}] — position, body, city, salary, sector/profession, employment/schedule, experience
- GET /vacancies/{id}/responses · .../letters (нужно ПДн)
e-staff
https://rework.by/api/ats/estaff/v2.6/RecruitService — form method=… или SOAP. Поля AddVacancy: Name, Description, City, SalaryFrom/To, Profession/Sector, Employment, Experience…
curl -u CLIENT_ID:CLIENT_SECRET -X POST "https://rework.by/api/ats/estaff/v2.6/RecruitService" -d "method=GetSiteOptions"
Поиск резюме (SearchResumes) не поддерживается — только отклики на вакансии. Полная 1:1 Datex XML — по sample от интегратора.