A Staff Accountant, accounts payable, hybrid in Dallas. The req went live on LinkedIn and Indeed on a Monday and closed Thursday with 312 applications. The recruiter who owns it has seven other open reqs and, being generous, one afternoon for this one. In practice she reads the first 50 carefully, skims the next 80 and phones whoever "looks good." Applicants 150 through 312 were never really read, and the ATS knockout questions cut a few more for reasons nobody checked.
This post shows how to build an AI screening agent that reads all 312 against criteria you wrote, explains every decision with a quote from the resume, hands you a shortlist to review and sends a decent reply to the people who did not move forward. It is built to survive two questions: "why was I rejected?" and "does your tool screen people out by age or disability?" For the bigger picture of AI across HR, see the AI for HR guide.
The principle that separates good AI screening from risky AI screening
Most AI for recruiters tools, and most people using ChatGPT for recruiters, ask the model to "score this candidate's fit from 0 to 100." I would not. A score without reasons cannot be audited, changes when you run it again and rewards whoever writes a polished resume, not whoever did the work.
The design I trust has two separate steps:
- The AI extracts. For each criterion it answers "yes," "no" or "not stated" and pastes the line from the resume that proves it. No opinions.
- A rule scores. A spreadsheet formula you wrote before opening the req adds up the points. Same rule for all 312.
If a candidate or a lawyer asks, you show the rule and the quote. If one group's pass rate looks off, you know which criterion to investigate.
The full workflow, step by step
1. Write the criteria before the req opens
For the example role, the hiring manager and I landed on this:
| Criterion | Type | Points |
|---|---|---|
| At least 3 years in accounts payable, treasury or corporate accounting | Required | - |
| Hands-on ERP experience (NetSuite, SAP, Oracle, Sage Intacct or similar) | Required | - |
| Owns bank or vendor reconciliations | Scores | 3 |
| Cash flow forecasting or payment runs | Scores | 3 |
| Volume stated (e.g., "600 invoices a month," "200 vendors") | Scores | 2 |
| Excel with evidence (pivot tables, XLOOKUP, Power Query) | Scores | 2 |
| Process improvement with a result | Scores | 2 |
Notice what is missing: a specific degree, years-since-graduation, "digital native," a zip code, "CPA preferred" for a role that does not need it. If a criterion does not change performance in the job, it goes. Long lists of "nice to haves" are where disparate impact hides.
2. Collect only what you need
If you use Greenhouse, Lever, Workable or Ashby, pull resumes and the candidate list through the ATS API or a bulk export. If applications come by email or form, use a simple form with a PDF upload and only name, email and phone. No date of birth, no photo, no "year graduated."
3. Redact before the AI reads
The first step in the workflow (an n8n node with a short instruction, or a small script) converts the PDF to text and swaps in placeholders. The name becomes "Candidate 147." Out go photos, addresses, graduation years, LinkedIn and social links, and school names (keep "Bachelor's in Accounting"). The email stays in a separate sheet, linked by the number. This does not remove every proxy for age or background, but it removes the obvious ones.
4. Extract evidence per criterion
Each redacted resume goes to the model with this prompt. The output is JSON, so it lands straight in a sheet.
You are a recruiting analyst. Read the redacted resume below and, for each criterion, answer "yes", "no" or "not_stated", always with the exact quote from the resume that supports the answer.
Rules:
- Use only what is written in the resume. Do not infer from job titles alone.
- If the evidence is ambiguous, answer "not_stated" and explain in "note".
- Do not evaluate personality, writing style, gaps in employment, age or anything not on the list.
Criteria:
C1 (required): at least 3 years in accounts payable, treasury or corporate accounting
C2 (required): hands-on ERP experience
C3: owns bank or vendor reconciliations
C4: cash flow forecasting or payment runs
C5: volume stated with a number
C6: Excel with evidence of advanced features
C7: process improvement with a measurable result
Return only JSON: {"id": "...", "C1": {"answer": "", "quote": "", "note": ""}, ...}
Resume: [REDACTED TEXT]
Real output for one resume from the test batch:
{"id": "Candidate 147", "C1": {"answer": "yes", "quote": "Accounts Payable Specialist, 03/2021 to present; AP Clerk, 2019 to 2021", "note": "About 5 years combined"}, "C2": {"answer": "yes", "quote": "Processed invoices and vendor payments in NetSuite", "note": ""}, "C3": {"answer": "yes", "quote": "Reconciled 14 vendor statements monthly and resolved discrepancies", "note": ""}, "C4": {"answer": "not_stated", "quote": "", "note": "Mentions 'weekly check runs' but not forecasting; ask in interview"}, "C5": {"answer": "yes", "quote": "about 900 invoices per month", "note": ""}, "C6": {"answer": "no", "quote": "", "note": "Lists 'Microsoft Office' only"}, "C7": {"answer": "yes", "quote": "Cut duplicate payments by moving vendor setup to an approval workflow", "note": "No number given"}}
Look at C4 and C7. The model did not stretch "check runs" into forecasting, and it flagged the missing number instead of making one up. That behavior comes from the "not_stated" option and the rule against inferring from titles.
5. Score with a fixed rule
In the sheet: if C1 or C2 is "no," the status is "does not meet requirements." Otherwise, add the points for each "yes." "Not_stated" scores zero but goes into the interview questions. Candidates at 8 points or more go to your shortlist; 5 to 7 go to a "second look" tab.
6. A person reviews the shortlist and a sample of rejections
This is the step that makes the whole thing defensible. You read every shortlisted resume, plus a random 10% of the "does not meet requirements" group. If you find a good candidate the agent dropped, fix the criterion or the prompt and run the batch again. The AI never sends a rejection on its own decision; a person approves the list.
7. Check adverse impact
If you collect voluntary EEO self-identification in the ATS (kept separate from the screening, as it should be), compare pass rates by group at the end of each req. The four-fifths rule from the federal Uniform Guidelines is the usual first check: a group whose selection rate is below 80% of the top group's rate deserves a closer look at which criterion is doing it. Small numbers make this noisy, so look at several reqs together.
8. Reply to everyone
The last node drafts a short rejection for each person who did not move forward and queues it in the ATS for your approval. Something like: "Thanks for applying for the Staff Accountant role. We moved forward with candidates whose experience with cash forecasting and ERP payment runs was closer to what the team needs right now." Specific enough to be respectful, general enough not to expose the scoring.
What it costs per month
| Item | Option | Monthly cost (check the site) |
|---|---|---|
| Automation | n8n Cloud starter or self-hosted; Make Core | About US$ 10 to US$ 25 |
| AI model via API | A small model from OpenAI, Anthropic or Google | Under US$ 1 for 300 resumes; about US$ 5 to US$ 15 for 3,000 |
| Storage | Google Sheets or Airtable | US$ 0 to US$ 20 |
| ATS | Greenhouse, Lever, Workable, Ashby | What you already pay; API access may need a higher plan |
For a team filling 10 to 20 roles a month, the whole thing runs at roughly US$ 30 to US$ 60. Building it takes a weekend for someone comfortable with n8n, or a week of evenings for someone learning.
The legal checklist before you turn it on
- NYC Local Law 144. If the agent "substantially assists" hiring decisions for roles in New York City, it is likely an automated employment decision tool: you need an independent bias audit in the year before use, a public summary and notice to candidates at least 10 business days ahead. Read the DCWP rules with counsel before you decide it does not apply.
- ADA. Tell applicants how to request an accommodation in the process, and make sure no criterion screens out someone because of a disability (an employment gap rule is the classic example, which is why the prompt ignores gaps).
- Title VII and the ADEA. You are responsible for the outcome, not the vendor. Keep the criteria, the prompt version and the review log for each req.
- Illinois. If you add AI analysis of video interviews, the Artificial Intelligence Video Interview Act requires notice, explanation and consent first.
- Data. Use API access or a business plan where your data is not used for training, and set a retention period for rejected resumes.
When an AI screening agent is not worth it
- Fewer than 40 applicants per role. Read them yourself. The resume review prompt in the HR prompts post is enough.
- Senior and executive search. The pool is small, referrals matter more and every candidate deserves a full read.
- When the hiring manager cannot name the criteria. The agent automates a decision you have not made. Fix the intake meeting first.
- When nobody will review the output. Without step 6, you are running an automated rejection machine and carrying all the legal risk.
Common mistakes
- Asking for a fit score instead of evidence per criterion.
- Leaving graduation years and addresses in the text the model reads.
- Copying the old job description's requirements without asking which ones are real.
- Letting the AI write the rejection reason from the scoring sheet.
- Never rerunning the test after changing the prompt or switching models.
Building this yourself is a good way to understand screening with AI. If you would rather have it ready, with the criteria sheet, the redaction step and the review queue already set up, see the option below.

