Indeed Job Search data API
Indeed Job Search is the official Android app from Indeed Jobs, the company behind one of the world's largest job boards and part of Japan's Recruit Holdings. Jobseekers type into a What box with keyword typeahead, scroll result cards that show pay, employer star rating, company logo and location, and send one-tap Indeed Apply applications with a stored resume. The My Jobs tab follows every application from applied to hired and gathers interview invitations, video or phone, with time slots to pick from, while the Messages tab holds employer conversations behind unread badges. Saved searches flag how many new postings have appeared since the last visit, and a home-screen widget surfaces up to five jobs matched to recent searches. The app works anonymously or with a signed-in Indeed account under the Me tab, and serves US jobseekers in a market it shares with LinkedIn, ZipRecruiter, Monster and Dice.
Indeed job cards carry the public half of the record: each posting's key resolves to a title, sourceEmployerName, employer overallRating and squareLogoUrls, a formatted location, pay as compensation.formattedText and an indeedApply flag, and widget picks add a matchReason tying the job to a recent search. Saved keyword/location pairs return a newCount of fresh postings, and the What box returns suggestion strings for partial queries.
The signed-in half is the jobseeker's own pipeline. My Jobs rows record jobKey, company name, applyTime, applicationStatus with its applicationStatusTimestamp, the employer-side employerJobStatus next to the candidate's selfReportedStatus, and the encryptedIaAppId of an Indeed Apply submission; interview invitations add formatType, status, durationInMinutes, invitationNote and offered timeSlots. Employer threads expose unreadCount, participantName, messagePreview and moderationStatus, with inbox totals in totalUnreadConversationCount; the account carries firstName, lastName, emailAddress, isVerified and accountId, the profile a resume id with its tags, and recentJobSearches keep each search's criteria (query and location) with a timestamp.
An ATS can sync applicationStatus, encryptedIaAppId and interview formatType nightly so recruiters see the same pipeline the candidate sees in My Jobs; a labour-market dashboard can track titles, pay text and employer ratings from the public cards without storing candidate PII; a jobseeker CRM can page when an employer thread's unreadCount goes stale; and a background-check vendor can bind the account's name, email and accountId to the resume id before an Indeed Apply submission. openData Studio turns these job cards, application pipelines and inbox threads into callable open data for those integrations.
Screenshots
API surface
The endpoints and request/response examples below are reconstructed from the app's interface — illustrative, not a live capture.
Find relevant jobs (widget)
POST
/v1/jobs/recommendationsopendataPowers the Android home-screen widget: up to five relevant jobs with matchReason, title, sourceEmployerName, overallRating, compensation.formattedText and viewJobRedirectClickUrl.
Auth: App API-key header plus country, locale, client and tracking headers. Optional OAuth Bearer access token after sign-in.
- findRelevantJobs
- trackingKey
- matchReason
- title
- sourceEmployerName
- employer
- key
- overallRating
- location
- formatted
- compensation
- formattedText
- indeedApply
- scopes
- dateOnIndeed
- description
- viewJobRedirectClickUrl
POST /v1/jobs/recommendations HTTP/1.1 Content-Type: application/json X-App-Key: <app-api-key> X-Country: US X-Locale: en_US X-Client: android-widget X-Tracking-Key: <tk> { "limit": 5, "context": "homeWidget" }{ "trackingKey": "1abcdefghijklmn", "results": [{ "matchReason": {"type": "RECENT_QUERY", "query": "product manager", "location": "Austin, TX"}, "job": { "title": "Staff Product Manager", "sourceEmployerName": "Example Corp", "employer": {"key": "example-corp", "overallRating": {"value": 4.1}}, "location": {"formatted": {"short": "Austin, TX"}}, "compensation": {"key": "USD_140K_180K", "formattedText": "$140,000 - $180,000 a year"}, "indeedApply": {"scopes": ["RESUME"]}, "dateOnIndeed": "2026-09-24T12:00:00Z", "description": {"text": "Own the job-seeker home feed."} }, "viewJobRedirectClickUrl": "https://example.com/viewjob?jk=abc123" }] }Hydrate job cards
POST
/v1/jobs/cardsopendataHydrates SERP and conversation job cards from jobKeys: title, formatted location, employer logos, overallRating, compensation.formattedText and attributes.
Auth: App API-key header plus country, locale and tracking headers. Optional OAuth Bearer access token.
- jobData
- key
- url
- title
- location
- formatted
- short
- long
- sourceEmployerName
- squareLogoUrls
- url64
- url128
- overallRating
- compensation
- formattedText
- attributes
- label
POST /v1/jobs/cards HTTP/1.1 Content-Type: application/json X-App-Key: <app-api-key> X-Country: US X-Locale: en_US X-Tracking-Key: <tk> { "jobKeys": ["abc123def456"] }{ "results": [{ "job": { "key": "abc123def456", "url": "https://example.com/viewjob?jk=abc123def456", "title": "Staff Product Manager", "location": {"formatted": {"short": "Austin, TX", "long": "Austin, TX 78701"}}, "sourceEmployerName": "Example Corp", "employer": { "squareLogoUrls": {"url64": "https://example.com/s/logo64.png", "url128": "https://example.com/s/logo128.png"}, "overallRating": {"value": 4.1} }, "compensation": {"formattedText": "$140,000 - $180,000 a year"}, "attributes": [{"key": "jobtype", "label": "Full-time"}] } }] }Jobseeker mobile app init
POST
/v1/session/initopendataBootstraps the jobseeker session: cookie tracking key (ctk), service URLs, experiment buckets, IP country, terms-of-service banner and force-upgrade flags.
Auth: App API-key header plus country and locale headers. Optional OAuth Bearer access token.
- jobseekerMobileAppInit
- ctk
- services
- name
- url
- proctorResult
- deviceId
- matrixVersion
- ipCountry
- ipLookupCountry
- attributionParametersPayload
- affiliateKey
- showBlockingTOSBanner
- showForceUpgradeModal
- tosModalContent
POST /v1/session/init HTTP/1.1 Content-Type: application/json X-App-Key: <app-api-key> X-Country: US X-Locale: en_US { "platform": "ANDROID", "appVersion": "296.1.0" }{ "ctk": "1ctkexample", "services": [{"name": "jobgraph", "url": "https://example.com/v1"}], "proctorResult": {"deviceId": "dev-9f2a", "matrixVersion": "2026.09.1"}, "ipCountry": "US", "ipLookupCountry": "US", "attributionParametersPayload": {"affiliateKey": "", "host": "www.example.com", "keywords": "product manager"}, "showBlockingTOSBanner": false, "showForceUpgradeModal": false, "tosModalContent": {"version": "2026-01"} }Current Passport account
POST
/v1/account/profileosintLoads the signed-in Passport identity used by the Me tab — firstName, lastName, emailAddress, isVerified, accountId — plus inbox unread counters.
Auth: OAuth Bearer access token from the session-token exchange, plus app API-key, country and locale headers.
- currentUser
- PassportAccount
- firstName
- lastName
- emailAddress
- isVerified
- accountId
- isConfirmed
- isSignedIn
- creationDate
- globalUnreadEventCount
- unreadConversationCount
POST /v1/account/profile HTTP/1.1 Content-Type: application/json Authorization: Bearer <access_token> X-App-Key: <app-api-key> X-Country: US X-Locale: en_US { "include": ["accountProfile", "unreadCounts"] }{ "currentUser": { "account": { "type": "PassportAccount", "accountProfile": { "accountName": {"firstName": "Alex", "lastName": "Rivera"}, "email": {"emailAddress": "[email protected]", "isVerified": true} }, "accountId": "acct-1001", "emailAddress": "[email protected]", "isConfirmed": true, "isSignedIn": true, "creationDate": "2019-04-12T08:11:00Z" } }, "globalUnreadEventCount": 3, "unreadConversationCount": 2 }Find employer conversations
POST
/v1/messages/conversationsosintPages the signed-in jobseeker inbox: conversation id, unreadCount, employer participants, attached job, lastEvent.messagePreview and moderationStatus.
Auth: OAuth Bearer access token from the session-token exchange, plus app API-key, country, locale and tracking headers.
- findConversations
- conversations
- id
- unreadCount
- participants
- role
- accountKey
- participantName
- job
- key
- title
- lastEvent
- messagePreview
- locks
- reasonCode
- moderationStatus
- pageInfo
POST /v1/messages/conversations HTTP/1.1 Content-Type: application/json Authorization: Bearer <access_token> X-App-Key: <app-api-key> X-Country: US X-Locale: en_US X-Tracking-Key: <tk> { "conversationFilter": {"excludedLabels": ["ARCHIVE", "SPAM"]}, "first": 20 }{ "conversations": [{ "id": "Y29udjoxMjM", "userReadsInfo": {"unreadCount": 1}, "participants": [{"role": "EMPLOYER", "accountKey": "emp-441", "participantName": "Example Corp Recruiter"}], "job": {"key": "abc123def456", "title": "Staff Product Manager"}, "lastEvent": {"type": "MESSAGE", "messagePreview": "Are you free Thursday?"}, "locks": {"reasonCode": null}, "moderationStatus": "NONE" }], "pageInfo": {"endCursor": "cursor-20", "hasNextPage": true} }Recent job searches
POST
/v1/search/recentopendataReturns the signed-in jobseeker's recent search criteria (query, location) used to seed the home feed and widget.
Auth: OAuth Bearer access token from the session-token exchange, plus app API-key, country and locale headers.
- currentJobSeekerPortrait
- rawActivities
- recentJobSearches
- uid
- timestamp
- criteria
- query
- location
POST /v1/search/recent HTTP/1.1 Content-Type: application/json Authorization: Bearer <access_token> X-App-Key: <app-api-key> X-Country: US X-Locale: en_US {}{ "recentJobSearches": [{ "uid": "rjs-7788", "timestamp": "2026-09-26T18:04:00Z", "criteria": {"query": "product manager", "location": "Austin, TX"} }] }Resume tags on jobseeker profile
POST
/v1/profile/resume-tagsosintReads resume id and tags from the signed-in jobSeekerProfile used when applying and matching jobs.
Auth: OAuth Bearer access token from the session-token exchange, plus app API-key, country and locale headers.
- jobSeekerProfile
- profile
- resume
- id
- tags
POST /v1/profile/resume-tags HTTP/1.1 Content-Type: application/json Authorization: Bearer <access_token> X-App-Key: <app-api-key> X-Country: US X-Locale: en_US {}{ "jobSeekerProfile": { "profile": { "resume": { "id": "resume-9", "tags": ["product-management", "b2b-saas"] } } } }Application-status jobs (My Jobs)
GET
/v1/applications/statusopendataLists applied and visited jobs for the My Jobs tab: jobKey, company.name, pipeline statuses, applyTime, encryptedIaAppId and applicationStatus.
Auth: Session cookie or OAuth Bearer access token. Query params type, applyUpdateStartTime, tk (tracking key) and from.
- success
- appStatusJobs
- appTk
- jobTitle
- jobKey
- jobUrl
- jobExpired
- jobFraudulent
- withdrawn
- location
- company
- name
- candidateStatus
- selfReportedStatus
- employerJobStatus
- userJobStatus
- applyTime
- indeedApplyable
- encryptedIaAppId
- encryptedAdvCandId
- applicationStatus
- applicationStatusAction
- applicationStatusTimestamp
GET /v1/applications/status?type=APPLIED&applyUpdateStartTime=0&tk=<tk>&from=myjobs HTTP/1.1 Authorization: Bearer <access_token> Accept: application/json{ "success": true, "body": { "appStatusJobs": [{ "appTk": "1apptk", "jobTitle": "Staff Product Manager", "jobKey": "abc123def456", "jobUrl": "https://example.com/viewjob?jk=abc123def456", "jobExpired": false, "jobReported": false, "jobFraudulent": false, "withdrawn": false, "location": "Austin, TX", "company": {"name": "Example Corp"}, "statuses": { "candidateStatus": {"status": "APPLIED", "timestamp": 1727049600000}, "selfReportedStatus": {"status": "WAITING", "timestamp": 1727049600000}, "employerJobStatus": {"status": "ACTIVE", "timestamp": 1727049600000}, "userJobStatus": {"status": "APPLIED"} }, "applyTime": 1727049600000, "indeedApplyable": true, "hasIaAppId": true, "hasApplicationPreview": true, "hasInterviewNowAccess": false, "normalizedJobTitle": "product manager", "employerEstimatedResponseDays": 7, "encryptedIaAppId": "ia-enc-1", "encryptedAdvCandId": "cand-enc-1", "applicationStatus": "UNDER_REVIEW", "applicationStatusAction": "WAIT", "applicationStatusTimestamp": 1727136000000, "companyApplyUrl": null }] } }List interviews
GET
/v1/interviews/listopendataLoads interview invitations for My Jobs: formatType, status, durationInMinutes, invitationNote, jobDetails and timeSlots.
Auth: Session cookie or OAuth Bearer access token. Query params statuses, formats, start, tk and from.
- id
- externalInterviewId
- formatType
- status
- durationInMinutes
- interviewGTS
- outcome
- invitationNote
- availabilityBasedScheduling
- jobDetails
- title
- company
- jobKey
- jobUrl
- location
- fraudulent
- timeSlots
GET /v1/interviews/list?statuses=INVITED,SCHEDULED&formats=VIDEO,PHONE&start=0&tk=<tk>&from=myjobs HTTP/1.1 Authorization: Bearer <access_token> Accept: application/json{ "success": true, "body": { "interviews": [{ "id": "int-441", "externalInterviewId": "ext-882", "formatType": "VIDEO", "status": "SCHEDULED", "durationInMinutes": "30", "interviewGTS": true, "outcome": null, "invitationNote": "Looking forward to chatting.", "availabilityBasedScheduling": true, "jobDetails": { "title": "Staff Product Manager", "company": "Example Corp", "jobKey": "abc123def456", "jobUrl": "https://example.com/viewjob?jk=abc123def456", "location": "Austin, TX", "fraudulent": "false", "reportedByUser": "false" }, "timeSlots": [{"start": "2026-09-30T16:00:00Z", "end": "2026-09-30T16:30:00Z"}] }] } }Unread messages summary
GET
/v1/messages/unread-summaryosintBadge counts for the Messages tab: totalUnreadConversationCount and totalUnreadMessageCount.
Auth: Session cookie or OAuth Bearer access token. A fixed client query parameter identifies the Android app.
- data
- totalUnreadConversationCount
- totalUnreadMessageCount
GET /v1/messages/unread-summary?client=android-app HTTP/1.1 Authorization: Bearer <access_token> Accept: application/json{ "data": { "totalUnreadConversationCount": 2, "totalUnreadMessageCount": 5 } }Convert session cookies to OAuth token
POST
/v1/auth/tokenosintExchanges sign-in session cookies for an OAuth access_token / expires_in / scope / token_type used as Bearer auth on the app's graph and jobs services.
Auth: Session cookies on the request (including the refresh-token cookie). Form fields client_id and scope. Subsequent calls send Authorization: Bearer access_token.
- client_id
- scope
- access_token
- expires_in
- token_type
POST /v1/auth/token HTTP/1.1 Content-Type: application/x-www-form-urlencoded Cookie: refresh_token=<refresh> client_id=android-app&scope=openid%20profile%20email{ "access_token": "eyJhbGciOi...", "expires_in": 3600, "scope": "openid profile email", "token_type": "Bearer" }Keyword autocomplete (what)
GET
/v1/suggest/keywordsopendataTypeahead for the What search box: query plus country/language/ctk return suggestion strings used on the search results page.
Auth: Unauthenticated. Query params query, ctk, country, language, count; optional session identifiers.
- query
- ctk
- country
- language
- count
- formatted
- suggestion
- formattedSuggestion
GET /v1/suggest/keywords?query=product%20man&ctk=<ctk>&country=US&language=en&count=8&formatted=1 HTTP/1.1 Accept: application/json[ { "suggestion": "product manager", "formattedSuggestion": "<b>product man</b>ager" }, { "suggestion": "product management intern", "formattedSuggestion": "<b>product man</b>agement intern" } ]New jobs count for a saved search
GET
/v1/jobs/new-countopendataReturns how many new postings match a saved keyword/location pair since a timestamp — drives the new-jobs badge.
Auth: Optional sign-in session. Query params hl, q (keyword), l (location) and since (epoch).
- status
- body
- key
- newCount
GET /v1/jobs/new-count?hl=en&q=product%20manager&l=Austin%2C%20TX&since=1727049600000 HTTP/1.1 Accept: application/json{ "status": "ok", "body": { "key": "product manager|Austin, TX", "newCount": 14 } }
Data categories
- job listings
- applications
- interviews
- identity
- messaging
- search history
- resumes
Where teams use this data
Talent-pipeline reconciliation
An ATS nightly-syncs My Jobs applicationStatus, encryptedIaAppId and interview formatType/status so recruiters see the same pipeline a candidate sees in Indeed.
Job-market pulse from public cards
A labour-market dashboard hydrates getJobsData cards (title, compensation.formattedText, overallRating, location.formatted) without storing candidate PII.
Inbox SLA for employer replies
A jobseeker CRM watches FindConversations unreadCount plus /v1/messages/unread-summary totals to page when an employer thread goes stale.
Identity match at apply time
A background-check vendor binds Passport firstName/lastName/emailAddress/accountId from initGraph to the resume id returned by GetResumeTags before submitting Indeed Apply.
Frequently asked questions
Where do Indeed job cards come from?
The app posts to a graph-style job API — illustrated as /v1/jobs/recommendations for the home widget and /v1/jobs/cards for result cards — returning title, employer name, compensation text and overall rating.
How does Indeed Job Search authenticate?
Calls send an app API-key header with country and locale headers. After sign-in the app exchanges its session at /v1/auth/token for an OAuth access token sent as Bearer auth.
What identity fields does the signed-in account expose?
The account profile call returns first name, last name, email address, verification state and account id, plus inbox unread counters.
Which calls power My Jobs?
GET /v1/applications/status lists applied jobs with each application's pipeline status; GET /v1/interviews/list lists interview invitations with format, time slots and job details.
Apps similar to Indeed Job Search
- LinkedIn: Community & Network — A professional networking platform whose job listings are surfaced through member connections and recruiter outreach.
- ZipRecruiter — Uses AI matching to connect candidates with employers and syndicates job posts to more than 100 partner boards.
- Glassdoor | Jobs & Careers — Combines job listings with employee-written company reviews, salary data and interview insights.
- Monster — A long-running general job board that pairs its listings with a resume database used by recruiters.
- Snagajob — A job platform purpose-built for hourly, shift-based, retail and warehouse work.
- Dice — A job board for tech and IT roles with filtering by programming languages, frameworks and certifications.
- Handshake — A career platform for students and recent graduates with direct university career-center integrations.
- Wellfound — A startup-focused job board where companies list salary and equity ranges upfront.
Topics
- Indeed Job Search API
- Indeed job recommendations API
- Indeed application status API
- Indeed session token exchange
- Indeed interviews API
- Indeed autocomplete suggestions
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