Contact Classifier Department Seniority Role Verification avatar

Contact Classifier Department Seniority Role Verification

Pricing

from $2.55 / 1,000 contact classifieds

Go to Apify Store
Contact Classifier Department Seniority Role Verification

Contact Classifier Department Seniority Role Verification

Contact title in, department and seniority out, plus a check on whether the person still holds the role at that company. Runs a deterministic title ladder with no API key needed. Bring your own LLM key only for the small share of titles the rules cannot place.

Pricing

from $2.55 / 1,000 contact classifieds

Rating

0.0

(0)

Developer

Mamba Labs

Mamba Labs

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

21 minutes ago

Last modified

Share

🏷️ What can Contact Classifier do?

Give it a job title and it returns the department and the seniority level. Give it a name and a company domain too, and it also checks whether that person is still listed on their employer's own website.

It replaces two AI columns in a contact-enrichment workflow with one deterministic call, and it needs no API key to do the classification.

📦 What you get⚙️ Features and integrations
🏷️ 12 departments and 12 seniority levels
🔢 seniority_rank 1 to 12, filter with a comparison
🧾 classification_rule, the named rule that fired
🧮 21 flat fields, snake_case, one row per contact
🧠 Deterministic first, no key and no network
🔌 Optional LLM fallback on your own key
🔍 Position verification against the employer's site
⬇️ Export to JSON, CSV, Excel, HTML or XML

Bought by teams who are paying an LLM to classify job titles and would rather pay a rule table, and by anyone who needs a decision-maker filter that is auditable.

🚫 This actor does not discover people. The name and title come from you. It classifies a title and, optionally, checks a name against a page the employer published. If you need to find people in the first place, use People Finder.

💡 Why use Contact Classifier?

If you wantRead these fields
To route by functiondepartment
To filter by rankseniority, seniority_rank
A quick decision-maker gateis_decision_maker
To audit the classificationclassification_method, classification_rule
Whether the person is still thereposition_status, position_evidence_url
To judge that verdict yourselfpeers_found_on_page, pages_reached

🎯 The rules place about 9 titles in 10 with no AI at all

Measured on 48 real job titles pulled from live company pages and job boards: 92 percent got a department and about 96 percent got a seniority level from deterministic rules alone. No key, no network, milliseconds.

Two design decisions make that work:

A C-suite title carries a rank word, not a function word. "Chief Operating Officer" contains nothing the ordinary keyword table looks for, so C-suite titles get their own map that runs first.

Individual contributor is a classification, not a failure. Most titles with no seniority keyword belong to people who manage nobody. When a department resolves and no seniority keyword fires, the answer is individual_contributor, not null.

🔌 Bring your own model key for the rest

The titles the rules cannot place are genuinely unusual: domain-specific roles like "Field Application Scientist", non-corporate roles, and titles that are not in English.

Turn on the LLM fallback and point it at your own key, or leave those titles null. They come back as unclassified_no_llm, never as a guess.

  • The key is a secret environment variable on your copy of this actor, named LLM_API_KEY. It is not an input field.
  • You pay your own provider directly. We never see the key or the traffic.
  • Only the job title is ever sent to the model. The person's name is not.
  • A missing key is not a failure. The actor classifies deterministically and reports llm_status: "no_key".
  • Answers are constrained to the two published lists. A reply outside them is discarded rather than passed through as a department.
  • Answers are cached against the title for 90 days, so an unusual title costs one model call per 90 days and returns the same answer every time.

📋 What data can Contact Classifier extract?

21 fields per contact.

