Rabota.ru: Job search app icon

Rabota.ru Data API: vacancies, resumes and applications

Работа.ру — поиск работы · Jobs & Careers

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

  • Rabota.ru: Job search app screenshot 1
  • Rabota.ru: Job search app screenshot 2
  • Rabota.ru: Job search app screenshot 3
  • Rabota.ru: Job search app screenshot 4
  • Rabota.ru: Job search app screenshot 5

API surface

  • Password login and mint X-Token

    POST /v1/auth/password osint

    Authenticates 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 screen
    • Session payload carries token, tokenV3.accessToken, expiresIn and signature
  • One-time-code login

    POST /v1/auth/code osint

    Completes 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 screen
    • Same token / tokenV3 shape as the password login response
  • Fetch signed-in profile

    POST /v1/account/profile osint

    Returns 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
    • email
    • 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 flow
    • Field names taken from the signed-in profile payload
  • Search vacancies with similar results

    POST /v1/jobs/query opendata

    Returns 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 row
    • Wire field names taken from the vacancy list, salary and company payloads
  • Fetch vacancy cards by id

    POST /v1/jobs/cards opendata

    Hydrates 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 handling
    • Field names taken from the full vacancy, salary and company payloads
  • Apply to a vacancy

    POST /v1/applications/create opendata

    Submits 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 screen
    • Response payload carries responseId, resumeId and isSucceed
  • List applications

    POST /v1/applications opendata

    Pages 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 payload
    • Field names taken from the application list row (status, hasNew, isAutoresponse)
  • List my resumes

    POST /v1/cv osint

    Returns 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
    • email
    • 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 picker
    • Field names taken from the resume list payload
  • List resume views by employers

    POST /v1/cv/viewers osint

    Lists 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/stats opendata

    Returns 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 counters
    • Field names taken from the per-resume statistics payload
  • List favourite vacancies

    POST /v1/jobs/saved opendata

    Pages 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 listing
    • Field names taken from the saved-vacancy card payload
  • List vacancy-alert subscriptions

    POST /v1/alerts opendata

    Lists 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 screen
    • Field names taken from the subscription row payload
  • Application recruiter chat

    POST /v1/messages opendata

    Pages 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 screen
    • A matching send variant accepts responseId and text
  • Profession salary aggregates

    POST /v1/insights/salary opendata

    Returns 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 card
    • Field 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

Get a quote