A neural network for HR: job posts, candidate emails and resume review

A model can draft job posts and emails and do a first-pass resume review. What to hand over, how to treat candidates' personal data and how to prevent biased decisions.

6 min · · бизнес · автоматизация

A neural network for HR saves time on text routine: job posts, emails, interview questions, first-pass review of a stream of resumes. But this field has two traits absent in marketing or support. First: resumes and forms contain personal data of real people. Second: decisions about people depend on the result, so a model's bias turns into real harm. Below: what to hand a model, how to treat data, how to build resume review so the decision stays with a human, and what it costs.

A neural network for HR: which tasks suit a model

A guide: the fewer the consequences of a mistake and the easier it is to verify the result, the better the task fits.

TaskModel's roleRiskHow to reduce it
Job post textwrites a draft from your requirementsdiscriminatory wordingproofreading, a list of banned phrases in the prompt
Candidate emailsinvitation, interview reschedule, rejectionwrong tone, error in detailsa template, manual sending
Interview questionssuggests questions for the role's competenciesgeneric questionsgive the job description and level
First-pass resume reviewmatches the resume against criteriabias, missing a strong candidatecriteria from the job post, quotes, a human decides
Onboardingchecklists, FAQ for newcomersoutdated datathe source is your documents
Document draftsjob descriptions, regulationslegal inaccuracyreview by a lawyer

For job posts and emails you do not have to take the most expensive model: start with an inexpensive one and test it on your own examples. How to choose a model by price and strength index is in the article on the model strength index. There is also a separate piece on texts in general: a neural network for writing texts.

Job posts and emails: what to ask for

A good request contains facts, not a plea to "write it nicely": the position, duties, required and desirable requirements, terms, the salary range (if you publish it), work format. Add constraints: "do not mention age, gender or marital status, do not use words like 'young' or 'energetic'". And ask to separate the required from the desirable: it is easier to match resumes against that.

For candidate emails set the tone and structure. A rejection email: thanks, a clear decision without needless detail, no promises like "we will keep your resume" if you will not keep it. A model will prepare a draft of such an email, but send it yourself: automatic rejection mailings sent unread quickly lead to awkward situations.

Candidates' personal data

A resume is a full name, contacts, date of birth, workplaces, sometimes a photo, marital status and an address. Everything you pass to a model in a request goes to the provider's side. Practical rules:

  1. Pass the minimum. To match against criteria you do not need the name, phone, email and address. Remove them before sending and label the candidate with a number. How to replace data with labels and restore them, we covered in the article on logging without leaking data.
  2. Do not send extras. A photo, health data, marital status and nationality are not needed to assess skills, and even less in a request.
  3. Clarify the legal side. Processing candidates' personal data is governed by the personal data law: consents, purposes, storage, transfer to third parties. We do not give legal opinions; discuss questions about passing data to a model API and about where it is stored with the company lawyer before launch.
  4. A separate key. Create a key for HR: in the dashboard you set a daily and monthly limit on it and a list of allowed models (more about key limits). That way HR spend is visible separately and stays under its ceiling.
  5. Store results carefully. A model's answer about a specific candidate is also personal data and should live where the resume lives.

Bias: how not to hand the decision to a model

A model is trained on texts that carry human stereotypes. So resume review must be built to leave it no room for a "gut feeling" score.

  • Criteria are set in advance and taken from the job post. Do not ask "rate the candidate on a ten-point scale". Ask it to mark each criterion as met, not met or unclear and to give a quote from the resume.
  • No protected attributes. Remove the name, gender, age, photo, marital status and nationality before sending to the model.
  • The model does not reject. Its output is a summary for the recruiter, not a decision. A human rejects.
  • A swap test. Take one resume and send two versions with different names or a different gender. The results per criterion must match. If they do not, you have a problem and such a process cannot be used. Repeat the test whenever you change the model or the prompt.
  • Spot audits. Once a month a recruiter manually reviews random resumes that received "not met" and looks for strong candidates who were missed.

Example: a resume summary against criteria

bash
import json
import os

from openai import OpenAI

client = OpenAI(
    base_url="https://api.zukko.pro/v1",
    api_key=os.environ["ZUKKO_API_KEY"],
)

CRITERIA = [
    "At least 3 years of experience with PostgreSQL",
    "Experience writing REST APIs in Python",
    "Experience leading a project in a team of 3 or more",

The quote_found field catches the nastiest failure: an invented quote. If the model cites a phrase that is not in the resume, the result for that criterion cannot be used. The unclear status does not mean "a weak candidate"; it is a signal for the recruiter to look themselves.

What it costs

Prices on October 18, 2026, per 1M tokens. Suppose a stream of 200 resumes. A resume and form take about 1,000 tokens, criteria and instruction about 500, the answer about 250. Input is 200 × 1,500 = 300,000, output 200 × 250 = 50,000.

  • gpt-6.1-sol (input $0.27, output $1.32): 300,000 × 0.27 / 1,000,000 + 50,000 × 1.32 / 1,000,000 = 0.081 + 0.066 = $0.147.
  • claude-sonnet-5-5 ($0.4 / $2): 0.12 + 0.10 = $0.22.
  • deepseek-v4.1-flash ($0.013 / $0.038): 0.0039 + 0.0019 ≈ $0.006.

That is the cost of a run over 200 resumes. The model price is secondary here: what matters is that the process is verifiable. If you rerun the same resumes with the same criteria, turn on the response cache with the X-Zukko-Cache: true header: an identical request within 7 days is served from the cache and not charged. Current prices: GET https://api.zukko.pro/v1/models.

FAQ

Can a neural network be trusted to select candidates?

Not as the final decision. A model is good for a summary against set criteria, and the decision must be made by a person who can explain it to the candidate.

Which model for HR tasks?

For emails and job posts you can start with claude-sonnet-5-5 or gpt-6.1-sol and check the result on your own texts. For first-pass review compare two or three models on 20 resumes and check the stability of the result, including with the name-swap test.

How do I avoid sending personal data to a model?

Remove names, contacts and addresses before sending and label the candidate with a number. If former employers' names and job titles remain in the text, that is context that may identify a person too: decide whether the task needs it.

How do I connect from Russia?

Access from Russia goes through the gateway, payment by SBP, a MasterCard card or crypto. The key is created in the Zukko dashboard.

zukko

Pay 25×
less

for Claude Code & ChatGPT

One fetch_* key and base URL api.zukko.pro — for Cursor, Claude Code, Codex, and any SDK.

Get API keyDocumentation

api.zukko.pro · fetch_*

Neural network for HR: job posts, emails, resumes · Zukko