WorkIndia Job Search App icon

WorkIndia Job Search App Data API

WorkIndia · Jobs & Careers

WorkIndia Job Search App is the candidate-facing Android client of WorkIndia, the Indian hiring marketplace started by Nilesh Dungarwal for blue-collar and grey-collar city work — delivery, sales, warehouse, security, housekeeping and similar frontline roles. Sign-in is a phone-number OTP; after that the home feed is a hyperlocal ranked list of vacancies for the candidate's city and locality, each card showing the role, salary band, company, area, openings, shift timings, experience needed and a work-from-home flag. Tapping a card opens the vacancy with the full description, branch address and how-to-reach notes, HR contact, interview details and eligibility questions, and the primary actions are Call HR, WhatsApp, apply in-app, or save to favourites. The account screens hold name, mobile, city, expected salary, experience, education, past companies, preferred sectors, languages, a resume link and a premium/Gold flag; hire-tracking and a live-location share sit on the walk-in path. Listed for India, it competes with apna, Job Hai, Shine and Naukri Fast on high-volume frontline hiring rather than LinkedIn-style white-collar networking.

Hyperlocal ranked_jobs rows stamp each opening with profile_job_title, profile_min_salary / profile_max_salary, branch_company_name, branch_location_city_name and no_of_openings, plus isWorkFromHome and job_timings. The signed-in dossier carries full_name, mobile_no, expectedSalary, preferred_sectors, educationDetailsArrayList and companyDetails, with an oauth pair of access_token / refresh_token after OTP confirm.

Walk-in tracking posts latitude and longitude and returns a share link plus description. Staffing boards can chart salary bands against city demand; HR-ops tools can watch isEmployerUnlocked, calls, whatsAppContactEpochTime and favourite actionPerformedAt; onboarding stacks can reuse education and company-history rows. openData Studio turns those records into callable open data.

Screenshots

  • WorkIndia Job Search App screenshot 1
  • WorkIndia Job Search App screenshot 2
  • WorkIndia Job Search App screenshot 3
  • WorkIndia Job Search App screenshot 4
  • WorkIndia Job Search App screenshot 5

API surface

