OCC: Job Search icon

OCC: Job Search (OCCMundial) data API

OCCMundial.com · Jobs & Careers

OCC: Job Search is the Android app of OCCMundial.com, the Mexican job board behind occ.com.mx, built for people looking for work in Mexico. Candidates search vacancies by keyword, location, category and salary range, narrow results with filters, and open a job-detail screen showing the description, requirements, benefits, salary band, work modality and the employer's sector, rating and verification badge, with a carousel of related openings underneath. Applying runs through screening (killer) questions and skill-level prompts, backed by an in-app CV builder covering skills, work experience, education, certifications and languages, with public or private visibility and an attached PDF or DOC résumé. After applying, a postulaciones tab tracks each application's status, a résumé-visits dashboard shows which companies' recruiters viewed the profile, and a chat inbox carries recruiter messages with unread badges. Saved favorites, keyword-and-location job alerts with a chosen delivery frequency, and affinity-ranked suggested jobs on the dashboard keep new matches coming. OCCMundial is one of Mexico's leading job boards, serving candidates across the country and competing for the same jobseekers with Computrabajo, Bumeran México, Indeed and LinkedIn.

OCCMundial vacancy records anchor the dataset: each posting carries a jobTitle, an employer shown as companyPrettyName with companySector, companyRating and an isCompanyVerified flag, a salaryMin/salaryMax band with its salaryInterval, a locationName, a jobModality or workplaceType, a publicationDate, and a hasKillerQuestions flag marking postings that screen applicants; detail records add description, requirements and jobBenefits, and every search returns facets and a total count for the query. On the candidate side, the structured CV breaks into skills with a levelId, jobExperiences, education, certification and language with a languageLevel, all under a visibility setting. Applications are logged with applicationId, applicationStatusId and applicationDate; recruiter interest arrives as totalRecruiterViews and totalCompanies counters plus chat threads with unreadMessagesCount; saved alerts keep their keywords, locationIds and frequency; and suggested and related vacancies are ranked by an affinityScore.

An applicant-tracking system can mirror OCCMundial's Mexico postings together with their salary bands and screening flags; a career-coach product can read skills, jobExperiences and résumé visibility to tell a jobseeker why an application would be blocked before it is sent; joining application status to recruiter-view totals shows which postulaciones employers are actually opening; and a workforce product can fan the same saved-alert criteria and affinity-ranked suggestions out as push or email without rebuilding OCCMundial's matching. openData Studio turns these vacancy, CV, application and recruiter-interest records into callable open data.

Screenshots

  • OCC: Job Search screenshot 1
  • OCC: Job Search screenshot 2
  • OCC: Job Search screenshot 3
  • OCC: Job Search screenshot 4
  • OCC: Job Search screenshot 5
  • OCC: Job Search screenshot 6
  • OCC: Job Search screenshot 7
  • OCC: Job Search screenshot 8

API surface

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

  • OAuth2 token (candidate login)

    POST /oauth/token osint

    Exchanges 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
    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"
    }
  • Search job offers

    GET /v1/ofertas/search opendata

    Returns 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
    GET /v1/ofertas/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": []
    }
  • Fetch job offer by id

    GET /v1/ofertas/{jobId} opendata

    Hydrates 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
    GET /v1/ofertas/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
      }
    }
  • Related job offers

    GET /v1/ofertas/{jobId}/related opendata

    Returns 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
    GET /v1/ofertas/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]
    }
  • Get signed-in candidate

    GET /v1/me/profile osint

    Loads 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
    • email
    • phoneNumber
    • gender
    • birthDate
    • candidateStatusId
    • curriculumId
    • encryptedCurriculumId
    • resumeVisibility
    • features
    • isVerified
    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
      }
    }
  • Get candidate CV / resume

    GET /v1/me/resume osint

    Returns 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
    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"}]
      }
    }
  • Upload CV file

    POST /v1/me/resume/file osint

    Uploads 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
    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"
    }
  • Apply to a job offer

    POST /v1/ofertas/{jobId}/apply opendata

    Submits 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
    POST /v1/ofertas/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
    }
  • List applied job offers

    GET /v1/me/applications opendata

    Lists 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
    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
    }
  • List favorite job offers

    GET /v1/me/favorites opendata

    Reads 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
    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"]
    }
  • Recruiter profile views

    GET /v1/me/profile-views osint

    Returns 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
    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
    }
  • Job alert list

    GET /v1/me/alerts opendata

    Lists 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
    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
      }]
    }
  • Suggested jobs

    GET /v1/me/suggested-jobs opendata

    Returns 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
    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
      }]
    }
  • Recruiter chat conversations

    GET /v1/me/conversations osint

    Lists 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
    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
    }

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/ofertas/search (keywords, locationIds, salaryMin/salaryMax, selectedFacets) and hydrate each hit with GET /v1/ofertas/{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/ofertas/search (keywords, locationIds, salaryMin/salaryMax, facets). Opening a card hydrates GET /v1/ofertas/{jobId}; the related carousel is GET /v1/ofertas/{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/ofertas/{jobId}/apply with killerQuestionAnswers. History is GET /v1/me/applications. Recruiter interest is GET /v1/me/profile-views (totalRecruiterViews, totalCompanies).

Apps similar to OCC: Job Search

  • Indeed Job Search — Indeed is a job-search engine that indexes vacancies from company career pages and other boards, with filters, alerts and salary ranges used by seekers in Mexico.
  • LinkedIn: Community & Network — LinkedIn is a professional network used in Mexico for corporate and senior vacancies, combining a job board with recruiter outreach and profile-based matching.
  • Computrabajo — Computrabajo is a Latin American job board with a strong Mexico presence for sales, customer-service, administration and logistics vacancies, plus in-app alerts.
  • Bumeran México — Bumeran México is Jobint's job-search app where candidates upload a CV, filter vacancies by area and location, and exchange messages with recruiters.
  • Glassdoor | Jobs & Careers — Glassdoor combines job listings with anonymous employee reviews and salary information so seekers can research Mexican employers before applying.
  • CornerJob — CornerJob is a mobile job app used in Mexico for simplified, fast applications to temporary and operational roles.

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.

  • NDA + SOW on every engagement
  • Delivery in 3–7 days
  • Payment only after acceptance
  • Work scoped to authorized use

Get a quote