# Job Ad Discrimination Checker for Job Posts (US) (`ultimatemc/job-ad-discrimination-checker`) Actor

Bulk-check job ads for discriminatory wording under US federal rules: age ranges, 'young', 'recent graduates', 'females preferred', 'native English', 'US citizens only', photo requests. Returns quote, protected class, severity, EEOC/DOJ source, fix, plus pay range.

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

## Pricing

from $3.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 Ad Discrimination Checker** scans **job ads and job descriptions** in bulk for wording that US federal rules treat as a hiring preference or limitation: **age ranges**, **"young"**, **"recent college graduates"**, **"females preferred"**, **"salesman"**, **"native English speaker"**, **"US citizens only"**, **"send a photo"**, **"no felons"** and more. Each finding has the **exact quote**, the **protected class**, a **severity**, a **why** with the **EEOC / DOJ / statute reference**, and a **neutral rewrite tip**. It also extracts the **pay range** and counts **gender-coded words**. Click **Start** with the prefilled example to check three job ads in a few seconds.

> **Screening aid only. Not legal advice and not a compliance sign-off.** The tool flags wording that public federal statutes, regulations and agency guidance treat as risky. An ad with no flags is not "approved": context, state and local laws (pay transparency, fair chance, extra protected classes) and how candidates are actually screened still matter. Have flagged ads reviewed by HR or a qualified professional.

### What does the Job Ad Discrimination Checker do?

- ✅ **Age (ADEA, 40+):** age ranges and caps ("age 25-35", "max age 40", "between the ages of"), "young professionals", "young and dynamic team", "recent graduates", "digital natives", "college students", "class of 2024", experience caps ("no more than 5 years of experience") and requests for age or date of birth. 29 CFR 1625.4 names "age 25 to 35", "young", "college student", "recent college graduate", "boy" and "girl" as ad terms.
- ✅ **Sex and pregnancy (Title VII):** "female candidates preferred", "hiring a male driver", "must be a woman", gendered job titles ("salesman", "waitress", "foreman", "girl Friday"), marital status and children, pregnancy. Optional low-severity note when the hire is called "he" or "she".
- ✅ **Race, color, national origin:** racial or ethnic preferences, "native English speaker", "English as a first language", "no accent", "American-born". EEOC says English fluency requirements must be needed for the specific job.
- ✅ **Citizenship and immigration status (8 U.S.C. 1324b):** the posting language DOJ IER lists, such as "U.S. citizens only", "Citizenship required", "U.S. citizens or green card holders", "Must have a green card", "H-1Bs only", "OPT preferred", "Must present U.S. birth certificate". Downgraded with a note when the ad mentions a security clearance, government contract or legal requirement.
- ✅ **Religion:** "Christian applicants preferred", "must be Catholic". Downgraded with a note for churches, ministries and other religious organizations.
- ✅ **Disability:** "no disabled applicants", "must not have any medical conditions", "able-bodied", "must be in good health".
- ✅ **Other screens:** photo requests (EEOC: do not ask for photographs), appearance words ("attractive"), blanket criminal-record exclusions ("no felons", EEOC 2012 guidance), "must be currently employed".
- ✅ Does **not** flag normal requirements: "must be at least 18", "21 or older to serve alcohol", "lift 50 lbs", "must be authorized to work in the U.S.", "no visa sponsorship", "fluent written and spoken English", "valid driver's license", "3+ years of experience", "young company", "Asian markets team", "attractive salary", "Women's Health clinic", "under 30 minutes from downtown", "women and minorities are encouraged to apply".
- ✅ **Pay range:** min, max and period ("$18.50 - $21.00 an hour", "$120k-$150k", "$160,000–$190,000") or the vague wording used instead ("competitive salary", "DOE"). Useful because a growing list of US states and cities require pay ranges in postings.
- ✅ **Gender-coded words:** counts of masculine-coded words (e.g. "competitive", "dominant", "rockstar", "ninja") and feminine-coded words (e.g. "supportive", "collaborative") from the Gaucher, Friesen & Kay (2011) word lists. Informational only.
- ✅ Tells you whether the ad has an **EEO statement**.
- ✅ Takes plain texts, job objects, or a whole **Apify dataset** from a LinkedIn Jobs, Indeed or Glassdoor scraper. Title and description fields are found automatically, HTML is stripped, and duplicate text/HTML fields are checked once. Company name and job URL are carried into the output.