The endpoints and request/response examples below are reconstructed from the app's interface — illustrative, not a live capture.

  • Generate login OTP

    POST /v1/seeker/phone/otp/start osint

    Sends a phone OTP before confirm. Returns was_code_generated, otp_limit_exceeded, candidate_status and name for an existing candidate, plus a Notp block (notpEnabled, accountSID, appID, appSecret).

    Auth: Unauthenticated. JSON body with Accept: application/json and an app-version header.

    • mobile_no
    • was_code_generated
    • otp_limit_exceeded
    • candidate_status
    • name
    • api_version
    • registration
    • notp
    • notpEnabled
    • accountSID
    • appID
    • appSecret
    POST /v1/seeker/phone/otp/start HTTP/1.1
    Accept: application/json
    Content-Type: application/json
    
    {
      "mobile_no": "9876543210"
    }
    {
      "was_code_generated": true,
      "otp_limit_exceeded": false,
      "candidate_status": "existing",
      "name": "Rahul Sharma",
      "api_version": {"registration": 12},
      "notp": {
        "notpEnabled": true,
        "accountSID": "<account_sid>",
        "appID": "<app_id>",
        "appSecret": "<app_secret>"
      }
    }
  • Verify login OTP

    POST /v1/seeker/phone/otp/confirm osint

    Confirms the SMS OTP. Later calls attach oauth.access_token / refresh_token as Authorization; the client retries on HTTP 401.

    Auth: Unauthenticated. JSON body with Accept: application/json and an app-version header.

    • mobile_no
    • otp
    • candidate
    • id
    • full_name
    • is_otp_verified
    • oauth
    • access_token
    • refresh_token
    • token_type
    • expires_in
    • scope
    POST /v1/seeker/phone/otp/confirm HTTP/1.1
    Accept: application/json
    Content-Type: application/json
    
    {
      "mobile_no": "9876543210",
      "otp": "482193"
    }
    {
      "error": false,
      "message": "verified",
      "candidate": {
        "id": 44189012,
        "mobile_no": "9876543210",
        "full_name": "Rahul Sharma",
        "is_otp_verified": true
      },
      "oauth": {
        "access_token": "<access_token>",
        "refresh_token": "<refresh_token>",
        "token_type": "Bearer",
        "expires_in": "86400",
        "scope": "candidate"
      }
    }
  • Candidate login

    POST /v1/seeker/session/open osint

    Posts the candidate login body and returns candidate plus OnboardingMetaData.onboardingVersion.

    Auth: Unauthenticated. JSON body with Accept: application/json and an app-version header.

    • mobile_no
    • device_id
    • app_version
    • language
    • city
    • google_advertising_id
    • candidate
    • id
    • full_name
    • email_id
    • location
    • is_otp_verified
    • is_premium
    • expectedSalary
    • experience_level
    • profile_pic
    • metaData
    • onboardingVersion
    POST /v1/seeker/session/open HTTP/1.1
    Accept: application/json
    Content-Type: application/json
    
    {
      "mobile_no": "9876543210",
      "device_id": "a1b2c3d4e5f6",
      "app_version": "7.1.7.3",
      "language": "en",
      "city": "Mumbai",
      "google_advertising_id": "00000000-0000-0000-0000-000000000000"
    }
    {
      "candidate": {
        "id": 44189012,
        "full_name": "Rahul Sharma",
        "mobile_no": "9876543210",
        "email_id": "[email protected]",
        "city": "Mumbai",
        "location": "Andheri East",
        "is_otp_verified": true,
        "is_premium": false,
        "expectedSalary": 18000,
        "experience_level": "0-1",
        "profile_pic": "https://cdn.example/avatar.png"
      },
      "metaData": {"onboardingVersion": "v12"}
    }
  • Register candidate

    POST /v1/seeker/enrol osint

    Creates a new candidate and returns candidate, oauth tokens and OnboardingMetaData.

    Auth: Unauthenticated. JSON body with Accept: application/json and an app-version header.

    • full_name
    • mobile_no
    • gender
    • date_of_birth
    • city
    • location
    • expectedSalary
    • experience_level
    • qualification_type
    • preferred_sectors
    • languages_known
    • willing_to_relocate
    • urgently_looking_job
    • register_mode
    • candidate
    • id
    • is_otp_verified
    • profile_state
    • my_referral_code
    • oauth
    • access_token
    • refresh_token
    • token_type
    • metaData
    • onboardingVersion
    POST /v1/seeker/enrol HTTP/1.1
    Accept: application/json
    Content-Type: application/json
    
    {
      "full_name": "Rahul Sharma",
      "mobile_no": "9876543210",
      "gender": "male",
      "date_of_birth": "1998-04-12",
      "city": "Mumbai",
      "location": "Andheri East",
      "expectedSalary": 18000,
      "experience_level": "0-1",
      "qualification_type": "10th",
      "preferred_sectors": ["delivery", "sales"],
      "languages_known": ["Hindi", "English"],
      "willing_to_relocate": false,
      "urgently_looking_job": true,
      "register_mode": "otp",
      "language": "en"
    }
    {
      "candidate": {
        "id": 44189012,
        "full_name": "Rahul Sharma",
        "mobile_no": "9876543210",
        "city": "Mumbai",
        "is_otp_verified": true,
        "profile_state": 1,
        "my_referral_code": "WI-RAHUL12"
      },
      "oauth": {
        "access_token": "<access_token>",
        "refresh_token": "<refresh_token>",
        "token_type": "Bearer",
        "expires_in": "86400",
        "scope": "candidate"
      },
      "metaData": {"onboardingVersion": "v12"}
    }
  • Refresh OAuth token

    POST /v1/seeker/session/rotate osint

    Mints a new oauth access_token from refresh_token. The client calls this on HTTP 401; payload carries the Oauth pair.

    Auth: Authorization: Bearer <access_token> plus refresh_token in the body. The client retries on HTTP 401.

    • refresh_token
    • error
    • message
    • payload
    • access_token
    • token_type
    • expires_in
    • scope
    POST /v1/seeker/session/rotate HTTP/1.1
    Accept: application/json
    Content-Type: application/json
    Authorization: Bearer <access_token>
    
    {
      "refresh_token": "<refresh_token>"
    }
    {
      "error": false,
      "message": "ok",
      "payload": {
        "access_token": "<new_access_token>",
        "refresh_token": "<new_refresh_token>",
        "token_type": "Bearer",
        "expires_in": "86400",
        "scope": "candidate"
      }
    }
  • Get candidate profile

    GET /v1/seeker/dossier osint

    Hydrates the My Account / profile screen: identity, salary expectations, sectors, educationDetailsArrayList, companyDetails and resume_link.

    Auth: Authorization: Bearer <access_token> after OTP verify, plus an app-version header.

    • id
    • full_name
    • mobile_no
    • email_id
    • gender
    • date_of_birth
    • city
    • location
    • current_salary
    • expectedSalary
    • experience_level
    • totalExperience
    • notice_period
    • qualification_type
    • speaking_english_level
    • languages_known
    • preferred_sectors
    • preferred_job_cities
    • willing_to_relocate
    • urgently_looking_job
    • is_premium
    • is_otp_verified
    • resume_link
    • profile_pic
    • educationDetailsArrayList
    • college_name
    • course
    • passingYear
    • companyDetails
    • companyName
    • designation
    • salary
    • workType
    GET /v1/seeker/dossier HTTP/1.1
    Accept: application/json
    Authorization: Bearer <access_token>
    {
      "id": 44189012,
      "full_name": "Rahul Sharma",
      "mobile_no": "9876543210",
      "email_id": "[email protected]",
      "gender": "male",
      "date_of_birth": "1998-04-12",
      "city": "Mumbai",
      "location": "Andheri East",
      "current_salary": "15000",
      "expectedSalary": 18000,
      "experience_level": "0-1",
      "totalExperience": 12,
      "notice_period": "immediate",
      "qualification_type": "10th",
      "speaking_english_level": 2,
      "languages_known": ["Hindi", "English"],
      "preferred_sectors": ["delivery", "sales"],
      "preferred_job_cities": ["Mumbai", "Thane"],
      "willing_to_relocate": false,
      "urgently_looking_job": true,
      "is_premium": false,
      "is_otp_verified": true,
      "resume_link": "https://files.example/candidate-resume/44189012.pdf",
      "profile_pic": "https://cdn.example/avatar.png",
      "educationDetailsArrayList": [{
        "college_name": "Municipal High School",
        "course": "SSC",
        "degree_id": 1,
        "passingYear": 2014,
        "specialization": ""
      }],
      "companyDetails": [{
        "companyName": "Example Logistics",
        "designation": "Delivery Executive",
        "industry": "logistics",
        "isCurrent": false,
        "salary": 14000,
        "workType": "full_time"
      }]
    }
  • Update candidate profile

    PUT /v1/seeker/dossier/patch osint

    Writes profile edits from the account screens (city, expectedSalary, sectors, workShift / workType / workMode).

    Auth: Authorization: Bearer <access_token> after OTP verify, plus an app-version header.

    • id
    • full_name
    • email_id
    • city
    • location
    • expectedSalary
    • notice_period
    • preferred_sectors
    • languages_known
    • willing_to_relocate
    • workShift
    • workType
    • workMode
    • shouldUpdateProfile
    • profile_update_state
    PUT /v1/seeker/dossier/patch HTTP/1.1
    Accept: application/json
    Content-Type: application/json
    Authorization: Bearer <access_token>
    
    {
      "id": 44189012,
      "full_name": "Rahul Sharma",
      "email_id": "[email protected]",
      "city": "Mumbai",
      "location": "Andheri East",
      "expectedSalary": 20000,
      "notice_period": "7 days",
      "preferred_sectors": ["delivery", "warehouse"],
      "languages_known": ["Hindi", "English", "Marathi"],
      "willing_to_relocate": true,
      "workShift": ["day"],
      "workType": ["full_time"],
      "workMode": ["office"]
    }
    {
      "id": 44189012,
      "full_name": "Rahul Sharma",
      "email_id": "[email protected]",
      "city": "Mumbai",
      "location": "Andheri East",
      "expectedSalary": 20000,
      "notice_period": "7 days",
      "preferred_sectors": ["delivery", "warehouse"],
      "shouldUpdateProfile": false,
      "profile_update_state": 2
    }
  • Nearest city from GPS

    GET /v1/geo/nearest-locality opendata

    Maps a GPS pair to the city / locality taxonomy used to seed the job feed.

    Auth: Authorization: Bearer <access_token> after OTP verify, plus an app-version header.

    • latitude
    • longitude
    • city
    • location
    • sub_city
    GET /v1/geo/nearest-locality?latitude=19.0760&longitude=72.8777 HTTP/1.1
    Accept: application/json
    Authorization: Bearer <access_token>
    {
      "city": "Mumbai",
      "location": "Andheri East",
      "sub_city": "Andheri"
    }
  • Filtered job search

    GET /v1/openings/city-rank opendata

    Powers the home / search listing: paginated ranked_jobs with salary band, company, locality, openings, WFH flag and jobFilters facets.

    Auth: Authorization: Bearer <access_token> after OTP verify, plus an app-version header.

    • jobCount
    • fetch_next
    • actualCity
    • isMainListingJobs
    • candidateData
    • city
    • location
    • overriddenCity
    • jobFilters
    • primaryFilters
    • constantName
    • displayName
    • toggleFilter
    • ranked_jobs
    • id
    • profile_job_title
    • profile_min_salary
    • profile_max_salary
    • branch_company_name
    • company_logo
    • branch_location_city_name
    • branch_location_name
    • no_of_openings
    • isWorkFromHome
    • job_timings
    • jobState
    • profile_qualification_required
    • distance_away
    GET /v1/openings/city-rank?city=Mumbai&location=Andheri&query=delivery&offset=0&limit=20 HTTP/1.1
    Accept: application/json
    Authorization: Bearer <access_token>
    {
      "jobCount": 1284,
      "fetch_next": "20",
      "actualCity": "Mumbai",
      "isMainListingJobs": true,
      "candidateData": {
        "city": "Mumbai",
        "location": "Andheri East",
        "overriddenCity": null
      },
      "jobFilters": {
        "primaryFilters": [{"constantName": "delivery", "displayName": "Delivery"}],
        "toggleFilter": {"constantName": "wfh", "displayName": "Work from home"},
        "primaryGroupFilters": []
      },
      "ranked_jobs": [{
        "id": 8845123,
        "profile_job_title": "Delivery Executive",
        "profile_min_salary": 15000,
        "profile_max_salary": 22000,
        "branch_company_name": "Example Logistics",
        "company_logo": "https://cdn.example/logo.png",
        "branch_location_city_name": "Mumbai",
        "branch_location_name": "Andheri East",
        "no_of_openings": 12,
        "isWorkFromHome": false,
        "job_timings": "09:00-18:00",
        "experience": "0-1 years",
        "job_type": "full_time",
        "jobState": "live",
        "profile_qualification_required": "10th pass",
        "distance_away": "3.2 km"
      }]
    }
  • Job detail

    GET /v1/openings/{openingId}/card opendata

    Hydrates the vacancy screen: full description, salary structure, branch geo/address, HR contact, interview notes and apply/call state.

    Auth: Authorization: Bearer <access_token> after OTP verify, plus an app-version header.

    • id
    • profile_job_title
    • profile_job_description
    • profile_min_salary
    • profile_max_salary
    • profile_incentives
    • profile_salary_structure
    • profile_qualification_required
    • job_timings
    • no_of_openings
    • isWorkFromHome
    • jobState
    • branch_company_name
    • branch_address
    • branch_landmark
    • branch_how_to_reach
    • branch_location_city_name
    • branch_location_name
    • branch_location_latitude
    • branch_location_longitude
    • branch_contact_person_name
    • interview_address
    • interview_details
    • calls
    • views
    • isFavourite
    • isJobApplied
    • isEmployerUnlocked
    • isChatApplicable
    • applyJobLink
    GET /v1/openings/8845123/card HTTP/1.1
    Accept: application/json
    Authorization: Bearer <access_token>
    {
      "id": 8845123,
      "profile_job_title": "Delivery Executive",
      "profile_job_description": "Pick up and drop parcels across Mumbai. Two-wheeler required.",
      "profile_min_salary": 15000,
      "profile_max_salary": 22000,
      "profile_incentives": "Fuel + per-delivery bonus",
      "profile_salary_structure": "Fixed + incentive",
      "profile_qualification_required": "10th pass",
      "profile_weekly_off": "Sunday",
      "job_timings": "09:00-18:00",
      "no_of_openings": 12,
      "isWorkFromHome": false,
      "jobState": "live",
      "branch_company_name": "Example Logistics",
      "branch_address": "Andheri East, Mumbai",
      "branch_landmark": "Near metro station",
      "branch_how_to_reach": "Western Express Highway",
      "branch_location_city_name": "Mumbai",
      "branch_location_name": "Andheri East",
      "branch_location_latitude": "19.1197",
      "branch_location_longitude": "72.8468",
      "branch_contact_person_name": "Priya Nair",
      "interview_address": "Same as branch",
      "interview_details": "Walk-in 11am-4pm",
      "calls": 86,
      "views": 412,
      "isFavourite": false,
      "isJobApplied": false,
      "isEmployerUnlocked": false,
      "isChatApplicable": true,
      "applyJobLink": "https://share.example/opening"
    }
  • Recommended jobs

    GET /v1/openings/for-you opendata

    Returns jobs matched to the signed-in candidate, including isRecommended and recommendedBy.

    Auth: Authorization: Bearer <access_token> after OTP verify, plus an app-version header.

    • jobCount
    • fetch_next
    • ranked_jobs
    • id
    • profile_job_title
    • profile_min_salary
    • profile_max_salary
    • branch_company_name
    • branch_location_city_name
    • isRecommended
    • recommendedBy
    • jobState
    GET /v1/openings/for-you HTTP/1.1
    Accept: application/json
    Authorization: Bearer <access_token>
    {
      "jobCount": 24,
      "fetch_next": null,
      "ranked_jobs": [{
        "id": 8845201,
        "profile_job_title": "Warehouse Associate",
        "profile_min_salary": 14000,
        "profile_max_salary": 18000,
        "branch_company_name": "Example Retail",
        "branch_location_city_name": "Mumbai",
        "isRecommended": true,
        "recommendedBy": "preferred_sectors",
        "jobState": "live"
      }]
    }
  • Similar jobs

    GET /v1/openings/{openingId}/neighbours opendata

    Loads the similar-jobs strip on a vacancy.

    Auth: Authorization: Bearer <access_token> after OTP verify, plus an app-version header.

    • jobCount
    • ranked_jobs
    • id
    • profile_job_title
    • profile_min_salary
    • profile_max_salary
    • branch_company_name
    • branch_location_city_name
    • related_jobs
    GET /v1/openings/8845123/neighbours HTTP/1.1
    Accept: application/json
    Authorization: Bearer <access_token>
    {
      "jobCount": 8,
      "ranked_jobs": [{
        "id": 8845308,
        "profile_job_title": "Delivery Rider",
        "profile_min_salary": 16000,
        "profile_max_salary": 23000,
        "branch_company_name": "Example Express",
        "branch_location_city_name": "Mumbai",
        "related_jobs": "8845123"
      }]
    }
  • Job categories

    GET /v1/openings/sector-tiles opendata

    Lists category cards (position plus jobCategories of id / displayString / icon) used to jump into a sector feed.

    Auth: Authorization: Bearer <access_token> after OTP verify, plus an app-version header.

    • error
    • message
    • payload
    • position
    • jobCategories
    • id
    • displayString
    • icon
    • drawable
    • url
    • tint
    GET /v1/openings/sector-tiles?city=Mumbai HTTP/1.1
    Accept: application/json
    Authorization: Bearer <access_token>
    {
      "error": false,
      "message": "ok",
      "payload": {
        "position": 0,
        "jobCategories": [{
          "id": "delivery",
          "displayString": "Delivery",
          "icon": {
            "drawable": "ic_delivery",
            "url": "https://cdn.example/cat_delivery.png",
            "tint": "#1A73E8"
          }
        }]
      }
    }
  • Favourite jobs

    GET /v1/openings/saved opendata

    Pages the saved/favourite pipeline (JobData rows with actionPerformedAt).

    Auth: Authorization: Bearer <access_token> after OTP verify, plus an app-version header.

    • count
    • next
    • prev
    • jobs
    • actionPerformedAt
    • job
    • id
    • profile_job_title
    • profile_min_salary
    • profile_max_salary
    • branch_company_name
    • isFavourite
    • favorite_on
    GET /v1/openings/saved?page=1&limit=20 HTTP/1.1
    Accept: application/json
    Authorization: Bearer <access_token>
    {
      "count": 6,
      "next": null,
      "prev": null,
      "jobs": [{
        "actionPerformedAt": "2026-10-08T11:04:00Z",
        "job": {
          "id": 8845123,
          "profile_job_title": "Delivery Executive",
          "profile_min_salary": 15000,
          "profile_max_salary": 22000,
          "branch_company_name": "Example Logistics",
          "branch_location_city_name": "Mumbai",
          "isFavourite": true,
          "favorite_on": "2026-10-08T11:04:00Z"
        }
      }]
    }
  • HR-viewed jobs

    GET /v1/openings/recruiter-unlocks opendata

    Lists vacancies where an employer unlocked / viewed the candidate (unlockedJobs with isEmployerUnlocked).

    Auth: Authorization: Bearer <access_token> after OTP verify, plus an app-version header.

    • next
    • unlockedJobs
    • id
    • profile_job_title
    • branch_company_name
    • isEmployerUnlocked
    • profileCount
    • calls
    • jobState
    GET /v1/openings/recruiter-unlocks?page=1&limit=20 HTTP/1.1
    Accept: application/json
    Authorization: Bearer <access_token>
    {
      "next": 2,
      "unlockedJobs": [{
        "id": 8845123,
        "profile_job_title": "Delivery Executive",
        "branch_company_name": "Example Logistics",
        "isEmployerUnlocked": true,
        "profileCount": 1,
        "calls": 1,
        "jobState": "live"
      }]
    }
  • Apply to job

    POST /v1/openings/{openingId}/apply opendata

    Records an in-app apply and flips isJobApplied / applied_on on the vacancy.

    Auth: Authorization: Bearer <access_token> after OTP verify, plus an app-version header.

    • job_id
    • candidate_id
    • candidateApplyType
    • jobApplicationSource
    • id
    • isJobApplied
    • applied
    • applied_on
    • candidateJobAction
    POST /v1/openings/8845123/apply HTTP/1.1
    Accept: application/json
    Content-Type: application/json
    Authorization: Bearer <access_token>
    
    {
      "job_id": 8845123,
      "candidate_id": 44189012,
      "candidateApplyType": "in_app",
      "jobApplicationSource": "job_detail"
    }
    {
      "id": 8845123,
      "isJobApplied": true,
      "applied": true,
      "applied_on": "2026-10-09T06:12:00Z",
      "candidateJobAction": "applied",
      "candidateApplyType": "in_app"
    }
  • Call HR

    POST /v1/openings/{openingId}/call-recruiter opendata

    Records a Call-HR tap and typically flips isEmployerUnlocked / increments calls on the vacancy.

    Auth: Authorization: Bearer <access_token> after OTP verify, plus an app-version header.

    • job_id
    • candidate_id
    • callContactedActionType
    • id
    • isEmployerUnlocked
    • calls
    • candidateJobAction
    POST /v1/openings/8845123/call-recruiter HTTP/1.1
    Accept: application/json
    Content-Type: application/json
    Authorization: Bearer <access_token>
    
    {
      "job_id": 8845123,
      "candidate_id": 44189012,
      "callContactedActionType": "call"
    }
    {
      "id": 8845123,
      "isEmployerUnlocked": true,
      "calls": 87,
      "callContactedActionType": "call",
      "candidateJobAction": "employer_contacted_call"
    }
  • WhatsApp HR

    POST /v1/openings/{openingId}/whatsapp-recruiter opendata

    Records a WhatsApp-HR tap and stamps whatsAppContactEpochTime on the vacancy.

    Auth: Authorization: Bearer <access_token> after OTP verify, plus an app-version header.

    • job_id
    • candidate_id
    • callContactedActionType
    • id
    • isEmployerUnlocked
    • whatsAppContactEpochTime
    • candidateJobAction
    POST /v1/openings/8845123/whatsapp-recruiter HTTP/1.1
    Accept: application/json
    Content-Type: application/json
    Authorization: Bearer <access_token>
    
    {
      "job_id": 8845123,
      "candidate_id": 44189012,
      "callContactedActionType": "whatsapp"
    }
    {
      "id": 8845123,
      "isEmployerUnlocked": true,
      "whatsAppContactEpochTime": 1760000000000,
      "callContactedActionType": "whatsapp",
      "candidateJobAction": "employer_contacted_whatsapp"
    }
  • Live location collect

    POST /v1/walkin/gps-ping opendata

    Posts walk-in GPS on the hire-tracking path. Geo payload carries latitude and longitude.

    Auth: Authorization: Bearer <access_token> after OTP verify, plus an app-version header.

    • candidate_id
    • job_id
    • latitude
    • longitude
    • error
    • message
    POST /v1/walkin/gps-ping HTTP/1.1
    Accept: application/json
    Content-Type: application/json
    Authorization: Bearer <access_token>
    
    {
      "candidate_id": 44189012,
      "job_id": 8845123,
      "latitude": 19.1197,
      "longitude": 72.8468
    }
    {
      "error": false,
      "message": "ok"
    }
  • Hire-tracking link

    GET /v1/walkin/share-link opendata

    Returns the hire-tracking card for a walk-in (description / link) used while the candidate travels to interview.

    Auth: Authorization: Bearer <access_token> after OTP verify, plus an app-version header.

    • description
    • link
    GET /v1/walkin/share-link HTTP/1.1
    Accept: application/json
    Authorization: Bearer <access_token>
    {
      "description": "Share live location with HR while you travel to the interview",
      "link": "https://track.example/walkin/call-list?data=<payload>"
    }
  • Government job detail

    GET /v1/public-service/{openingId} opendata

    Hydrates a government-vacancy card from the public-service catalog, including how-to-apply and application-fee fields.

    Auth: Authorization: Bearer <access_token> after OTP verify, plus an app-version header.

    • id
    • profile_job_title
    • profile_job_description
    • profile_min_salary
    • profile_max_salary
    • profile_how_to_apply
    • profile_application_fees
    • profile_selection_procedure
    • jobState
    • jobPostType
    GET /v1/public-service/12045 HTTP/1.1
    Accept: application/json
    Authorization: Bearer <access_token>
    {
      "id": 12045,
      "profile_job_title": "Constable",
      "profile_job_description": "State police recruitment, physical + written.",
      "profile_min_salary": 21700,
      "profile_max_salary": 69100,
      "profile_how_to_apply": "Apply on the official portal before the closing date.",
      "profile_application_fees": "100",
      "profile_selection_procedure": "PET + written + medical",
      "jobState": "live",
      "jobPostType": "government"
    }
  • Job calls and views

    GET /v1/openings/{openingId}/engagement opendata

    Reads engagement counters for a vacancy (jobCall / jobViews).

    Auth: Authorization: Bearer <access_token> after OTP verify, plus an app-version header.

    • jobCall
    • jobViews
    GET /v1/openings/8845123/engagement HTTP/1.1
    Accept: application/json
    Authorization: Bearer <access_token>
    {
      "jobCall": "86",
      "jobViews": "412"
    }

