Rabota.ru Data API: vacancies, resumes and applications
Rabota.ru's Android client signs in at /v1/auth/password (login, password, recaptchaResponse → token, tokenV3.accessToken) or /v1/auth/code (accessCode), then hydrates Me with /v1/account/profile — id, first_name, last_name, email, phones and has_resume. Signed-in calls attach that token as an X-Token header.
Search posts /v1/jobs/query (total, relevant, vacancies, similarVacancies, facets) and detail cards come from /v1/jobs/cards. Applications ride /v1/applications/create and /v1/applications; resumes, views and stats are /v1/cv, /v1/cv/viewers and /v1/cv/stats. Favourites, vacancy-alert subscriptions and recruiter chat live at /v1/jobs/saved, /v1/alerts and /v1/messages.
Rabota.ru: Job search app (package ru.rabota.app2, versionName 6.7.2) is Работа.ру's Android client for vacancy search, resumes, applications and recruiter chat on the rabota.ru job board. The app talks to a first-party JSON API over HTTPS. Most calls POST a JSON body wrapped as {request: ...}. Signed-in traffic attaches an X-Token header minted at password or one-time-code login (token plus tokenV3.accessToken). Vacancy cards expose title, salary.from/to/currencySign, company.name and places; resumes expose full_name, position and is_published. The surface below covers password and one-time-code login, the signed-in profile, vacancy search with similar results, applications, resumes, resume views, saved vacancies, vacancy-alert subscriptions, recruiter chat and profession salary aggregates.
Screenshots
API surface
Password login and mint X-Token
POST
/v1/auth/passwordosintAuthenticates email or phone plus password (with recaptchaResponse) and returns the session token that every later signed-in call carries as X-Token, plus tokenV3 accessToken, expiresIn and signature.
Auth: Unauthenticated. Response token is sent as the X-Token header on later signed-in calls.
- login
- password
- recaptchaResponse
- success
- token
- tokenV3
- accessToken
- expiresIn
- signature
Illustrative example reconstructed from the app's interface — not a live capture.
POST /v1/auth/password HTTP/1.1 Content-Type: application/json Accept: application/json { "login": "[email protected]", "password": "********", "recaptchaResponse": "03AGdBq25..." }{ "success": true, "token": "xt_7f3a9c2e1b", "tokenV3": { "accessToken": "at_9c1d4e77", "expiresIn": 2592000, "signature": "sig_b41e02" } }Derived from the app's interface; endpoint details are illustrative, not a live capture.
Reconstructed from the email/phone password sign-in screenSession payload carries token, tokenV3.accessToken, expiresIn and signature
One-time-code login
POST
/v1/auth/codeosintCompletes the SMS or email access-code sign-in and mints the same X-Token session as password login.
Auth: Unauthenticated. login plus accessCode from the SMS/email code flow. Returns the same token / tokenV3 pair as password login.
- login
- accessCode
- success
- token
- tokenV3
- accessToken
- expiresIn
- signature
Illustrative example reconstructed from the app's interface — not a live capture.
POST /v1/auth/code HTTP/1.1 Content-Type: application/json Accept: application/json { "login": "+79991234567", "accessCode": "482913" }{ "success": true, "token": "xt_8a21c0", "tokenV3": { "accessToken": "at_c0ffee", "expiresIn": 2592000, "signature": "sig_91ab" } }Derived from the app's interface; endpoint details are illustrative, not a live capture.
Reconstructed from the SMS/email one-time-code sign-in screenSame token / tokenV3 shape as the password login response
Fetch signed-in profile
POST
/v1/account/profileosintReturns the signed-in applicant profile (id, first_name, last_name, email, phones, has_resume, status, photo) used by the Me tab and resume editor.
Auth: X-Token header from password or one-time-code login.
- id
- first_name
- middle_name
- last_name
- value
- confirmed
- phones
- numberInternational
- extension
- isAccepted
- isMain
- isConfirmed
- has_resume
- status
- photo
- region
- birth_at
- is_available_autoresponse
- fields
Illustrative example reconstructed from the app's interface — not a live capture.
POST /v1/account/profile HTTP/1.1 X-Token: xt_7f3a9c2e1b Content-Type: application/json Accept: application/json { "fields": ["id", "first_name", "last_name", "email", "phones", "has_resume", "status", "photo"] }{ "id": 4412001, "first_name": "Ivan", "middle_name": "Sergeevich", "last_name": "Petrov", "email": {"value": "[email protected]", "confirmed": true}, "phones": [{ "numberInternational": "+79991234567", "extension": null, "isAccepted": true, "isMain": true, "isConfirmed": true }], "has_resume": true, "status": {"id": "active"}, "photo": {"url": "https://cdn.example.org/photo/4412001.jpg"}, "region": {"id": 1, "name": "Москва"}, "birth_at": "1992-04-12", "is_available_autoresponse": true }Derived from the app's interface; endpoint details are illustrative, not a live capture.
Reconstructed from the Me tab and resume editor flowField names taken from the signed-in profile payload
Search vacancies with similar results
POST
/v1/jobs/queryopendataReturns a paged vacancy listing plus similarVacancies and facets for the search-results screen (title, salary.from/to/currencySign, company, places).
Auth: Optional X-Token. Signed-in calls populate is_favourite and response on each vacancy card.
- query
- location
- regionId
- filters
- salary
- disallowRelocation
- hasPhone
- offset
- limit
- fields
- total
- relevant
- vacancies
- similarVacancies
- facets
- id
- title
- from
- to
- currencySign
- short_description
- is_promoted
- is_favourite
- company
- name
- isVerified
- isInBlacklist
- isSbbol
- places
- address
- places_summary
- publish_start_at
- status
- contact_person
Illustrative example reconstructed from the app's interface — not a live capture.
POST /v1/jobs/query HTTP/1.1 X-Token: xt_7f3a9c2e1b Content-Type: application/json Accept: application/json { "request": { "query": "product manager", "location": {"type": "region", "name": "Москва", "regionId": 1}, "filters": {"salary": 180000, "disallowRelocation": true, "hasPhone": true}, "offset": 0, "limit": 20, "fields": [ "vacancies.id", "vacancies.title", "vacancies.salary", "vacancies.short_description", "vacancies.is_promoted", "vacancies.is_favourite", "vacancies.company", "vacancies.places", "vacancies.response", "vacancies.places_summary", "facets", "vacancies.publish_start_at", "vacancies.status", "vacancies.contact_person" ] } }{ "response": { "total": 1284, "relevant": 412, "vacancies": [{ "id": 55102113, "title": "Product Manager", "salary": {"from": 180000, "to": 250000, "currencySign": "₽"}, "short_description": "Own the candidate experience squad.", "is_promoted": true, "is_favourite": false, "company": {"id": 1337, "name": "Example Corp", "type": "direct", "isVerified": true, "isInBlacklist": false, "isSbbol": false}, "places": [{"id": 1, "name": "Москва", "address": "Тверская 1"}], "places_summary": "Москва", "publish_start_at": "2026-09-20T10:15:00+03:00", "status": "published", "contact_person": {"name": "Anna Petrova"} }], "similarVacancies": [], "facets": {} } }Derived from the app's interface; endpoint details are illustrative, not a live capture.
Reconstructed from the search-results screen flow and its similar-vacancy rowWire field names taken from the vacancy list, salary and company payloads
Fetch vacancy cards by id
POST
/v1/jobs/cardsopendataHydrates vacancy-detail cards by vacancyIds (description, salary, company, places, skills, experience) for the vacancy screen and deep links.
Auth: Optional X-Token. Signed-in extras include is_favourite and response.
- vacancyIds
- regionId
- fields
- vacancies
- id
- title
- description
- salary
- from
- to
- currencySign
- company
- places
- skills
- experience
- is_allow_express_resume
- operating_schedule
- work_schedule_id
- publish_start_at
Illustrative example reconstructed from the app's interface — not a live capture.
POST /v1/jobs/cards HTTP/1.1 X-Token: xt_7f3a9c2e1b Content-Type: application/json Accept: application/json { "request": { "vacancyIds": [55102113, 55102114], "regionId": 1, "fields": ["id", "title", "salary", "description", "company", "places", "skills", "experience"] } }{ "response": { "vacancies": [{ "id": 55102113, "title": "Product Manager", "description": "Lead the candidate experience squad.", "salary": {"from": 180000, "to": 250000, "currencySign": "₽"}, "company": {"id": 1337, "name": "Example Corp", "isVerified": true}, "places": [{"id": 1, "name": "Москва", "address": "Тверская 1"}], "skills": ["SQL", "product management"], "experience": {"id": 3}, "is_allow_express_resume": true, "operating_schedule": {"id": "fullDay"}, "work_schedule_id": 1, "publish_start_at": "2026-09-20T10:15:00+03:00" }] } }Derived from the app's interface; endpoint details are illustrative, not a live capture.
Reconstructed from the vacancy-detail screen and deep-link handlingField names taken from the full vacancy, salary and company payloads
Apply to a vacancy
POST
/v1/applications/createopendataSubmits an application from a chosen resume to a vacancy and returns responseId when isSucceed is true.
Auth: X-Token required.
- vacancyId
- resumeId
- needCreateResponse
- responseId
- isSucceed
Illustrative example reconstructed from the app's interface — not a live capture.
POST /v1/applications/create HTTP/1.1 X-Token: xt_7f3a9c2e1b Content-Type: application/json Accept: application/json { "request": { "vacancyId": 55102113, "resumeId": 88012, "needCreateResponse": true } }{ "response": { "responseId": 901334, "resumeId": 88012, "isSucceed": true } }Derived from the app's interface; endpoint details are illustrative, not a live capture.
Reconstructed from the apply-with-resume confirmation screenResponse payload carries responseId, resumeId and isSucceed
List applications
POST
/v1/applicationsopendataPages the signed-in applicant's applications (id, createdAt, vacancy, status, hasNew, isAutoresponse, resume) for the Responses tab.
Auth: X-Token required.
- offset
- limit
- total
- rows
- id
- createdAt
- lastModifiedAt
- status
- hasNew
- isAutoresponse
- sentBy
- vacancy
- resume
- full_name
Illustrative example reconstructed from the app's interface — not a live capture.
POST /v1/applications HTTP/1.1 X-Token: xt_7f3a9c2e1b Content-Type: application/json Accept: application/json { "request": { "offset": 0, "limit": 20 } }{ "response": { "total": 14, "rows": [{ "id": 901334, "createdAt": "2026-09-21T08:30:00+03:00", "lastModifiedAt": "2026-09-22T11:00:00+03:00", "status": "in_progress", "hasNew": true, "isAutoresponse": false, "sentBy": "applicant", "vacancy": {"id": 55102113, "title": "Product Manager"}, "resume": {"id": 88012, "full_name": "Ivan Petrov"} }] } }Derived from the app's interface; endpoint details are illustrative, not a live capture.
Reconstructed from the Responses tab flow and its per-item status payloadField names taken from the application list row (status, hasNew, isAutoresponse)
List my resumes
POST
/v1/cvosintReturns the signed-in applicant's resumes (full_name, position, salary, is_published, skills, experiences) used by My resumes and the apply picker.
Auth: X-Token required.
- resumes
- id
- full_name
- first_name
- last_name
- middle_name
- position
- phone
- salary
- is_published
- published_at
- visibility
- skills
- experiences
- educations
- region
Illustrative example reconstructed from the app's interface — not a live capture.
POST /v1/cv HTTP/1.1 X-Token: xt_7f3a9c2e1b Content-Type: application/json Accept: application/json { "request": {} }{ "response": { "resumes": [{ "id": 88012, "full_name": "Ivan Petrov", "first_name": "Ivan", "last_name": "Petrov", "middle_name": "Sergeevich", "position": "Product Manager", "phone": "+79991234567", "email": "[email protected]", "salary": {"from": 220000, "currencySign": "₽"}, "is_published": true, "published_at": "2026-09-01T12:00:00+03:00", "visibility": "everyone", "skills": ["SQL", "product management"], "experiences": [{"company": "Example Corp", "position": "Product Manager"}], "educations": [{"organization": "MGU"}], "region": {"id": 1, "name": "Москва"} }] } }Derived from the app's interface; endpoint details are illustrative, not a live capture.
Reconstructed from the My resumes screen and the apply-resume pickerField names taken from the resume list payload
List resume views by employers
POST
/v1/cv/viewersosintLists employers who opened a resume (viewDate, isNew, company.id/name/url) for the resume-views screen.
Auth: X-Token required.
- resumeId
- offset
- limit
- total
- views
- viewDate
- isNew
- company
- id
- name
- url
- offerBranches
Illustrative example reconstructed from the app's interface — not a live capture.
POST /v1/cv/viewers HTTP/1.1 X-Token: xt_7f3a9c2e1b Content-Type: application/json Accept: application/json { "request": { "resumeId": 88012, "offset": 0, "limit": 20 } }{ "response": { "total": 128, "views": [{ "viewDate": "2026-09-22T09:14:00+03:00", "isNew": true, "company": { "id": 1337, "name": "Example Corp", "url": "https://example.org/company/1337", "offerBranches": [] } }] } }Derived from the app's interface; endpoint details are illustrative, not a live capture.
Reconstructed from the who-viewed-my-resume screen and its employer payload
Resume statistics
POST
/v1/cv/statsopendataReturns per-resume counters (views, viewsNew, responses, responsesNew, vacancies, vacanciesNew) shown on the My resumes dashboard.
Auth: X-Token required.
- statistics
- id
- views
- viewsNew
- responses
- responsesNew
- vacancies
- vacanciesNew
- query
- location
Illustrative example reconstructed from the app's interface — not a live capture.
POST /v1/cv/stats HTTP/1.1 X-Token: xt_7f3a9c2e1b Content-Type: application/json Accept: application/json { "request": {} }{ "response": { "statistics": [{ "id": 88012, "views": 128, "viewsNew": 7, "responses": 14, "responsesNew": 2, "vacancies": 42, "vacanciesNew": 5, "query": "product manager", "location": {"type": "region", "name": "Москва", "regionId": 1} }] } }Derived from the app's interface; endpoint details are illustrative, not a live capture.
Reconstructed from the My resumes dashboard countersField names taken from the per-resume statistics payload
List favourite vacancies
POST
/v1/jobs/savedopendataPages saved vacancies for the Favourites tab (title, salary, company, is_favourite, responded_recently).
Auth: X-Token required.
- fields
- sort
- offset
- limit
- vacancies
- id
- title
- is_favourite
- salary
- company
- short_description
- publish_start_at
- responded_recently
- is_allow_express_resume
Illustrative example reconstructed from the app's interface — not a live capture.
POST /v1/jobs/saved HTTP/1.1 X-Token: xt_7f3a9c2e1b Content-Type: application/json Accept: application/json { "request": { "fields": ["id", "places", "is_favourite", "title", "salary", "is_promoted", "company", "short_description", "response", "places_summary", "contact_person", "status", "publish_start_at", "responded_recently", "is_allow_express_resume"], "sort": "add_to_fav", "offset": 0, "limit": 20 } }{ "response": { "vacancies": [{ "id": 55102113, "title": "Product Manager", "is_favourite": true, "salary": {"from": 180000, "to": 250000, "currencySign": "₽"}, "company": {"id": 1337, "name": "Example Corp"}, "short_description": "Own the candidate experience squad.", "publish_start_at": "2026-09-20T10:15:00+03:00", "responded_recently": false }] } }Derived from the app's interface; endpoint details are illustrative, not a live capture.
Reconstructed from the Favourites tab listingField names taken from the saved-vacancy card payload
List vacancy-alert subscriptions
POST
/v1/alertsopendataLists saved vacancy-alert subscriptions (id, isReceiveEmails, searchParams, newVacanciesQuantity) for the Alerts screen.
Auth: X-Token required.
- total
- subscriptions
- id
- isReceiveEmails
- newVacanciesQuantity
- searchParams
- query
- location
Illustrative example reconstructed from the app's interface — not a live capture.
POST /v1/alerts HTTP/1.1 X-Token: xt_7f3a9c2e1b Content-Type: application/json Accept: application/json { "request": {} }{ "response": { "total": 3, "subscriptions": [{ "id": 77401, "isReceiveEmails": true, "newVacanciesQuantity": 12, "searchParams": { "query": "product manager", "location": {"type": "region", "name": "Москва", "regionId": 1} } }] } }Derived from the app's interface; endpoint details are illustrative, not a live capture.
Reconstructed from the vacancy-alerts / subscriptions screenField names taken from the subscription row payload
Application recruiter chat
POST
/v1/messagesopendataPages recruiter/applicant messages for an application (authorName, text, isEmployerMessage, sentAt). Companion POST /v1/messages/send accepts responseId and text.
Auth: X-Token required.
- responseId
- limit
- offset
- messages
- id
- authorId
- sentAt
- authorName
- authorSurname
- text
- isEmployerMessage
- isNewMessage
- updatedAt
Illustrative example reconstructed from the app's interface — not a live capture.
POST /v1/messages HTTP/1.1 X-Token: xt_7f3a9c2e1b Content-Type: application/json Accept: application/json { "request": { "responseId": 901334, "limit": 50, "offset": 0 } }{ "response": { "messages": [{ "id": 4401, "authorId": 1337, "sentAt": "2026-09-22T11:04:00+03:00", "authorName": "Anna", "authorSurname": "Petrova", "text": "When can you start?", "isEmployerMessage": true, "isNewMessage": true, "updatedAt": "2026-09-22T11:04:00+03:00" }] } }Derived from the app's interface; endpoint details are illustrative, not a live capture.
Reconstructed from the application chat thread screenA matching send variant accepts responseId and text
Profession salary aggregates
POST
/v1/insights/salaryopendataReturns profession salary buckets (salary, vacancyCount) plus name and slug for the career / salary-insights screen tied to a vacancy.
Auth: Optional X-Token.
- vacancyId
- id
- name
- slug
- specialization
- salaries
- salary
- vacancyCount
Illustrative example reconstructed from the app's interface — not a live capture.
POST /v1/insights/salary HTTP/1.1 Content-Type: application/json Accept: application/json { "request": { "vacancyId": 55102113 } }{ "response": { "id": 73, "name": "Менеджер продукта", "slug": "product-manager", "specialization": {"id": 12, "name": "IT"}, "salaries": { "salaries": [ {"salary": 150000, "vacancyCount": 80}, {"salary": 220000, "vacancyCount": 40} ] } } }Derived from the app's interface; endpoint details are illustrative, not a live capture.
Reconstructed from the career / salary-insights screen on a vacancy cardField names taken from the profession salary-bucket payload
Data categories
- session tokens
- applicant profiles
- vacancy listings
- employer cards
- applications
- resumes
- resume views
- saved vacancies
- vacancy alerts
- recruiter chat
- salary aggregates
Where teams use this data
Regional vacancy census
POST /v1/jobs/query with location.regionId and filters.salary to pull title, salary.from/to/currencySign, company.name and places, then hydrate full descriptions via /v1/jobs/cards — a labour-market overlay without scraping search HTML.
Application pipeline overlay
Poll /v1/applications for status, hasNew and isAutoresponse, then page /v1/messages (authorName, text, isEmployerMessage, sentAt) so a secondary inbox can surface only threads with new employer messages.
Resume visibility dashboard
Combine /v1/cv/stats (views, viewsNew, responses, vacancies) with /v1/cv/viewers (viewDate, isNew, company.name/url) to chart which employers opened a published resume.
Salary-band lookup
Call /v1/insights/salary with vacancyId to read profession name, slug and salaries[].salary/vacancyCount and compare an offer against the board's own distribution.
Frequently asked questions
How does the Rabota.ru Android app authenticate API calls?
Unauthenticated POST /v1/auth/password (login, password, recaptchaResponse) or /v1/auth/code (login, accessCode) returns token plus tokenV3.accessToken, expiresIn and signature. Every later signed-in call sends that token as the X-Token header.
Which endpoints power vacancy search?
POST /v1/jobs/query accepts query, location.regionId, filters.salary and a fields list, and returns total, relevant, vacancies[], similarVacancies[] and facets. Vacancy-detail cards are hydrated by POST /v1/jobs/cards with vacancyIds.
Where do resumes and applications live?
POST /v1/cv lists resumes (full_name, position, is_published). Apply with POST /v1/applications/create (vacancyId, resumeId). The Responses tab pages /v1/applications; recruiter chat is /v1/messages.
How are request bodies shaped?
The Android client posts JSON, with most v1 job/resume/application calls wrapping the payload as {request: ...}. Companion older web flows exist separately from this native surface.
Topics
- rabota.ru api
- rabota.ru android data api
- X-Token
- vacancy search
- resume views
- recruiter chat
- salary aggregates
- rabota.ru vacancy search
Need this app's data API integrated?
We deliver scoped integrations for any named app — from USD 500 with source-code handoff, or hosted access billed per call. Tell us the data you need.
- NDA + SOW on every engagement
- Delivery in 3–7 days
- Payment only after acceptance
- Work scoped to authorized use