**Output per job post:** `riskLevel` (high / medium / low / none), `issueCount`, `protectedClassesFlagged`, `issues` (ruleId, protectedClass, severity, field, quote, context, why, suggestion, note, references), `payRange`, `genderCodedWording`, `hasEeoStatement`, `hiddenLowSeverityCount`, `company`, `ref`, `checkedAt` (UTC timestamp) and `disclaimer`.

### Who is it for?

- **HR, talent acquisition and recruiting agencies** who want a first pass over every job ad before it goes live.
- **Job boards, ATS vendors and staffing platforms** screening employer-submitted postings in bulk via API.
- **Compliance, DEI and employment-law teams** auditing published postings across many locations.
- **Researchers and journalists** studying discriminatory wording in large sets of public job ads.

### How to check job ads for discriminatory wording

1. Click **Start** with the prefilled example to see the output.
2. Paste your own job descriptions into **Job ads to check**, or add **Job posts** with your own IDs (requisition number, URL).
3. Or pick an Apify **dataset** from a job scraper. Leave **Dataset fields** empty to auto-detect title and description.
4. Keep **Minimum severity** at medium, or choose low to include softer notes. Turn on **Only save job posts with findings** to keep just the rows to review.
5. Download as JSON, CSV or Excel and work through rows sorted by `riskLevel`.

### Input example

```json
{
  "texts": [
    "Join our young and dynamic team! Seeking a salesman, age 25-35, native English speaker. US citizens only. Please send a photo with your CV. Salary: competitive.",
    "Warehouse Associate, $18.50 - $21.00 an hour. Must be 18 or older and able to lift 50 lbs. Must be authorized to work in the U.S. Reasonable accommodations available. We are an Equal Opportunity Employer.",
    "Front desk receptionist wanted. Female candidates preferred, recent college graduates ideal. Must be in good health. No felons."
  ]
}
```

Dataset example (output of a job scraper run):

```json
{
  "datasetId": "YOUR_DATASET_ID",
  "textFields": ["title", "descriptionText"],
  "minSeverity": "medium",
  "onlyFlagged": true
}
```

### Output example

Real output from the prefill run on 2026-10-28 (shortened: the first job ad shows one full finding; the others show the main fields):