Data categories

  • job listings
  • candidate profiles
  • applications
  • identity
  • location
  • resumes

Where teams use this data

  • City labour-market pulse

    Staffing dashboards page ranked_jobs for a city and locality and chart profile_min_salary / profile_max_salary, no_of_openings and jobCategoryDisplayValue to see which frontline roles are hiring this week.

  • Candidate-profile prefill

    Onboarding tools read full_name, mobile_no, expectedSalary, preferred_sectors, educationDetailsArrayList and companyDetails so a second marketplace does not re-ask the same work history.

  • Apply, Call-HR and unlock pipeline

    HR-ops bots watch isJobApplied, applied_on, isEmployerUnlocked, calls, whatsAppContactEpochTime and the favourite JobData.actionPerformedAt stream to measure time-to-call after an in-app apply.

  • Walk-in location seed

    Map a GPS pair through city / location / sub_city for the feed, then reuse latitude / longitude on the live-location collect and the hire-tracking link while a candidate travels to a walk-in.

Frequently asked questions

How does WorkIndia authenticate candidates?

POST /v1/seeker/phone/otp/start sends the OTP; POST /v1/seeker/phone/otp/confirm and POST /v1/seeker/enrol return oauth.access_token, refresh_token and token_type. Later calls send Authorization: Bearer <access_token>; POST /v1/seeker/session/rotate mints a new pair on HTTP 401. These are first-party endpoints after sign-in, not a public developer API.

