ZipRecruiter Job Search data API
Job Search by ZipRecruiter is ZipRecruiter, Inc.'s Android client for the US hiring market: seekers search openings by keyword and location, read full job descriptions with pay bands, apply in one tap with ZipApply, save listings into My Jobs and answer recruiter messages from the inbox.
As a data source the app exposes the US vacancy market as structured records: job cards carrying listingKey, title, pay, benefits, company and location, seeker profiles with headline, skills, resumeTemporaryUrl and minimumAnnualDesiredPay, plus saved-search alerts with radiusMiles and remoteBehavior. Integrators build ATS match ranking, ZipApply profile-completeness checks and recruiter-inbox SLA tracking on top of it.
Job Search by ZipRecruiter (package com.ziprecruiter.android.release, version 26.12.0) is ZipRecruiter, Inc.'s Android client for the US job market, where seekers search openings, apply in one tap with ZipApply, save jobs and answer recruiter messages. Behind those screens sits a dataset of job listings with pay bands and benefits, seeker profiles with resumes, skills and desired salary, plus applications, saved searches and match alerts. That data feeds ATS match-ranking pipelines, profile-completeness checks and alert-response analytics for recruiting integrations.
Screenshots
API surface
The endpoints and request/response examples below are reconstructed from the app's interface — illustrative, not a live capture.
Register device
POST
/v1/device/registeropendataRegisters the handset at startup and returns encryptedDeviceId plus an inferred country and lat/lng used for anonymous job search.
Auth: No session cookie. HMAC request-signing headers; body is a string map of device attributes.
- encryptedDeviceId
- location
- inferredCountryCode
- inferredLatitude
- inferredLongitude
POST /v1/device/register HTTP/1.1 Content-Type: application/json X-Request-Signature: <hmac-signature> { "platform": "android", "appVersion": "26.12.0", "pushToken": "fcm-token-example" }{ "device": {"encryptedDeviceId": "enc_dev_9f2a1c"}, "location": "Austin, TX", "inferredCountryCode": "US", "inferredLatitude": 30.2672, "inferredLongitude": -97.7431 }Reconstructed from the anonymous-startup device registration flow and the inferred-location welcome screen
Sign in contact
POST
/v1/auth/signinopendataSigns the job seeker in (email OTP, password or Google) and returns the Contact card plus a session cookie used on later calls.
Auth: HMAC request-signing headers. The response session cookie is stored on the device and attached on later signed-in calls.
- success
- isLoggedIn
- isNew
- statusCode
- contactId
- emailAddress
- name
- phoneNumber
- zipCode
- desiredSalary
- headline
- inResumeDatabase
- resumeId
POST /v1/auth/signin HTTP/1.1 Content-Type: application/json X-Request-Signature: <hmac-signature> { "email": "[email protected]", "token": "otp-or-google-id-token", "source": "android" }{ "success": true, "isLoggedIn": true, "isNew": false, "statusCode": 200, "contact": { "contactId": "c_4412891", "emailAddress": "[email protected]", "name": "Alex Rivera", "phoneNumber": "+15125550123", "zipCode": "78701", "desiredSalary": "140000", "headline": "Staff Product Manager", "inResumeDatabase": true, "resumeId": "r_88ab" } }Reconstructed from the email sign-in screen and the account card it returns
Send login OTP
POST
/v1/auth/otp/emailopendataEmails a one-time password for the job-seeker login/registration flow.
Auth: HMAC request-signing headers. No session cookie required.
- status
- errorMessage
POST /v1/auth/otp/email HTTP/1.1 Content-Type: application/json X-Request-Signature: <hmac-signature> { "email": "[email protected]" }{ "status": "OTP_SENT", "errorMessage": "" }Reconstructed from the email one-time-code login flow
Validate OTP and register
POST
/v1/auth/otp/validateopendataConfirms the emailed OTP and returns contactId, credentialUpdateId and ptid that bind the session to a job-seeker account.
Auth: HMAC request-signing headers. A successful response issues contactId and ptid used as the signed-in identity.
- oneTimePassword
- listingKey
- source
- explicitOptIn
- status
- errorMessage
- contactId
- credentialUpdateId
- ptid
POST /v1/auth/otp/validate HTTP/1.1 Content-Type: application/json X-Request-Signature: <hmac-signature> { "email": "[email protected]", "oneTimePassword": "482913", "listingKey": "", "source": "android", "explicitOptIn": true }{ "status": "OK", "errorMessage": "", "contactId": "c_4412891", "credentialUpdateId": "cred_19", "ptid": "pt_7f3a" }Reconstructed from the one-time-code confirmation screen that creates the seeker account
List job keys
POST
/v1/feed/listing-keysopendataPages the search/home job feed as JobKey records (listingKey, matchId) plus totalListings, before cards are hydrated.
Auth: Session cookie from the sign-in call plus HMAC request-signing headers.
- placementId
- engine
- limit
- offset
- impressionLotId
- ptid
- contactId
- jobKeys
- listingKey
- matchId
- sourcePlacementId
- totalListings
- continueToken
POST /v1/feed/listing-keys HTTP/1.1 Content-Type: application/json Cookie: <session-cookie> X-Request-Signature: <hmac-signature> { "req": { "placementId": 12, "engine": "match-v2", "limit": 20, "offset": 0, "impressionLotId": "lot_aa12", "ptid": "pt_7f3a", "contactId": "4412891" } }{ "rsp": { "jobKeys": [{ "listingKey": "jk_9c2e1b", "matchId": "m_4412", "sourcePlacementId": 12 }], "totalListings": 1842 }, "impressionLotId": "lot_aa12", "continueToken": "ct_next_20" }Reconstructed from the paginated home and search feed that lists matching jobs
Hydrate job cards
POST
/v1/feed/cardsopendataTurns listing keys into feed cards with title, pay, benefits, company, location and saved state for the search and home lists.
Auth: Session cookie from the sign-in call plus HMAC request-signing headers.
- jobKeys
- placementId
- impressionLotId
- contactId
- jobCards
- matchId
- listingKey
- title
- status
- pay
- benefits
- employmentTypes
- locationTypes
- company
- shortDescription
- saved
- companyLogo
- location
- isNew
POST /v1/feed/cards HTTP/1.1 Content-Type: application/json Cookie: <session-cookie> X-Request-Signature: <hmac-signature> { "req": { "jobKeys": [{"listingKey": "jk_9c2e1b", "matchId": "m_4412"}], "placementId": 12, "impressionLotId": "lot_aa12", "ptid": "pt_7f3a", "contactId": "4412891" } }{ "rsp": { "jobCards": [{ "matchId": "m_4412", "listingKey": "jk_9c2e1b", "title": "Staff Product Manager", "status": "ACTIVE", "pay": "$140,000 - $180,000 a year", "benefits": ["Health", "401k"], "employmentTypes": ["FULL_TIME"], "locationTypes": ["HYBRID"], "company": "Example Corp", "shortDescription": "Own the job-seeker home feed.", "saved": false, "companyLogo": "https://example.com/logo.png", "location": "Austin, TX", "isNew": true }] } }Reconstructed from the job-card list that shows title, pay, company and location
Get job details
POST
/v1/listings/detailsopendataLoads the job-details screen: full HTML description, pay, benefits, company widget and share URLs for a listingKey.
Auth: Session cookie from the sign-in call plus HMAC request-signing headers.
- jobKey
- listingKey
- matchId
- placementId
- contactId
- jobDetails
- title
- status
- pay
- benefits
- employmentTypes
- company
- htmlFullDescription
- saved
- location
- companyLogoUrl
- shareUrls
- facebookUrl
- linkedinUrl
- shortUrl
POST /v1/listings/details HTTP/1.1 Content-Type: application/json Cookie: <session-cookie> X-Request-Signature: <hmac-signature> { "req": { "jobKey": {"listingKey": "jk_9c2e1b", "matchId": "m_4412"}, "placementId": 12, "impressionLotId": "lot_aa12", "ptid": "pt_7f3a", "contactId": "4412891" } }{ "rsp": { "jobDetails": { "listingKey": "jk_9c2e1b", "title": "Staff Product Manager", "status": "ACTIVE", "pay": "$140,000 - $180,000 a year", "benefits": ["Health", "401k"], "employmentTypes": ["FULL_TIME"], "company": "Example Corp", "htmlFullDescription": "<p>Own the job-seeker home feed.</p>", "saved": false, "companyWidget": {"name": "Example Corp"}, "location": "Austin, TX", "companyLogoUrl": "https://example.com/logo.png", "shareUrls": { "facebookUrl": "https://example.com/share/facebook", "linkedinUrl": "https://example.com/share/linkedin", "twitterUrl": "https://example.com/share/twitter", "emailUrl": "mailto:?subject=Staff%20Product%20Manager", "shortUrl": "https://example.com/j/jk_9c2e1b" }, "matchId": "m_4412" } } }Reconstructed from the job-details screen with the full description and share links
Save job
POST
/v1/lists/saved/addopendataBookmarks a listing on the signed-in seeker's saved-jobs list (My Jobs).
Auth: Session cookie from the sign-in call plus HMAC request-signing headers.
- ptid
- contactId
- listingKey
- placementId
POST /v1/lists/saved/add HTTP/1.1 Content-Type: application/json Cookie: <session-cookie> X-Request-Signature: <hmac-signature> { "req": { "ptid": "pt_7f3a", "contactId": "4412891", "listingKey": "jk_9c2e1b", "placementId": 12 } }{ "ok": true }Reconstructed from the bookmark action on job cards and the My Jobs saved list
Get job-seeker profile
POST
/v1/profiles/seekerosintReads the unified job-seeker profile: headline, skills, education, employment history, resume/photo URLs and private salary/phone fields.
Auth: Session cookie from the sign-in call plus HMAC request-signing headers.
- contactId
- generatePresignedResumeUrl
- generatePresignedPhotoUrl
- jobseekerProfile
- headline
- executiveSummary
- experienceLevel
- hasResume
- skills
- education
- employment
- jobPreferences
- relocateOk
- remoteOk
- minimumAnnualDesiredPay
- resumeTemporaryUrl
- photoTemporaryUrl
- discoverabilityOptIn
- desiredSalaryRaw
- displayPhone
POST /v1/profiles/seeker HTTP/1.1 Content-Type: application/json Cookie: <session-cookie> X-Request-Signature: <hmac-signature> { "contactId": "4412891", "generatePresignedResumeUrl": true, "generatePresignedPhotoUrl": true }{ "jobseekerProfile": { "contactId": "4412891", "headline": "Staff Product Manager", "executiveSummary": "8 years in marketplace products.", "experienceLevel": "SENIOR", "hasPhoto": true, "hasResume": true, "skills": ["Android", "SQL"], "education": [{"degree": "B.S.", "school": "UT Austin"}], "employment": [{"company": "Example Corp", "title": "PM"}], "jobPreferences": {"relocateOk": false, "remoteOk": true, "minimumAnnualDesiredPay": 140000}, "resumeFilename": "alex-rivera.pdf", "resumeTemporaryUrl": "https://example.com/resume.pdf", "photoTemporaryUrl": "https://example.com/photo.jpg", "discoverabilityOptIn": true }, "private": { "engagementLevel": "HIGH", "desiredSalaryRaw": "140000", "displayPhone": "+15125550123", "location": "Austin, TX" } }Reconstructed from the seeker profile screen with resume, skills and pay preferences
One-click apply eligibility
POST
/v1/apply/eligibilityopendataTells the job-details apply button whether ZipApply one-click is available, or which profile/listing gaps block it.
Auth: Session cookie from the sign-in call plus HMAC request-signing headers.
- listingKey
- contactId
- oneClickApply
- profileGap
- listingGap
POST /v1/apply/eligibility HTTP/1.1 Content-Type: application/json Cookie: <session-cookie> X-Request-Signature: <hmac-signature> { "req": { "listingKey": "jk_9c2e1b", "contactId": "4412891" } }{ "rsp": { "listingKey": "jk_9c2e1b", "oneClickApply": true, "profileGap": null, "listingGap": null } }Reconstructed from the apply button state that checks one-tap apply availability
Apply to listing
POST
/v1/apply/submitopendataSubmits a ZipApply application for a listing, carrying attribution (placementId, utm*) from the card the seeker tapped.
Auth: Session cookie from the sign-in call plus HMAC request-signing headers.
- listing_key
- referrer
- source
- placementId
- trafficSourceId
- utmSource
- utmCampaign
- utmMedium
- justWebView
- applicationId
- status
POST /v1/apply/submit HTTP/1.1 Content-Type: application/json Cookie: <session-cookie> X-Request-Signature: <hmac-signature> { "listingKey": "jk_9c2e1b", "referrer": "android_job_details", "source": "zipapply", "placementId": "12", "trafficSourceId": "ts_1", "utmSource": "app", "utmCampaign": "home_feed", "utmMedium": "android", "justWebView": false }{ "success": true, "listingKey": "jk_9c2e1b", "applicationId": "app_5510", "status": "SUBMITTED" }Reconstructed from the one-tap apply confirmation flow with its attribution fields
Get notifications
POST
/v1/notifications/feedopendataPages the in-app notification center: match alerts with title, body, deep-link url and the related jobKey.
Auth: Session cookie from the sign-in call plus HMAC request-signing headers.
- contactId
- ptid
- placementId
- limit
- continueToken
- notifications
- id
- createTimeUtc
- type
- title
- body
- url
- jobKey
- impressionLotId
POST /v1/notifications/feed HTTP/1.1 Content-Type: application/json Cookie: <session-cookie> X-Request-Signature: <hmac-signature> { "contactId": "4412891", "ptid": "pt_7f3a", "placementId": 12, "limit": 20, "continueToken": "" }{ "notifications": [{ "id": "n_9021", "createTimeUtc": "2026-09-28T14:02:11Z", "type": "NEW_MATCH", "title": "New match: Staff Product Manager", "body": "Example Corp in Austin, TX", "url": "ziprecruiter://job/jk_9c2e1b", "jobKey": {"listingKey": "jk_9c2e1b", "matchId": "m_4412"} }], "impressionLotId": "lot_n1", "continueToken": "ct_n20" }Reconstructed from the in-app notification center with its match alerts
Unread recruiter messages
POST
/v1/messages/unread-countopendataReturns the recruiter-inbox unread badge shown on the Conversations tab.
Auth: Session cookie from the sign-in call plus HMAC request-signing headers.
- contactId
- unreadCount
POST /v1/messages/unread-count HTTP/1.1 Content-Type: application/json Cookie: <session-cookie> X-Request-Signature: <hmac-signature> { "contactId": "4412891" }{ "unreadCount": 3 }Reconstructed from the unread badge on the recruiter messages tab
Set saved searches
POST
/v1/alerts/saved-searchesopendataPersists the seeker's saved job alerts (query, location, radiusMiles, remoteBehavior) used for push and email matches.
Auth: Session cookie from the sign-in call plus HMAC request-signing headers.
- savedSearches
- search
- location
- countryAlpha2
- radiusMiles
- contactId
- locid
- remoteBehavior
- lastModifiedTime
- placementId
POST /v1/alerts/saved-searches HTTP/1.1 Content-Type: application/json Cookie: <session-cookie> X-Request-Signature: <hmac-signature> { "savedSearches": [{ "search": "product manager", "location": "Austin, TX", "countryAlpha2": "US", "radiusMiles": 25, "contactId": "4412891", "locid": "loc_austin", "remoteBehavior": "INCLUDE_REMOTE" }], "placementId": 12 }{ "ok": true }Reconstructed from the saved job-alert editor with query, location and radius fields
Account deletion status
GET
/v1/account/deletion-statusopendataReads the account-deletion request status and requestedTime for the signed-in contact.
Auth: Session cookie from the sign-in call plus HMAC request-signing headers.
- contact_id
- status
- requestedTime
GET /v1/account/deletion-status HTTP/1.1 Cookie: <session-cookie> X-Request-Signature: <hmac-signature>{ "status": "PENDING", "requestedTime": "2026-09-20T18:11:00Z" }Reconstructed from the account privacy screen showing deletion request status
Data categories
- job listings
- job-seeker profiles
- applications
- notifications
- saved searches
- device identity
Where teams use this data
Job-feed matching warehouse
Nightly pull the job feed for a contactId and store listingKey, title, pay, company, location and saved so an ATS can rank ZipRecruiter matches against an internal req pipeline.
Profile completeness for ZipApply
Read the seeker profile (headline, skills, hasResume, minimumAnnualDesiredPay, resumeTemporaryUrl) and the one-tap apply eligibility for each listingKey to flag profileGap before routing a candidate into the apply flow.
Alert and inbox SLA
Poll the notification feed and the unread recruiter-message count to measure time-to-open on NEW_MATCH alerts and recruiter replies, keyed by contactId and listingKey.
Saved-search coverage
Write saved searches with query, location, radiusMiles and remoteBehavior so a career-site widget can keep ZipRecruiter job alerts in sync with a seeker's preferred query.
Frequently asked questions
How does ZipRecruiter authenticate job-seeker API calls?
Anonymous traffic registers the device first and receives an encryptedDeviceId plus an inferred country used for local results. Email sign-in sends a one-time code; confirming it returns contactId and ptid and sets a session cookie. Signed-in calls carry that cookie plus HMAC request-signing headers.
Which fields identify a ZipRecruiter job listing?
Every listing carries a listingKey plus a matchId for the seeker match. Hydrated cards and the detail view add title, pay, benefits, employmentTypes, company, location, shortDescription or htmlFullDescription, saved state and share URLs.
Can I read a seeker's resume and salary preference?
The signed-in seeker profile returns hasResume, resumeFilename and a temporary resume URL, plus headline, skills, education, employment history and jobPreferences.minimumAnnualDesiredPay; private fields include desiredSalaryRaw and displayPhone.
Where does one-tap ZipApply get decided?
An eligibility check per listingKey returns oneClickApply plus optional profileGap and listingGap. Eligible listings then submit the application with placementId and UTM attribution carried from the card the seeker tapped.
Apps similar to Job Search by ZipRecruiter
- Indeed Job Search — Indeed is a global job aggregator whose app covers listings across industries; employers sponsor posts pay-per-click instead of ZipRecruiter's subscription model.
- LinkedIn — LinkedIn combines a professional network with job listings and Easy Apply, and is strongest for white-collar, professional and senior roles.
- Glassdoor — Glassdoor pairs job listings with company reviews, salary data and interview insights, so seekers can research employers before applying.
- Monster — Monster is a long-running general job board that now includes AI matching features for connecting seekers with openings.
- CareerBuilder — CareerBuilder is an established job board offering listings, a resume database and talent-management tools for the US market.
- Snagajob — Snagajob focuses exclusively on hourly and shift work in restaurants, retail and hospitality, with one-click applications and map search that are free for job seekers.
- JOB TODAY — JOB TODAY is a mobile-first app for hourly and service jobs with more than 10 million downloads.
Topics
- ZipRecruiter API
- ZipRecruiter job search endpoints
- listingKey
- ZipApply
- jobseekerProfile
- encryptedDeviceId
- contactId
- saved searches
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