Want to skip this part?
Ready-made AI agents for HR: nothing to build, no prompts to write, they already work for you.
- Screens hundreds of applications with quoted evidence per criterion and a shortlist for your review
- Sends respectful, on-time replies to every candidate who did not move forward
- Answers candidate questions about the role and the process around the clock
Step by step
- Write required and scoring criteria with the hiring manager before the role opens
- Export resumes from your ATS and redact names, addresses, photos and graduation years
- Run the evidence extraction prompt on every resume and save the JSON to a sheet
- Score with a fixed formula and split into shortlist, second look and does not meet requirements
- Review the shortlist and a random 10% of rejections, then fix criteria if needed
- Check pass rates by group and approve rejection messages before they go out
Frequently asked questions
Can AI reject candidates on its own?
It should not. Let it extract evidence and let a fixed rule sort, but a person approves the shortlist, reviews a sample of rejections and approves every rejection message.
How do I avoid bias in AI resume screening?
Write job-related criteria before the role opens, redact names, addresses and graduation years, ask for evidence instead of a score, and compare pass rates by group using the four-fifths rule as a first check.
How much does an AI resume screening agent cost?
About US$ 30 to US$ 60 a month for a team filling 10 to 20 roles: automation, a small AI model through the API and a spreadsheet. The AI itself costs under US$ 1 per 300 resumes.
Can I use ChatGPT for recruiters' screening work?
For a handful of resumes, a business ChatGPT plan with a strict prompt works. For hundreds, use the API inside an automation so every resume gets the same instructions and the results land in a sheet.
Does NYC Local Law 144 apply to my screening agent?
If it substantially assists hiring or promotion decisions for New York City roles, it likely does, which means a yearly independent bias audit and advance notice to candidates. Confirm with employment counsel.



