# Job Title to SOC Code Mapper with O\*NET Data (`ultimatemc/job-title-soc-code-mapper`) Actor

Map job titles from any job board or ATS to SOC 2018 and O\*NET-SOC occupation codes in bulk. Returns occupation, major group, job zone, seniority, match confidence and alternatives, plus software and technology skills found in the posting (hot technologies flagged). No AI.

- **URL**: https://apify.com/ultimatemc/job-title-soc-code-mapper.md
- **Developed by:** [Ultimate Foresight Inc](https://apify.com/ultimatemc) (community)
- **Categories:** Jobs, Business, Developer tools
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.00 / 1,000 results

This Actor is paid per event and usage. You are charged both the fixed price for specific events and for Apify platform usage.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

**Job Title to SOC Code Mapper** turns messy job titles like "RN - Med/Surg Nights $5K Sign-On Bonus" or "Sr. Backend Engineer (Remote)" into a **standard occupation code**: the **SOC code** and **O\*NET-SOC code**, the occupation name, **major group**, **job zone** and **seniority**. Give it job descriptions too, and it also tags the **software and technology skills** named in each posting (Python, AWS, Salesforce, Epic and 8,000+ more) **with O\*NET data**, marking "hot" and in-demand technologies. Each row has a **confidence score**, the matched title and up to 3 alternatives. Click **Start** with the prefilled example to map four job titles in a few seconds.

> **Best-match classification, not an official SOC determination.** Results are for analytics, research and data cleaning. They are not legal, wage or immigration advice. Check the code yourself before using it in a visa, prevailing-wage or government filing.

### What does the Job Title to SOC Code Mapper do?

- ✅ Maps each job title to the **2018 SOC code** (e.g. `15-1252`) and the more detailed **O\*NET-SOC code** (e.g. `15-1252.00`), with the occupation name and a link to its O\*NET OnLine page.
- ✅ Cleans titles first: removes pay, bonus, shift, location and "remote/hybrid" noise, expands abbreviations (RN, LPN, CNA, CDL, Sr., Mgr., Dev, QA and more) and splits titles like "Medical Biller / Coder" or "Engineer - Backend".
- ✅ Matches against **67,000+ real job titles** from O\*NET's alternate and reported titles: exact match first, then exact match ignoring the level word, then a fixed table of very common titles, then fuzzy word matching. The **matchMethod** field tells you which one was used.
- ✅ Adds the **major group** (e.g. "Healthcare Practitioners and Technical"), the **job zone** (1-5, how much preparation the job needs) and **seniority** (intern, junior/entry, mid, senior, lead/principal, manager, director, vice president, C-level).
- ✅ Uses the **job description** to break close ties between occupations, when you give one.
- ✅ Extracts **technology skills** from descriptions with O\*NET's technology list. Short words that are also ordinary English (Python, Excel, Slack, Outlook, Epic, React) only count when the same sentence also names another tool (for some, a phrase like "experience with" is enough). In our tests on 900 Wikipedia intros and 450 other non-job texts, only 2 texts got a skill, both correct (Perl and Google Ads), and 8 non-tech job postings got none.
- ✅ Takes a plain list of titles, job objects, or a whole **Apify dataset** from a LinkedIn, Indeed or other job scraper. Title, description and job ID fields are found automatically.

### Who is it for?

- **Job boards and recruiting tools** that need a clean occupation filter or taxonomy on scraped listings.
- **Labor-market and HR analysts** grouping postings by occupation and seniority, or counting demand for skills.
- **Data teams** enriching job datasets before joining them with wage or employment statistics that use SOC codes.
- **Researchers and students** coding job titles into a standard classification at scale.

### How to map job titles to SOC codes

1. Click **Start** with the prefilled example to see the output.
2. Paste your own titles into **Job titles**, one per line, or add **Jobs** with your own ID, title and description.
3. Or pick the **dataset** of a job scraper run. Leave the field names empty to auto-detect the title and description.
4. Keep **Extract technology skills** on if you pass descriptions.
5. Download as JSON, CSV or Excel. Sort by `confidence` and check the low ones against `alternatives`.

### Input example

```json
{
  "titles": [
    "Senior Software Engineer - Backend (Remote, US)",
    "RN - Med/Surg Nights $5K Sign-On Bonus",
    "CDL-A Truck Driver (Home Weekly)",
    "Line Cook"
  ],
  "extractTechnologies": true
}
```

### Output example

Real output from the prefill run on 2026-10-25 (first row in full, the rest shortened):

```json
[
  {
    "itemNo": 1,
    "ref": null,
    "inputTitle": "Senior Software Engineer - Backend (Remote, US)",
    "titleCleaned": "Senior Software Engineer - Backend",
    "matchMethod": "exact-ignoring-level-segment",
    "onetSocCode": "15-1252.00",
    "socCode": "15-1252",
    "occupationTitle": "Software Developers",
    "matchedTitle": "Software Engineer",
    "confidence": 0.88,
    "majorGroup": "15-0000",
    "majorGroupName": "Computer and Mathematical",
    "jobZone": 4,
    "jobZoneMeaning": "Considerable preparation needed",
    "alternatives": [],
    "onetUrl": "https://www.onetonline.org/link/summary/15-1252.00",
    "seniority": "senior",
    "technologies": [],
    "technologyCount": 0,
    "hotTechnologies": [],
    "usedDescription": false,
    "dataVersion": "O*NET 31.0 Database",
    "checkedAt": "2026-10-25T18:15:56+00:00",
    "disclaimer": "Automated best-match classification from public O*NET data, for analytics and research. It is not an official SOC determination and not legal or immigration advice; verify codes before using them in wage, visa or government filings.",
    "attribution": "Includes information from the O*NET 31.0 Database by the U.S. Department of Labor, Employment and Training Administration (USDOL/ETA). Used under the CC BY 4.0 license (https://creativecommons.org/licenses/by/4.0/). O*NET® is a trademark of USDOL/ETA. Ultimate Foresight has modified all or some of this information (title normalization, matching and skill aliases). USDOL/ETA has not approved, endorsed, or tested these modifications."
  },
  {
    "itemNo": 2,
    "inputTitle": "RN - Med/Surg Nights $5K Sign-On Bonus",
    "matchMethod": "exact-segment",
    "onetSocCode": "29-1141.00",
    "socCode": "29-1141",
    "occupationTitle": "Registered Nurses",
    "confidence": 0.88,
    "majorGroupName": "Healthcare Practitioners and Technical",
    "jobZone": 4,
    "seniority": "unspecified"
  },
  {
    "itemNo": 3,
    "inputTitle": "CDL-A Truck Driver (Home Weekly)",
    "matchMethod": "exact",
    "onetSocCode": "53-3032.00",
    "socCode": "53-3032",
    "occupationTitle": "Heavy and Tractor-Trailer Truck Drivers",
    "confidence": 0.97,
    "majorGroupName": "Transportation and Material Moving",
    "jobZone": 2,
    "seniority": "unspecified"
  },
  {
    "itemNo": 4,
    "inputTitle": "Line Cook",
    "matchMethod": "common-title",
    "onetSocCode": "35-2014.00",
    "socCode": "35-2014",
    "occupationTitle": "Cooks, Restaurant",
    "confidence": 0.9,
    "majorGroupName": "Food Preparation and Serving Related",
    "jobZone": 2,
    "seniority": "unspecified"
  }
]
```

With a description, the same run also returns skills. A real test run with the posting "Build pipelines with Python, SQL and Snowflake. Experience with Airflow, dbt and AWS is a plus." returned `["Python", "SQL", "Snowflake", "Airflow", "AWS"]` for "Data Engineer II (Hybrid)".

### How much does it cost to map job titles?

Pay per result: **$0.002 per job title**, plus a $0.00005 start fee per run and small Apify platform usage paid by you (the 4-title prefill run used about $0.0003 of platform usage). 1,000 titles cost about $2.00 and 10,000 about $20.00, plus platform usage. Use **Max items** to cap a run.

### Use it through the API, integrations or AI agents

- Run and get results in one call: `https://api.apify.com/v2/acts/ultimatemc~job-title-soc-code-mapper/run-sync-get-dataset-items`
- MCP for AI agents: `https://mcp.apify.com?tools=ultimatemc/job-title-soc-code-mapper`
- Chain it after a job scraper: pass that run's dataset ID, or call it from a webhook when the scraper finishes.

### Data source and attribution

This Actor includes information from the [O\*NET 31.0 Database](https://www.onetcenter.org/database.html) by the U.S. Department of Labor, Employment and Training Administration (USDOL/ETA). Used under the [CC BY 4.0 license](https://creativecommons.org/licenses/by/4.0/). O*NET® is a trademark of USDOL/ETA. Ultimate Foresight has modified all or some of this information (title normalization, matching and skill aliases). USDOL/ETA has not approved, endorsed, or tested these modifications. The same notice is in every output row. Ultimate Foresight is not affiliated with USDOL/ETA or the O*NET program.

### How the matching works

Everything runs on a fixed copy of the O\*NET data bundled with the Actor. The title is cleaned, then matched by exact title, exact title without the level word, a short table of very common titles, and finally by word overlap weighted so rare words count more and the last noun (e.g. "nurse", "driver") counts extra. Ties go to broader, more common occupations, or to the one whose description best fits the job description you passed. No AI and no external calls, so the same input always gives the same output.

### FAQ

#### Is this the official SOC code for my job?

No. It's an automated best match. Official classification depends on the actual duties, and agencies decide codes for their own filings. Use `confidence` and `alternatives` to review.

#### What's the difference between socCode and onetSocCode?

`socCode` is the 2018 Standard Occupational Classification code used by BLS and other agencies. `onetSocCode` adds O\*NET's two-digit detail (e.g. `29-1141.01` Acute Care Nurses inside `29-1141` Registered Nurses).

#### What happens with titles it can't map?

They're kept with `matchMethod` "none", an empty code and confidence 0, so nothing is silently dropped. Joke titles like "Ninja Rockstar Wizard" usually end up here.

#### Does it work for non-English titles?

No. It's built for English titles from US-style job postings.

#### Is it AI?

No. Deterministic rules and public data, so results are repeatable and auditable.

### Limitations

- Titles alone can be vague ("Associate", "Specialist", "Analyst"). Pass a description for better results and check low-confidence rows.
- English only, and the data is US-focused.
- Technology skills come from O\*NET's list; very new or niche tools may be missing.
- O\*NET data version 31.0. Occupation codes follow the 2018 SOC.

### Other tools by Ultimate Foresight

- [Ad Copy Policy Checker for Meta, Google & TikTok](https://apify.com/ultimatemc/ad-copy-policy-checker): checks ad text against Facebook, Instagram, Google Ads and TikTok ad policies before you submit.
- [H-1B Visa Sponsor Checker & Score for Job Listings](https://apify.com/ultimatemc/h1b-visa-sponsor-score): adds Department of Labor H-1B sponsorship history and a 0-100 score to company names or job listings.
- [Chain vs Independent Labeler for Google Maps Leads](https://apify.com/ultimatemc/chain-vs-independent-labeler): labels local businesses as chain, franchise or independent.
- [YouTube Monetization Checker for Scripts & Titles](https://apify.com/ultimatemc/youtube-script-monetization-checker): pre-checks titles, descriptions and scripts for wording that leads to limited or no ads.
- [Etsy & eBay Listing Policy & Banned Item Checker](https://apify.com/ultimatemc/etsy-ebay-listing-policy-checker): pre-checks marketplace listings for prohibited items, counterfeit wording and off-platform contact.
- [Job Scam Detector & Trust Score for Job Postings](https://apify.com/ultimatemc/job-posting-trust-score): scores job postings 0-100 for scam and ghost-job signals.
- [SAM.gov Amendment & Opportunity Change Tracker](https://apify.com/ultimatemc/sam-gov-opportunity-change-detector): shows what changed between versions of a SAM.gov notice: deadlines, set-asides, NAICS and attachments.
- [Product Recall Checker for Brands, UPCs & Products](https://apify.com/ultimatemc/product-recall-matcher): matches your brands, products, UPCs or model numbers against CPSC, FDA and NHTSA recalls.
- [App Store & Google Play Listing Policy Checker](https://apify.com/ultimatemc/app-store-listing-policy-checker): pre-checks app names, subtitles and descriptions against Apple and Google Play metadata rules.
- [Company Name Normalizer & Deduplicator for CRM](https://apify.com/ultimatemc/company-name-canonicalizer): cleans company names (Inc, LLC, d/b/a, aliases) and groups duplicates in CRM, lead or vendor lists.
- [FCC Covered List & Section 889 Bulk Screener](https://apify.com/ultimatemc/fcc-covered-list-screener): screens FCC IDs and brand names against the public FCC Covered List, with sources and timestamps (screening aid only).
- [Green Claims Checker: EU Greenwashing Ban & FTC](https://apify.com/ultimatemc/green-claims-checker): flags risky eco-friendly, carbon neutral and recyclable wording under EU, FTC and UK CMA rules.
- [Influencer #ad Disclosure Checker: FTC & ASA](https://apify.com/ultimatemc/influencer-ad-disclosure-checker): flags influencer posts with missing or unclear #ad labels under FTC, ASA/CAP and CMA rules.

Wrong code or missed skill? Open an issue on the **Issues** tab with the title (and description), and we'll review the match.

# Actor input Schema

## `titles` (type: `array`):

Job titles to map, one per line, exactly as they appear in postings (noise like '(Remote)', 'Sr.', '$5K sign-on bonus' is handled). The prefill has four examples; replace them with your own.

## `jobs` (type: `array`):

One object per posting with "title", optional "description" (text or HTML) and your own "id". The description improves tie-breaks and is scanned for software and technology skills. Example: \[{"id": "job-1", "title": "Data Engineer", "description": "Experience with Python, SQL and Snowflake."}]

## `datasetId` (type: `string`):

Map the output of a job scraper (LinkedIn, Indeed, Glassdoor, Greenhouse, Lever, Workday...). Title fields (title, jobTitle, positionName...) and description fields (description, descriptionText, descriptionHtml...) are detected automatically.

## `titleField` (type: `string`):

Field name holding the job title in your dataset, if it isn't detected automatically.

## `descriptionField` (type: `string`):

Field name holding the job description, if it isn't detected automatically.

## `extractTechnologies` (type: `boolean`):

Scan the title and description for software and technologies from the O\*NET Technology Skills list (e.g. Python, Salesforce, AutoCAD, Epic). Ambiguous names such as Ruby, Swift or Chef are only counted next to other technologies.

## `maxItems` (type: `integer`):

Maximum number of postings to map in one run. Each mapped posting is one result.

## `minConfidencePercent` (type: `integer`):

Rows whose best match has a confidence below this percentage (e.g. 60) get a note. Matches are always returned, so nothing is silently dropped.

## Actor input object example

```json
{
  "titles": [
    "Senior Software Engineer - Backend (Remote, US)",
    "RN - Med/Surg Nights $5K Sign-On Bonus",
    "CDL-A Truck Driver (Home Weekly)",
    "Line Cook"
  ],
  "extractTechnologies": true,
  "maxItems": 1000,
  "minConfidencePercent": 0
}
```

# Actor output Schema

## `results` (type: `string`):

No description

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "titles": [
        "Senior Software Engineer - Backend (Remote, US)",
        "RN - Med/Surg Nights $5K Sign-On Bonus",
        "CDL-A Truck Driver (Home Weekly)",
        "Line Cook"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("ultimatemc/job-title-soc-code-mapper").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = { "titles": [
        "Senior Software Engineer - Backend (Remote, US)",
        "RN - Med/Surg Nights $5K Sign-On Bonus",
        "CDL-A Truck Driver (Home Weekly)",
        "Line Cook",
    ] }

# Run the Actor and wait for it to finish
run = client.actor("ultimatemc/job-title-soc-code-mapper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "titles": [
    "Senior Software Engineer - Backend (Remote, US)",
    "RN - Med/Surg Nights $5K Sign-On Bonus",
    "CDL-A Truck Driver (Home Weekly)",
    "Line Cook"
  ]
}' |
apify call ultimatemc/job-title-soc-code-mapper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,ultimatemc/job-title-soc-code-mapper"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/mng3p0oTk5oWd23f2/builds/Isaw7KM0GIlaGSuvt/openapi.json