```json
[
  {
    "itemNo": 1,
    "ref": null,
    "company": null,
    "textPreview": "Join our young and dynamic team! Seeking a salesman, age 25-35, native English speaker. US citizens only. Please send a photo with your CV. Salary: competitive.",
    "fieldsChecked": [
      "text"
    ],
    "riskLevel": "high",
    "issueCount": 6,
    "protectedClassesFlagged": [
      "age",
      "citizenship / immigration status",
      "multiple (race, sex, age, disability)",
      "national origin",
      "sex"
    ],
    "issues": [
      {
        "ruleId": "young-team",
        "protectedClass": "age",
        "severity": "medium",
        "quote": "young and dynamic team",
        "context": "Join our young and dynamic team! Seeking a salesman, age 25-35, native English speaker. US…",
        "why": "Describes the team as young. Often read as an age preference in job ads.",
        "suggestion": "Describe the culture without age: collaborative, fast-moving, informal.",
        "references": [
          {
            "title": "ADEA, 29 U.S.C. 623(e): job notices or ads may not indicate a preference, limitation or discrimination based on age (40+)",
            "url": "https://www.law.cornell.edu/uscode/text/29/623"
          },
          {
            "title": "29 CFR 1625.4: help-wanted notices; terms such as 'age 25 to 35', 'young', 'college student', 'recent college graduate', 'boy', 'girl' violate the Act unless an exception applies",
            "url": "https://www.ecfr.gov/current/title-29/subtitle-B/chapter-XIV/part-1625/section-1625.4"
          }
        ],
        "field": "text"
      },
      {
        "...": "5 more findings (gendered-title: 'salesman' (medium), age-range: 'age 25-35' (high), native-speaker: 'native English speaker' (medium), citizenship-only: 'US citizens only' (medium), photo-request: 'send a photo' (medium))"
      }
    ],
    "hiddenLowSeverityCount": 0,
    "highestSeverityIncludingHidden": "high",
    "hasEeoStatement": false,
    "payRange": {
      "found": false,
      "vagueWording": "Salary: competitive"
    },
    "genderCodedWording": {
      "lean": "neutral",
      "masculineCount": 1,
      "feminineCount": 0
    },
    "minSeverityShown": "medium",
    "checkedAt": "2026-10-28T18:25:06+00:00",
    "disclaimer": "Automated wording screen based on U.S. federal sources (ADEA..."
  },
  {
    "itemNo": 2,
    "textPreview": "Warehouse Associate, $18.50 - $21.00 an hour. Must be 18 or older and able to lift 50 lbs. Must be authorized to work in the U.S. Reasonable accommodations available. We are an Equal Opportunity Emplo",
    "riskLevel": "none",
    "issueCount": 0,
    "issues": [],
    "payRange": {
      "found": true,
      "text": "$18.50 - $21.00 an hour",
      "min": 18.5,
      "max": 21,
      "period": "hour",
      "isRange": true
    },
    "hasEeoStatement": true
  },
  {
    "itemNo": 3,
    "textPreview": "Front desk receptionist wanted. Female candidates preferred, recent college graduates ideal. Must be in good health. No felons.",
    "riskLevel": "high",
    "issueCount": 4,
    "protectedClassesFlagged": [
      "age",
      "disability",
      "fair chance (conviction records)",
      "sex"
    ],
    "issues": [
      {
        "ruleId": "sex-preference",
        "protectedClass": "sex",
        "severity": "high",
        "quote": "Female candidates preferred",
        "suggestion": "Remove it. Describe duties and requirements that apply to everyone."
      },
      {
        "ruleId": "recent-grad",
        "protectedClass": "age",
        "severity": "medium",
        "quote": "recent college graduates",
        "suggestion": "State the actual requirement (degree, skills, entry-level role open to all experience levels)."
      },
      {
        "ruleId": "health-able-bodied",
        "protectedClass": "disability",
        "severity": "medium",
        "quote": "Must be in good health",
        "suggestion": "List the essential physical functions (lifting, standing, climbing) and mention reasonable accommodation."
      },
      {
        "ruleId": "criminal-blanket",
        "protectedClass": "fair chance (conviction records)",
        "severity": "medium",
        "quote": "No felons",
        "suggestion": "Say a background check may be done after an offer, considered case by case, as allowed by local law. Roles legally barred for certain convictions can state that specific law."
      }
    ]
  }
]
```

### How much does it cost to check job ads?

Pay per result: **$0.003 per job post checked**, plus a $0.00005 start fee per run and small Apify platform usage paid by you (the 3-ad prefill run used about $0.0001 of platform usage). 100 job ads cost about $0.30 and 1,000 about $3.00, plus platform usage. Turn on **Only save job posts with findings** to pay only for rows to review, and cap spend with the maximum cost per run setting.

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

- Run and get results in one call: `https://api.apify.com/v2/acts/ultimatemc~job-ad-discrimination-checker/run-sync-get-dataset-items`
- MCP for AI agents: `https://mcp.apify.com?tools=ultimatemc/job-ad-discrimination-checker`
- Schedule it on new postings, add a webhook, or chain it after a LinkedIn Jobs or Indeed scraper and pass that run's dataset ID.

### Rules and sources

Checked against these public texts on 2026-10-28:

