Importing CVs in Bulk
Upload PDF or Word CVs into a job posting or your talent pool, review the parsed details, resolve duplicates, and record your right to hold the files before creating records.
Why It Matters
Hiring rarely starts with an empty pipeline. There is a folder of CVs from a careers fair, an agency shortlist in your inbox, forty applicants from a role you ran last year. None of it is in Kit, and typing it in by hand is why it stays where it is.
Before any files arrive, Kit requires their source and your personal confirmation that you may upload and hold them. The importer then stores the files for review. Applications or talent-pool entries are created only when you confirm the reviewed batch.
Where the CVs Land
You pick the destination first, and it applies to the whole batch:
- A job posting: open the posting from Hiring > Job Postings and choose Import CVs, either from the posting’s ⋯ menu or on its Applications card. You choose the stage everyone enters, so a shortlist can land in Interview rather than at the top of the funnel.
- The talent pool: start from Hiring > Talent Pool. No role is attached. Use this for CVs you want findable later, not people you are assessing today. See Talent Pool for how that list works.
The choice is made before you upload and cannot be changed mid-batch. If half the folder belongs to a posting, run two imports.
Uploading Files
Drag a folder onto the drop zone, or click to browse. Files upload and parse one at a time with a live progress count.
| Constraint | Limit |
|---|---|
| Files per import | 200 |
| Max file size | 10 MB per file |
| Accepted formats | PDF and .docx |
.doc, the older Word format, is refused; save it as PDF first.
Kit checks what a file contains, not what it is called. Renaming photo.png to cv.pdf does not get it in: the file is rejected on upload, with the reason next to it.
Uploading with an AI Agent
Codex and Claude Code can upload CVs into a Kit job posting through an MCP connection. It needs access to the local files, an HTTP client, and your MCP connection with hiring_write access. The import tools require an active subscription. You must be a Hiring admin or that posting’s hiring manager.
- Ask the agent to find the posting and stage with
hiring_list_job_postingsandhiring_get_job_posting, then callhiring_prepare_cv_import. - Open the returned Kit link, signed in as the same person who owns the MCP connection. Choose the source and received date, read the rights statement, and select Allow agent upload. This form also works on a phone.
- Give the agent the import ID shown on the review page. It can also find your batch using
hiring_list_cv_imports, then read the upload instructions withhiring_get_cv_import. - For each file, the agent calls
hiring_create_cv_import_upload, then sends the binary with curl or another HTTP client to the returnedupload.url, as multipart fieldfile. The URL expires after five minutes and allows one successful upload. NoAuthorizationheader is needed: the MCP client keeps its OAuth token. An invalid file can be retried until expiry. Keep the temporary upload URL private; file bytes stay out of chat messages and tool arguments. - Review the staged rows in Kit, correct missing details, resolve duplicates, and select Import them. The MCP tools read progress; you make the final decision in Kit.
This is a Kit HTTP workflow discovered through MCP tools, not a standard MCP binary-upload feature. The MCP tools cannot record this attestation for you, and a confirmation in chat does not create one. Each upload rechecks the connection, your current permissions, and ownership of the batch. The file limits are the same as a manual upload. Kit sends no candidate email when files are uploaded or imported.
The Staging Tray
Uploading saves nothing to your pipeline. Every file becomes a row in a staging tray only your team can see, and the tray is where you review.
| Row status | What it means |
|---|---|
| Pending | Queued, not read yet |
| Reading | The AI is parsing this file now |
| Ready | Name, email, phone, title and company came back; check them |
| Not a resume | Readable, but not a CV |
| Couldn’t read | Corrupt, scanned without text, or password-protected |
| Not read | AI enrichment is off or out of credits; type the fields in yourself |
The AI reads identity only: name, email, phone, current title, current company. It does not score, rank, or rate anyone. Full-text resume extraction runs afterwards, once the records exist.
Every row needs an email address before the batch can be committed. Rows without one are flagged and the confirm button stays disabled until you fill them in or drop those rows.
Closing the tab is safe. Only files that had not finished uploading are lost; everything already in the tray is waiting under Hiring > Imports when you come back.
Merging Duplicates
A batch almost always contains people Kit already knows. Those rows are flagged: Kit never quietly creates a second copy of someone, and never quietly drops a row for looking familiar. For each flagged row you choose:
- Attach this CV to the existing person: the file joins the record you already have
- Import as new: you have decided they are two different people
- Skip: do not import this row at all
Matching is on email address, so a CV with no email Kit could read cannot be matched against anything. Fill the email in first and the match appears.
Source & Lawful Basis
An imported CV carries no candidate consent record. Before uploading, you record where the files came from (your own inbox, a past posting, a referral, an event, or something you describe yourself) and personally confirm your right to upload and a lawful basis to hold them. The received date records when you obtained the CVs; retention starts when the reviewed records are imported.
Both are stored with every record the import creates and shown on each profile, so a year from now “why do we have this person’s CV” is answered on the page rather than from memory.
Warning
The attestation is a record of your decision, not legal advice, and Kit does not verify it. Telling those people you hold their CV is your job. Kit records the decision, it does not send the notice. If you cannot name a lawful basis for a batch, do not import it.
What an Imported Record Looks Like
Kit never calls these applications, anywhere a person can see. The candidate page reads Imported 14 March by Anna Kowalska, with the source you recorded, the original filename, and a link back to the import.
Nothing tells the person their application advanced, because nothing has. Kit sends a stage email when you advance the candidate. Check its preview before confirming.
Committing the Import
Confirming reports what happened: how many records were created, how many CVs were merged into existing people, how many rows you skipped, and how many failed.
From that moment they are ordinary records: same pipeline, same review flow and stage management, the same retention and anonymization rules as everyone else (Candidate Privacy & Consent), and they appear in data exports like any other candidate.
AI Credits
Parsing runs on your account’s AI credits, roughly two calls per file. Out of credits, or on an inactive subscription, rows come back Not read: the import still works, you type the fields in yourself, and parsing resumes automatically once credits are back. Check the balance at AI settings.
Permissions
| Action | Who can do it |
|---|---|
| Run an import into a job posting | Admins, and hiring managers on that posting |
| Run an import into the talent pool | Admins only |
| View and edit imported records | Team members with permission to access the target record |
See Team Roles for what each role covers.
Quick Checklist
- Decide the destination before you upload: a posting with a stage, or the talent pool
-
Save
.docfiles as PDF, and keep each file under 10 MB - Fill in every missing email before confirming, so duplicates can be matched
- Resolve each flagged duplicate: attach, import as new, or skip
- Record the source and attest to a lawful basis you could defend
- Read the stage-advance email before advancing an imported person. It may be your first contact with them