FieldWhat it holds
departmentsales, marketing, engineering, product, finance, legal, people, customer, operations, it, executive, general, or null
seniorityfounder, c_level, svp, vp, head, director, senior_manager, manager, lead, senior, individual_contributor, junior, or null
seniority_rank1 for founder down to 12 for junior
is_decision_makertrue for ranks 1 to 6
classification_methoddeterministic, deterministic_ic_default, llm, unclassified_no_llm or unclassified
classification_ruleThe named rule that fired
llm_used, llm_status, llm_providerWhether the fallback ran, and what happened
position_statusverified_current, not_found, unverifiable or not_attempted
position_evidence_url, position_evidence_methodThe page the name was found on
peers_found_on_pageHow many other people were visible on that page
pages_attempted, pages_reached, fetch_status, fetch_errorVerification coverage
job_title, full_name, company_domain, run_dateEchoed inputs and bookkeeping

⚠️ There are three answers to "we did not find them", not one. not_found means the site published a people page listing at least three other people and this person was not on it. unverifiable means no page could be read, or the page published nobody, so we could not check. A blocked or empty site never reads as a departure. That is what the three-peer threshold is for, and peers_found_on_page ships on every row so you can audit the call yourself.

🛠️ How to classify a contact's department and seniority

  1. Open the Input tab and put a title in job_title. It is the only required field.
  2. Click Start. That is the whole deterministic path.
  3. Filter on is_decision_maker, or on seniority_rank if you want your own cutoff.
  4. To also verify the person, add full_name and company_domain and set verify_position.

🧪 Using it in Clay

Add an Apify enrichment column and map your title column to job_title. Every field is a top-level key.

This is the column that replaces two AI columns. Because the deterministic path needs no key and no network, it is fast enough to run across a whole table rather than on a shortlist.

🔍 Turning on position verification

Set verify_position and supply a full name and a company domain. The actor reads up to eight team and leadership pages on that domain and looks for the person. It adds about 3 seconds and 9 requests.

It only works for people a company publishes, which means executives and leadership, almost never individual contributors. Only about 6 companies in 10 publish a readable people page at all.

Search alone is not enough to verify anyone. In the build sample, a domain-scoped search returned zero results naming two executives who were plainly listed on their own company's leadership page. The verdict always comes from the page, never from a search.

💵 How much does it cost to classify a contact?

One event per contact classified, including unclassified ones.

PlanPer contactPer 1,000 contacts
Free$0.003$3.00
Bronze$0.00285$2.85
Silver$0.0027$2.70
Gold$0.00255$2.55

There is also an Actor start event at $0.00005, charged once per run per GB of memory. This actor runs at 256 MB, so that is one start event per run.

💳 Your model spend is not part of this price and never passes through us. That is the point of bringing your own key: there is no variable model cost sitting inside a fixed per-event price. Every contact is billed including unclassified ones, because the rules ran either way, and position verification does not add a charge.

⌨️ Input

Everything is on the Input tab.

FieldTypeDefaultWhat it does
job_titlestringrequiredThe only required field.
full_namestringnoneOnly used for verification.
company_domainstringnoneOnly used for verification.
verify_positionbooleanfalseAdds about 3 seconds and 9 requests.
use_llm_fallbackbooleanfalseNeeds LLM_API_KEY set as a secret env var.
llm_providerstringopenaiopenai, anthropic or google.
llm_modelstringgpt-4o-miniPassed straight through.
skipCachestring"false""true" classifies from scratch.

📤 Output

One flat row per contact, exportable as JSON, CSV, Excel, HTML or XML.

{
"job_title": "Chief Operating Officer",
"full_name": "Jane Doe",
"company_domain": "example.com",
"department": "executive",
"seniority": "c_level",
"seniority_rank": 2,
"is_decision_maker": true,
"classification_method": "deterministic",
"classification_rule": "c_suite_map:chief_operating_officer",
"llm_used": false,
"llm_status": "not_needed",
"position_status": "verified_current",
"position_evidence_url": "https://example.com/about/leadership",
"peers_found_on_page": 7,
"pages_attempted": 8,
"pages_reached": 3,
"fetch_status": "ok",
"fetch_error": null,
"run_date": "2026-08-10T10:19:37.363Z"
}