What fields sit on a WorkIndia job card?

GET /v1/openings/city-rank pages ranked_jobs with profile_job_title, profile_min_salary, profile_max_salary, branch_company_name, branch_location_city_name, no_of_openings, isWorkFromHome, job_timings and jobState. GET /v1/openings/{openingId}/card adds profile_job_description, branch_address, interview_details and branch_contact_person_name.

Can I see who viewed a candidate?

GET /v1/openings/recruiter-unlocks returns unlockedJobs with isEmployerUnlocked and profileCount. Favourites are GET /v1/openings/saved with actionPerformedAt. Call-HR and WhatsApp events stamp calls and whatsAppContactEpochTime.

Is this a public developer API?

No. These are first-party endpoints the Android client uses after OTP login. They are documented here as a data surface, not as a supported public SDK.

Apps similar to WorkIndia Job Search App

  • apna - Search Job, Vacancy App — apna is a mobile-first Indian job app for blue-collar, entry-level and Tier 2/3 hiring, with regional-language access and direct chat with employers.
  • Naukri: Job Search App — Naukri is a recruiter-driven Indian job board used for volume hiring in IT, banking, operations and other office roles, often paired with local blue-collar apps for broader coverage.
  • Indeed Job Search — Indeed aggregates Indian job listings from company sites and other boards into one search, with Easy Apply and a stored resume.
  • Shine.com Job Search App — Shine is a general Indian job portal listed among Naukri and Apna alternatives, with mid-level listings plus career extras such as skill tests and courses.
  • LinkedIn: Community & Network — LinkedIn Jobs is used in India for professional networking, referrals and corporate white-collar roles rather than hyper-local frontline hiring.
  • foundit — foundit.in is the rebranded Monster India portal, with AI-driven job matching plus resume and interview extras for mid-career roles.
  • Internshala — Internshala focuses on Indian internships and first jobs for students and freshers, with courses and an ATS-oriented resume tool.

Topics

  • WorkIndia API
  • WorkIndia jobs data
  • candidate profile
  • OTP login
  • ranked_jobs
  • profile_min_salary
  • blue collar India jobs
  • Call HR apply
  • WorkIndia oauth
  • walk-in tracking

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