OCC: Job Search (OCCMundial) data API
OCC: Job Search is OCCMundial's Android client for the occ.com.mx job board. Vacancy cards come from GET /v1/jobs/search; the signed-in jobseeker record lives at GET /v1/me/profile. Apply (POST /v1/jobs/{jobId}/apply), CV file upload (POST /v1/me/resume/file), recruiter views (GET /v1/me/profile-views) and in-app recruiter chat (GET /v1/me/conversations) sit on the same JSON API, authenticated with a Bearer token from POST /oauth/token.
OCC: Job Search (package mx.com.occ, versionName 6.25.0) is OCCMundial's Android client for Mexico's occ.com.mx job board: candidates search vacancies, open a posting, apply (including killer questions and skills), upload a CV, watch recruiter views, save favorites and talk to recruiters in-app. Behind those screens the app talks to a token-authenticated JSON data API: signed-in calls attach a Bearer access token from an OpenID Connect sign-in (authorization-code + PKCE). Vacancy cards use wire names such as jobOfferId, jobTitle, companyPrettyName, companyLogoUrl, salaryMin, salaryMax, salaryNegotiable, locationName, hasKillerQuestions, isFavorite and isApplied. The surface below covers token login, job search, job details, related vacancies, the candidate profile, CV download/upload, apply, applied-jobs history, favorites, recruiter views, job alerts, job suggestions and recruiter chat.
Screenshots
API surface
OAuth2 token (candidate login)
POST
/oauth/tokenosintExchanges an OCCMundial authorization code (or refresh_token) for the Bearer accessToken that the candidate sign-in and every later /v1 call attach.
Auth: Unauthenticated. Authorization-code + PKCE exchange. Later REST calls send Authorization: Bearer <accessToken>. Refresh uses grant_type=refresh_token on the same endpoint.
- grant_type
- code
- redirect_uri
- clientId
- code_verifier
- access_token
- refresh_token
- id_token
- token_type
- expires_in
- scope
- sub
Illustrative example reconstructed from the app's interface — not a live capture.
POST /oauth/token HTTP/1.1 Content-Type: application/x-www-form-urlencoded grant_type=authorization_code&code=<auth-code>&redirect_uri=<app-redirect-uri>&client_id=<portal-client-id>&code_verifier=<pkce-verifier>{ "access_token": "<accessToken>", "refresh_token": "<refreshToken>", "id_token": "<idToken>", "token_type": "Bearer", "expires_in": 3600, "scope": "openid profile email" }Derived from the app's interface; endpoint details are illustrative, not a live capture.
reconstructed from the app's sign-in and session-refresh flowfield set mirrors a standard OpenID Connect token response
Search job offers
GET
/v1/jobs/searchopendataReturns the vacancy listing used by the empleos search-results screen: jobTitle, companyPrettyName, salaryMin/salaryMax, locationName, facets and pagination.
Auth: Optional Bearer accessToken from POST /oauth/token. Anonymous search still sends a portal identifier; signed-in calls personalise isFavorite / isApplied.
- jobOffers
- jobOfferId
- encryptedId
- jobTitle
- companyName
- companyPrettyName
- companyLogoUrl
- companySector
- companyRating
- isCompanyVerified
- isCompanyConfidential
- salaryMin
- salaryMax
- salaryNegotiable
- salaryInterval
- isSalaryVisible
- locationId
- locationName
- publicationDate
- jobModality
- hasKillerQuestions
- isFavorite
- isApplied
- affinityScore
- facets
- selectedFacets
- pageNumber
- total
- hasMore
Illustrative example reconstructed from the app's interface — not a live capture.
GET /v1/jobs/search?keywords=ingeniero+software&locationIds=9&cityIds=555&categoryIds=12&salaryMin=20000&salaryMax=45000&pageNumber=1&pageSize=20&sortBy=publicationDate HTTP/1.1 Authorization: Bearer <accessToken> Accept: application/json{ "jobOffers": [{ "jobOfferId": "18442091", "encryptedId": "enc-off-18442091", "jobTitle": "Ingeniero de software", "companyName": "Example Corp", "companyPrettyName": "Example Corp SA de CV", "companyLogoUrl": "https://cdn.example.com/logos/example.png", "companySector": "Tecnología", "companyRating": 4.2, "isCompanyVerified": true, "isCompanyConfidential": false, "salaryMin": 25000, "salaryMax": 38000, "salaryNegotiable": false, "salaryInterval": "monthly", "isSalaryVisible": true, "locationId": 9, "locationName": "Ciudad de México", "publicationDate": "2026-09-20T15:04:00Z", "jobModality": "hybrid", "hasKillerQuestions": true, "isFavorite": false, "isApplied": false, "affinityScore": 0.81, "jobFirstToApply": true }], "total": 1284, "pageNumber": 1, "hasMore": true, "facets": [{"facetId": "salary", "facetType": "salary", "count": 412}], "selectedFacets": [] }Derived from the app's interface; endpoint details are illustrative, not a live capture.
reconstructed from the app's vacancy search-results flowfield set mirrors the listing cards shown for a keyword and location search
Fetch job offer by id
GET
/v1/jobs/{jobId}opendataHydrates a single OCCMundial posting (description, requirements, jobBenefits, salary band, company verification) for the job-detail screen.
Auth: Optional Bearer accessToken. Personalised blocks (isApplied, isFavorite, affinityScore) require a signed-in candidate.
- jobOffer
- jobOfferId
- encryptedId
- jobTitle
- description
- requirements
- jobBenefits
- companyId
- companyPrettyName
- companyLogoUrl
- companySector
- companyRating
- isCompanyVerified
- isCompanyConfidential
- salaryMin
- salaryMax
- workplaceType
- contractTypeId
- publicationDate
- hasKillerQuestions
- hasSkills
- isExternal
- isFavorite
- isApplied
Illustrative example reconstructed from the app's interface — not a live capture.
GET /v1/jobs/18442091 HTTP/1.1 Authorization: Bearer <accessToken> Accept: application/json{ "jobOffer": { "jobOfferId": "18442091", "encryptedId": "enc-off-18442091", "jobTitle": "Ingeniero de software", "description": "Construye servicios de marketplace en CDMX.", "requirements": "3+ años en Kotlin o Java.", "jobBenefits": ["SGMM", "home office 2 días"], "companyId": "co-441", "companyPrettyName": "Example Corp SA de CV", "companyLogoUrl": "https://cdn.example.com/logos/example.png", "companySector": "Tecnología", "companyRating": 4.2, "isCompanyVerified": true, "isCompanyConfidential": false, "salaryMin": 25000, "salaryMax": 38000, "salaryNegotiable": false, "locationName": "Ciudad de México", "workplaceType": "hybrid", "contractTypeId": 1, "publicationDate": "2026-09-20T15:04:00Z", "hasKillerQuestions": true, "hasSkills": true, "isExternal": false, "isFavorite": false, "isApplied": false } }Derived from the app's interface; endpoint details are illustrative, not a live capture.
reconstructed from the app's job-detail screen flowfield set mirrors the full posting card plus description and requirements blocks
Related job offers
GET
/v1/jobs/{jobId}/relatedopendataReturns related vacancies for the job-detail carousel, scored with affinityScore.
Auth: Optional Bearer accessToken. Offers the candidate has hidden are filtered out before display.
- relatedJobOffers
- jobOfferId
- jobTitle
- companyPrettyName
- companyLogoUrl
- locationName
- salaryMin
- salaryMax
- affinityScore
- isSimilarJob
- isFavorite
- jobOffersAffinityScoreList
Illustrative example reconstructed from the app's interface — not a live capture.
GET /v1/jobs/18442091/related HTTP/1.1 Authorization: Bearer <accessToken> Accept: application/json{ "relatedJobOffers": [{ "jobOfferId": "18443002", "jobTitle": "Desarrollador backend", "companyPrettyName": "Example Labs", "companyLogoUrl": "https://cdn.example.com/logos/labs.png", "locationName": "Guadalajara", "salaryMin": 22000, "salaryMax": 32000, "affinityScore": 0.74, "isSimilarJob": true, "isFavorite": false }], "jobOffersAffinityScoreList": [0.74] }Derived from the app's interface; endpoint details are illustrative, not a live capture.
reconstructed from the job-detail related-vacancies carouselaffinity scoring mirrors the ranking shown alongside an open posting
Get signed-in candidate
GET
/v1/me/profileosintLoads the signed-in jobseeker record (name, email, phoneNumber, encryptedCurriculumId, resumeVisibility, feature flags) that gates the apply and chat screens.
Auth: Bearer accessToken from POST /oauth/token. An expired session triggers a token refresh and then sign-out if the refresh fails.
- candidate
- candidateId
- encryptedCandidateId
- firstName
- middleName
- lastName
- phoneNumber
- gender
- birthDate
- candidateStatusId
- curriculumId
- encryptedCurriculumId
- resumeVisibility
- features
- isVerified
Illustrative example reconstructed from the app's interface — not a live capture.
GET /v1/me/profile HTTP/1.1 Authorization: Bearer <accessToken> Accept: application/json{ "candidate": { "candidateId": 8845123, "encryptedCandidateId": "enc-cand-8845123", "firstName": "María", "middleName": "Elena", "lastName": "Hernández", "email": "[email protected]", "phoneNumber": "5512345678", "gender": "F", "birthDate": "1994-03-12", "candidateStatusId": 1, "curriculumId": 44189012, "encryptedCurriculumId": "enc-cv-44189012", "resumeVisibility": "public", "features": ["chatEnabled", "chargedApply"], "isVerified": true } }Derived from the app's interface; endpoint details are illustrative, not a live capture.
reconstructed from the app's signed-in profile bootstrapfield set mirrors the candidate record shown across the dashboard tabs
Get candidate CV / resume
GET
/v1/me/resumeosintReturns the structured OCCMundial CV (skills, jobExperiences, education, certification, language, visibility) that the curriculo screens display and edit.
Auth: Bearer accessToken from POST /oauth/token. Requires an active curriculumId on the candidate.
- resume
- resumeId
- curriculumId
- encryptedCurriculumId
- visibility
- isFirstJob
- jobTitle
- skills
- encryptedSkillId
- levelId
- jobExperiences
- company
- position
- startDate
- endDate
- isCurrent
- education
- institution
- certification
- encryptedCertificationId
- language
- languageId
- languageLevel
Illustrative example reconstructed from the app's interface — not a live capture.
GET /v1/me/resume HTTP/1.1 Authorization: Bearer <accessToken> Accept: application/json{ "resume": { "resumeId": 44189012, "curriculumId": 44189012, "encryptedCurriculumId": "enc-cv-44189012", "visibility": "public", "isFirstJob": false, "jobTitle": "Ingeniera de software", "skills": [{"encryptedSkillId": "enc-sk-91", "skill": "Kotlin", "levelId": 3}], "jobExperiences": [{ "company": "Example Corp", "position": "Ingeniera de software", "startDate": "2021-03-01", "endDate": null, "isCurrent": true, "expIsFirstJob": false }], "education": [{"institution": "UNAM", "year": 2017}], "certification": [{"encryptedCertificationId": "enc-cert-7", "institution": "Google", "year": 2024}], "language": [{"languageId": 1, "languageLevel": "C1"}] } }Derived from the app's interface; endpoint details are illustrative, not a live capture.
reconstructed from the app's curriculum edit screenssection set mirrors the skills, experience, education and language blocks shown to the jobseeker
Upload CV file
POST
/v1/me/resume/fileosintUploads the candidate's attached CV file (PDF/DOC) and returns encryptedFileId / fileUri used to download, attach or set the default CV.
Auth: Bearer accessToken from POST /oauth/token. Multipart upload of the attached CV file.
- encryptedFileId
- fileName
- mimeType
- fileSize
- fileUri
- curriculumId
- encryptedCurriculumId
Illustrative example reconstructed from the app's interface — not a live capture.
POST /v1/me/resume/file HTTP/1.1 Authorization: Bearer <accessToken> Content-Type: multipart/form-data; boundary=----occ ------occ Content-Disposition: form-data; name="file"; filename="cv-maria.pdf" Content-Type: application/pdf <pdf-bytes> ------occ--{ "encryptedFileId": "enc-file-9081", "fileName": "cv-maria.pdf", "mimeType": "application/pdf", "fileSize": 184320, "fileUri": "https://files.example.com/v1/me/resume/file/enc-file-9081", "curriculumId": 44189012, "encryptedCurriculumId": "enc-cv-44189012" }Derived from the app's interface; endpoint details are illustrative, not a live capture.
reconstructed from the app's attach-CV upload flowmultipart shape mirrors the file picker shown on the curriculum screen
Apply to a job offer
POST
/v1/jobs/{jobId}/applyopendataSubmits a postulación to a vacancy with killerQuestionAnswers and skillAnswers; returns applicationId / applicationStatusId for the postulaciones list.
Auth: Bearer accessToken from POST /oauth/token. Candidate must have a complete CV; killerQuestionAnswers and skillAnswers are required when hasKillerQuestions / hasSkills is true.
- encryptedCandidateId
- jobOfferId
- encryptedCurriculumId
- killerQuestionAnswers
- skillAnswers
- applicationId
- jobApplicationId
- applicationDate
- applicationStatusId
- isApplied
- chargedApply
Illustrative example reconstructed from the app's interface — not a live capture.
POST /v1/jobs/18442091/apply HTTP/1.1 Authorization: Bearer <accessToken> Content-Type: application/json { "encryptedCandidateId": "enc-cand-8845123", "encryptedCurriculumId": "enc-cv-44189012", "killerQuestionAnswers": [{"questionId": 11, "answerText": "Sí"}], "skillAnswers": [{"encryptedSkillId": "enc-sk-91", "levelId": 3}] }{ "applicationId": "app-55201", "jobApplicationId": "app-55201", "jobOfferId": "18442091", "applicationDate": "2026-09-27T14:22:00Z", "applicationStatusId": 1, "isApplied": true, "chargedApply": false }Derived from the app's interface; endpoint details are illustrative, not a live capture.
reconstructed from the app's apply flow including killer-question and skill promptsresponse shape mirrors the confirmation shown after a successful postulación
List applied job offers
GET
/v1/me/applicationsopendataLists the vacancies the candidate already applied to for the postulaciones tab.
Auth: Bearer accessToken from POST /oauth/token.
- jobOffers
- jobOfferId
- jobTitle
- companyPrettyName
- companyLogoUrl
- applicationId
- applicationDate
- applicationStatusId
- isApplied
- locationName
- total
Illustrative example reconstructed from the app's interface — not a live capture.
GET /v1/me/applications HTTP/1.1 Authorization: Bearer <accessToken> Accept: application/json{ "jobOffers": [{ "jobOfferId": "18442091", "jobTitle": "Ingeniero de software", "companyPrettyName": "Example Corp SA de CV", "companyLogoUrl": "https://cdn.example.com/logos/example.png", "applicationId": "app-55201", "applicationDate": "2026-09-27T14:22:00Z", "applicationStatusId": 1, "isApplied": true, "locationName": "Ciudad de México" }], "total": 6 }Derived from the app's interface; endpoint details are illustrative, not a live capture.
reconstructed from the app's postulaciones history tabfield set mirrors the applied-job cards and their status labels
List favorite job offers
GET
/v1/me/favoritesopendataReads saved vacancies keyed by encryptedFavoritesIds for the favorites screen.
Auth: Bearer accessToken from POST /oauth/token. Query encryptedFavoritesIds or typeId; the same resource is written when a favorite is toggled.
- favoriteJobOffers
- encryptedFavoritesIds
- typeId
- jobOfferId
- encryptedId
- jobTitle
- companyPrettyName
- locationName
- salaryMin
- salaryMax
- isFavorite
Illustrative example reconstructed from the app's interface — not a live capture.
GET /v1/me/favorites?typeId=1 HTTP/1.1 Authorization: Bearer <accessToken> Accept: application/json{ "favoriteJobOffers": [{ "jobOfferId": "18442091", "encryptedId": "enc-off-18442091", "jobTitle": "Ingeniero de software", "companyPrettyName": "Example Corp SA de CV", "locationName": "Ciudad de México", "salaryMin": 25000, "salaryMax": 38000, "isFavorite": true }], "encryptedFavoritesIds": ["enc-off-18442091"] }Derived from the app's interface; endpoint details are illustrative, not a live capture.
reconstructed from the app's favorites screen and favorite-toggle interactionfield set mirrors the saved-vacancy cards
Recruiter profile views
GET
/v1/me/profile-viewsosintReturns which recruiters looked at the candidate plus totalRecruiterViews / totalCompanies for the resume-visits dashboard.
Auth: Bearer accessToken from POST /oauth/token.
- recruiterViews
- companyId
- companyPrettyName
- companyLogoUrl
- recruiterViewsCount
- createdAt
- totalRecruiterViews
- totalCompanyViews
- totalCompanies
Illustrative example reconstructed from the app's interface — not a live capture.
GET /v1/me/profile-views HTTP/1.1 Authorization: Bearer <accessToken> Accept: application/json{ "recruiterViews": [{ "companyId": "co-441", "companyPrettyName": "Example Corp SA de CV", "companyLogoUrl": "https://cdn.example.com/logos/example.png", "recruiterViewsCount": 3, "createdAt": "2026-09-26T11:00:00Z" }], "totalRecruiterViews": 17, "totalCompanyViews": 9, "totalCompanies": 9 }Derived from the app's interface; endpoint details are illustrative, not a live capture.
reconstructed from the app's resume-visits dashboardtotals mirror the recruiter-interest counters shown to the jobseeker
Job alert list
GET
/v1/me/alertsopendataLists saved empleo alerts that push matching vacancies to the candidate.
Auth: Bearer accessToken from POST /oauth/token.
- alertId
- keywords
- locationIds
- locationName
- salaryMin
- criteria
- frequency
- isActive
- receiveAlerts
Illustrative example reconstructed from the app's interface — not a live capture.
GET /v1/me/alerts HTTP/1.1 Authorization: Bearer <accessToken> Accept: application/json{ "alerts": [{ "alertId": "al-2201", "keywords": "ingeniero software", "locationIds": [9], "locationName": "Ciudad de México", "salaryMin": 20000, "criteria": {"categoryIds": [12], "jobModality": "hybrid"}, "frequency": "daily", "isActive": true, "receiveAlerts": true }] }Derived from the app's interface; endpoint details are illustrative, not a live capture.
reconstructed from the app's saved-alert management screencriteria shape mirrors the keyword, location and frequency options shown per alert
Suggested jobs
GET
/v1/me/suggested-jobsopendataReturns personalised vacancy suggestions for the dashboard suggestions screen.
Auth: Bearer accessToken from POST /oauth/token. Requires an active curriculumId.
- suggestedJobOffers
- jobOfferId
- jobTitle
- companyPrettyName
- locationName
- salaryMin
- salaryMax
- affinityScore
- isFavorite
Illustrative example reconstructed from the app's interface — not a live capture.
GET /v1/me/suggested-jobs HTTP/1.1 Authorization: Bearer <accessToken> Accept: application/json{ "suggestedJobOffers": [{ "jobOfferId": "18445110", "jobTitle": "Desarrolladora Android", "companyPrettyName": "Example Mobile", "locationName": "Monterrey", "salaryMin": 28000, "salaryMax": 40000, "affinityScore": 0.88, "isFavorite": false }] }Derived from the app's interface; endpoint details are illustrative, not a live capture.
reconstructed from the app's dashboard suggestions screenranking mirrors the affinity-scored recommendation cards
Recruiter chat conversations
GET
/v1/me/conversationsosintLists recruiter–candidate conversations with unreadMessagesCount for the in-app chat inbox.
Auth: Bearer accessToken from POST /oauth/token. Feature gated by the chatEnabled flag on the candidate profile.
- conversationId
- encryptedIdConversation
- companyPrettyName
- jobOfferId
- jobTitle
- unreadMessagesCount
- lastMessage
- messageCreationDate
- senderId
- totalMessagesCount
Illustrative example reconstructed from the app's interface — not a live capture.
GET /v1/me/conversations HTTP/1.1 Authorization: Bearer <accessToken> Accept: application/json{ "conversations": [{ "conversationId": "conv-901", "encryptedIdConversation": "enc-conv-901", "companyPrettyName": "Example Corp SA de CV", "jobOfferId": "18442091", "jobTitle": "Ingeniero de software", "unreadMessagesCount": 2, "lastMessage": "¿Puedes entrevistarte el jueves?", "messageCreationDate": "2026-09-27T09:15:00Z", "senderId": "rec-44" }], "totalMessagesCount": 2 }Derived from the app's interface; endpoint details are illustrative, not a live capture.
reconstructed from the app's recruiter chat inboxfield set mirrors the conversation rows and unread badges
Data categories
- vacancies
- candidate profiles
- CVs and resumes
- job applications
- recruiter views
- job alerts
- recruiter chat
Where teams use this data
Mexico vacancy feed into an ATS
Poll GET /v1/jobs/search (keywords, locationIds, salaryMin/salaryMax, selectedFacets) and hydrate each hit with GET /v1/jobs/{jobId} so an applicant-tracking system can mirror OCCMundial postings with jobTitle, companyPrettyName, salary band and hasKillerQuestions.
Candidate CV completeness for apply-readiness
Read GET /v1/me/profile plus GET /v1/me/resume (skills, jobExperiences, education, visibility) and POST new files to /v1/me/resume/file so a career-coach product can tell a jobseeker why a job application would be blocked.
Application pipeline and recruiter interest
Join GET /v1/me/applications (applicationId, applicationStatusId, applicationDate) with GET /v1/me/profile-views (totalRecruiterViews, totalCompanies) to show which postulaciones are actually being looked at.
Alert-driven vacancy notifications
Sync GET /v1/me/alerts (keywords, locationIds, frequency, isActive) and GET /v1/me/suggested-jobs (affinityScore) so a workforce product can fan the same saved-search criteria out as push or email without re-implementing OCCMundial's matching.
Frequently asked questions
Which OCCMundial endpoints power job search?
The empleos results screen calls GET /v1/jobs/search (keywords, locationIds, salaryMin/salaryMax, facets). Opening a card hydrates GET /v1/jobs/{jobId}; the related carousel is GET /v1/jobs/{jobId}/related.
How does OCC: Job Search authenticate?
Candidates sign in with OpenID Connect (authorization-code + PKCE). The app posts grant_type=authorization_code to POST /oauth/token and sends Authorization: Bearer <accessToken> on later /v1 calls. Refresh uses grant_type=refresh_token.
What candidate and CV fields are returned?
GET /v1/me/profile returns encryptedCandidateId, firstName, lastName, email, phoneNumber and encryptedCurriculumId. GET /v1/me/resume adds skills, jobExperiences, education, certification, language and resume visibility; file uploads go to POST /v1/me/resume/file.
Where do applications and recruiter views live?
Apply is POST /v1/jobs/{jobId}/apply with killerQuestionAnswers. History is GET /v1/me/applications. Recruiter interest is GET /v1/me/profile-views (totalRecruiterViews, totalCompanies).
Topics
- OCCMundial API
- OCC job search API
- occ.com.mx vacancies
- candidate CV API
- recruiter views
- job alerts Mexico
- OCC apply endpoint
- OpenID Connect OCC
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.