💡 Tips

  • Filter on seniority_rank rather than is_decision_maker when you disagree with where the cutoff sits. That is why the integer ships.
  • Run the deterministic path across your whole table first. Only the leftovers are worth an LLM call.
  • Read classification_rule when a title surprises you. It names the rule that fired, so you can rebuild the reading instead of trusting it.
  • Treat unverifiable as "unknown", never as "gone". peers_found_on_page tells you whether the page was worth anything.

⚠️ Known limits

Seniority is a ladder, not a judgment. individual_contributor means the title carries no management keyword. Some of the most senior people in a company have no management keyword in their title.

is_decision_maker cuts at director. That is one constant and it is arbitrary. If you disagree with where it sits, filter on seniority_rank instead.

Titles are matched in English. A non-English title will usually fall through to the LLM path or come back null.

Null is never a guess. An unplaceable title returns null. general is a real answer for titles like Analyst and Consultant, not a dumping ground.

Verification only works for people a company publishes, which is executives and leadership, almost never individual contributors, and only about 6 companies in 10 publish a readable people page at all.

Every contact is billed, including unclassified ones. The rules ran either way.

No proxy. Verification fetches company pages directly. A site that blocks the actor is reported as unverifiable, not routed around. robots.txt is read and honored before any page is requested.

❓ FAQ

Do I need an API key?

No. Classification is deterministic and needs no key, no network and no configuration. The key is only for the optional fallback on unusual titles.

What happens if I turn on the LLM fallback but the key is missing?

Nothing breaks. The actor classifies deterministically and reports llm_status: "no_key".

Is the person's name sent to the model?

No, never. Only the job title is sent, and only when the fallback runs.

Does not_found mean the person left the company?

No. It means the employer published a people page listing at least three other people and this person was not on it. If no page could be read, you get unverifiable instead, which means the check did not happen.

Why did an obviously senior person classify as individual_contributor?

Because their title carries no management keyword. That is the honest reading of the string, and classification_rule will tell you which rule produced it.

🧩 Want other GTM data?

Mamba Labs builds custom actors for B2B go-to-market teams. The public versions of that work live here on the Store, so our users get the same tooling we build under contract.

🧑‍💼 GTM Hiring Signal Scraper🧱 Tech Stack Detector
📡 B2B Buying Signals Aggregator🔑 Job Board Keyword Scanner
🔗 Domain to LinkedIn URL Resolver🎯 ICP Fit Scorer
📋 Job Posting Monitor📬 Domain Deliverability Checker
🏢 Company Firmographic Enricher🌐 Company Social Presence Mapper
🪪 Company Identity Resolver💰 Funding and Press Signal Scanner
🔄 Company Change-Event Feed👤 People Finder and Email Verifier
🚀 Prospect Engine🤖 AI Tooling Detector
📮 Outbound Stack Detector📝 Publishing Frequency Tracker
✉️ Work Email Waterfall FinderSequencer Lead Push
🏅 Workplace Program Detector👥 Team Page People Extractor
🧭 Company Discovery List Builder

Every actor in the suite takes a domain or a company and returns one flat row, so they stack in the same Clay table without reshaping anything.

🛠️ Need something custom built for you or your team? Tell us what you are trying to find and we will build it. Talk to Mamba Labs.

🆘 Support

Found a title the rules place wrongly? Open an issue on the Issues tab with the title and the classification_rule from the row, and we will look at it.

ℹ️ Privacy, sourcing and legal. The classification half touches no personal data at all if you send only a title. Verification does process personal data, because a name plus an employer plus a role is personal data. The name and title come from you; this actor does not discover people. It returns no email, no phone, no photograph and no biography, nothing beyond the two labels read off the title and a status. Every verified row carries position_evidence_url, so any statement about a person traces to a page their employer published, read directly with robots.txt honored. The verification cache holds the name and domain for 7 days only, and the person's name is never sent to any language model. You are the data controller for anything you send here.

Built by Mamba Labs.