- [ADEA, 29 U.S.C. 623(e)](https://www.law.cornell.edu/uscode/text/29/623): job notices and ads may not indicate a preference, limitation or discrimination based on age.
- [29 CFR 1625.4](https://www.ecfr.gov/current/title-29/subtitle-B/chapter-XIV/part-1625/section-1625.4): help-wanted notices; lists "age 25 to 35", "young", "college student", "recent college graduate", "boy", "girl".
- [29 CFR 1625.5](https://www.ecfr.gov/current/title-29/subtitle-B/chapter-XIV/part-1625/section-1625.5): requests for age or date of birth.
- [Title VII, 42 U.S.C. 2000e-3(b)](https://www.law.cornell.edu/uscode/text/42/2000e-3): ads may not indicate a preference based on race, color, religion, sex or national origin, except a bona fide occupational qualification.
- [EEOC: Prohibited Employment Policies/Practices](https://www.eeoc.gov/prohibited-employment-policiespractices): job advertisements, recruitment, photographs and pre-employment inquiries.
- [EEOC Enforcement Guidance on National Origin Discrimination](https://www.eeoc.gov/laws/guidance/eeoc-enforcement-guidance-national-origin-discrimination), Section V (English fluency, accent).
- [8 U.S.C. 1324b](https://www.law.cornell.edu/uscode/text/8/1324b) and [DOJ IER: Best Practices for Recruiting and Hiring Workers](https://www.justice.gov/crt/best-practices-recruiting-and-hiring-workers): citizenship and immigration status in postings.
- [EEOC: Disability Discrimination and Employment Decisions](https://www.eeoc.gov/disability-discrimination-and-employment-decisions).
- [EEOC Enforcement Guidance on Arrest and Conviction Records (2012)](https://www.eeoc.gov/laws/guidance/enforcement-guidance-consideration-arrest-and-conviction-records-employment-decisions).
- Gender-coded word lists: Gaucher, Friesen & Kay (2011), "Evidence that gendered wording in job advertisements exists and sustains gender inequality", Journal of Personality and Social Psychology 101(1):109-128.

### How the checking works

Each text is matched against a fixed set of rules, one per kind of preference, with exclusions for ordinary job requirements. Severity is **high** for explicit preferences or limitations of the kind the statutes and guidance name, **medium** for wording guidance says may deter a protected group or that some state and local laws restrict, and **low** for softer notes. When matches overlap, only the most severe one is kept. Context rules lower the severity (with a note) for casting and modeling roles, religious organizations, and jobs that mention a security clearance or government contract. No AI and no external calls, so the same input always gives the same output.

### FAQ

#### Does "none" mean my job ad is compliant?

No. It means none of the rule patterns matched. State and local laws (pay transparency, fair chance, salary history, extra protected classes), the way candidates are screened, and context are not fully checked.

#### Can I say "must be authorized to work in the U.S." or "no visa sponsorship"?

DOJ IER says employers may generally ask whether applicants are authorized to work in the U.S. and whether they will need sponsorship, so the tool does not flag these. It does flag "U.S. citizens only" and similar wording unless a legal requirement is mentioned.

#### Is "recent graduate" always illegal?

Not always, but EEOC gives "recent college graduates" as an example of ad wording that may discourage people over 40 and violate the law, so it is reported as medium.

#### Does it check pay transparency laws?

It extracts the pay range or the vague wording used, so you can filter ads without a range. It does not decide which state or city law applies to a posting.

#### Is it AI?

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

### Limitations

- English only; US federal rules. Not built for UK, EU, Canadian or Australian rules.
- Word-based: it cannot see who an ad was targeted to on ad platforms, or how applicants are screened.
- Unusual phrasing, slang or misspellings can be missed, and rare legitimate uses (bona fide occupational qualifications, legally required citizenship) can be flagged. Review every flag in context.
- Gender-coded word counts are a research-based signal, not a legal test.

### 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.
- [Job Title to SOC Code Mapper with O\*NET Data](https://apify.com/ultimatemc/job-title-soc-code-mapper): maps job titles to SOC and O\*NET-SOC codes in bulk, with seniority and tech skills found in the posting.
- [Shrinkflation Detector for Grocery Price Data](https://apify.com/ultimatemc/shrinkflation-detector): finds smaller packs at the same or higher price by comparing two runs of a grocery scraper, with unit price before and after.
- [Fair Housing Listing Checker for Real Estate Ads](https://apify.com/ultimatemc/fair-housing-listing-checker): flags rental and sale listing wording that may raise Fair Housing Act issues, with HUD sources and rewrite tips (screening aid only).
- [Amazon Listing Policy Checker for Titles & Bullets](https://apify.com/ultimatemc/amazon-listing-policy-checker): flags pesticide, FDA and disease claims and Amazon title and bullet rule breaks in bulk, with policy links and fixes.
- [Walmart Listing Policy Checker for Titles & Copy](https://apify.com/ultimatemc/walmart-listing-policy-checker): flags promotional phrases, retailer names, URLs, long titles and pesticide or FDA claims in Walmart Marketplace listings, with policy links and fixes.
- [TikTok Shop Listing Policy Checker for Products](https://apify.com/ultimatemc/tiktok-shop-listing-policy-checker): flags off-platform links, dupe wording, weight-loss, disease and FDA claims and title rule breaks in TikTok Shop listings.
- [Supplement & Cosmetic Claims Checker: FDA & FTC](https://apify.com/ultimatemc/supplement-cosmetic-claims-checker): flags disease, drug and 'FDA approved' claims and missing supplement disclaimers in supplement and beauty product copy, with FDA and FTC sources (screening aid only).
- [Rental Listing Scam Checker for Craigslist & FB](https://apify.com/ultimatemc/rental-listing-scam-checker): scores rental listings 0-100 for FTC-listed scam signs like wire or gift card payment, deposit before viewing and rent far below similar listings.
- [GTIN, UPC & EAN Barcode Validator (Check Digit)](https://apify.com/ultimatemc/gtin-barcode-validator): checks UPC, EAN, GTIN-14 and ISBN codes for wrong check digits, lost leading zeros, scientific notation, restricted prefixes and duplicates before a feed upload.
- [Fake Review Checker: Incentivized & Duplicates](https://apify.com/ultimatemc/review-integrity-checker): screens scraped reviews for incentivized or insider wording, copied text, rating bursts and rating/text mismatches named in the FTC 2024 fake-review rule.
- [Facebook Marketplace Listing Policy Checker](https://apify.com/ultimatemc/facebook-marketplace-listing-policy-checker): flags Marketplace listings that may break Meta's Commerce Policies (weapons, vapes, Rx, animals, gift cards, services, counterfeits and more), with policy links.
- [Fake Discount Checker: EU 30-Day Prior Price](https://apify.com/ultimatemc/discount-claim-checker): checks 'was' and strikethrough prices against your own price history for 30-day prior-price, raise-then-discount and wrong-badge issues.
- [SMS Marketing Message Checker: STOP & 10DLC](https://apify.com/ultimatemc/sms-marketing-message-checker): pre-checks SMS marketing texts for segment count, STOP opt-out wording, URL shorteners, SHAFT content and quiet hours.
- [Hidden Fee Checker: Hotel, Rental & Ticket Prices](https://apify.com/ultimatemc/hidden-fee-price-checker): flags headline prices that leave out mandatory resort, service or booking fees under the FTC junk fees rule (16 CFR 464), with sources per finding.
- [EU GPSR Listing Checker for Amazon, eBay & Shops](https://apify.com/ultimatemc/gpsr-listing-checker): checks listings for the EU GPSR Article 19 online-sale details: manufacturer, EU responsible person, product identifier, picture and warnings.
- [Food Allergen Label Checker: US, EU & AU](https://apify.com/ultimatemc/food-allergen-label-checker): compares ingredient lists with the 'Contains' statement for US 9, EU/UK 14 and Australian PEAL allergens and flags gaps and conflicting free-from claims.
- [Toy Choking Hazard Warning Checker (CPSC)](https://apify.com/ultimatemc/toy-choking-warning-checker): flags toy listings missing the CPSC choking-hazard warnings for small parts, balloons, small balls and marbles, with age-grade checks.
- [Textile Fiber Label Checker: Bamboo & Origin](https://apify.com/ultimatemc/textile-fiber-label-checker): flags 'bamboo' claims that should say rayon, fiber percentages that don't add up, mismatched silk or cashmere titles and missing Made in USA/Imported.
- [Prop 65 Warning Checker for Product Listings](https://apify.com/ultimatemc/prop65-warning-checker): flags Prop 65 safe-harbor warnings missing 'WARNING', the P65Warnings.ca.gov link or a chemical name, old short forms, and listed chemicals mentioned with no warning.
- [Unit Price Checker for Grocery & Retail Listings](https://apify.com/ultimatemc/unit-price-checker): parses pack sizes, recomputes the price per kg, litre or item, and flags missing or wrong unit prices in grocery and retail data.
- [Made in USA Claim Checker for Product Listings](https://apify.com/ultimatemc/made-in-usa-claim-checker): flags unqualified 'Made in USA' claims next to imported or foreign-origin details under the FTC rule (16 CFR 323), with sources per finding.
- [Subscription Auto-Renewal Disclosure Checker](https://apify.com/ultimatemc/auto-renewal-disclosure-checker): checks subscription and free-trial offer text for missing renewal, price, billing period and cancellation disclosures under California law and FTC ROSCA.
- [Email CAN-SPAM Checker & Unsubscribe Header Test](https://apify.com/ultimatemc/email-can-spam-checker): pre-checks marketing emails for missing unsubscribe links or postal address, misleading subjects and Google/Yahoo one-click unsubscribe headers.

Found a false positive or a missed phrase? Open an issue on the **Issues** tab with the job ad text, and we'll review the rule.

# Actor input Schema

## `texts` (type: `array`):

Job descriptions or job ad text, one per line. The prefill has three examples; replace them with your own.

## `items` (type: `array`):

One object per job post with your own "id" and any of "title", "description", "text", plus optional "company". Example: \[{"id": "REQ-101", "title": "Sales Rep", "description": "Young team..."}]

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

Check the output of another Actor, for example a LinkedIn Jobs, Indeed or Glassdoor scraper. Title and description fields are detected automatically (HTML is stripped; duplicate HTML/text fields are checked once).

## `textFields` (type: `array`):

Field names to read from dataset items, e.g. "descriptionText". Leave empty to use common title/description fields.

## `minSeverity` (type: `string`):

'medium' (default) shows explicit preferences plus wording guidance says may deter protected groups. 'low' also shows softer notes such as 'he will' pronouns and appearance words.

## `includePay` (type: `boolean`):

Add the pay range found in the ad (min, max, period) or the vague wording used instead (e.g. 'competitive salary', 'DOE').

## `includeGenderCoding` (type: `boolean`):

Add counts of masculine- and feminine-coded words (Gaucher, Friesen & Kay 2011 word lists). Informational only.

## `onlyFlagged` (type: `boolean`):

Skip posts with no findings at the chosen severity (you are only charged for saved rows).

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

Stop after this many job posts.

## Actor input object example

```json
{
  "texts": [
    "Join our young and dynamic team! Seeking a salesman, age 25-35, native English speaker. US citizens only. Please send a photo with your CV. Salary: competitive.",
    "Warehouse Associate, $18.50 - $21.00 an hour. Must be 18 or older and able to lift 50 lbs. Must be authorized to work in the U.S. Reasonable accommodations available. We are an Equal Opportunity Employer.",
    "Front desk receptionist wanted. Female candidates preferred, recent college graduates ideal. Must be in good health. No felons."
  ],
  "minSeverity": "medium",
  "includePay": true,
  "includeGenderCoding": true,
  "onlyFlagged": false,
  "maxItems": 1000
}
```

# 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 = {
    "texts": [
        "Join our young and dynamic team! Seeking a salesman, age 25-35, native English speaker. US citizens only. Please send a photo with your CV. Salary: competitive.",
        "Warehouse Associate, $18.50 - $21.00 an hour. Must be 18 or older and able to lift 50 lbs. Must be authorized to work in the U.S. Reasonable accommodations available. We are an Equal Opportunity Employer.",
        "Front desk receptionist wanted. Female candidates preferred, recent college graduates ideal. Must be in good health. No felons."
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("ultimatemc/job-ad-discrimination-checker").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 = { "texts": [
        "Join our young and dynamic team! Seeking a salesman, age 25-35, native English speaker. US citizens only. Please send a photo with your CV. Salary: competitive.",
        "Warehouse Associate, $18.50 - $21.00 an hour. Must be 18 or older and able to lift 50 lbs. Must be authorized to work in the U.S. Reasonable accommodations available. We are an Equal Opportunity Employer.",
        "Front desk receptionist wanted. Female candidates preferred, recent college graduates ideal. Must be in good health. No felons.",
    ] }

# Run the Actor and wait for it to finish
run = client.actor("ultimatemc/job-ad-discrimination-checker").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 '{
  "texts": [
    "Join our young and dynamic team! Seeking a salesman, age 25-35, native English speaker. US citizens only. Please send a photo with your CV. Salary: competitive.",
    "Warehouse Associate, $18.50 - $21.00 an hour. Must be 18 or older and able to lift 50 lbs. Must be authorized to work in the U.S. Reasonable accommodations available. We are an Equal Opportunity Employer.",
    "Front desk receptionist wanted. Female candidates preferred, recent college graduates ideal. Must be in good health. No felons."
  ]
}' |
apify call ultimatemc/job-ad-discrimination-checker --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,ultimatemc/job-ad-discrimination-checker"
        }
    }
}
```

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/jpsYyvQOn42aFCmyl/builds/NIriCeJxCieezQ13Y/openapi.json
