Your candidates have already written their career history. AI resume parsing saves them entering it again and gives your job board richer profiles to support relevant job discovery. A candidate uploads a resume, corrects the extracted details, and has a profile they can use to explore opportunities.
Cavuno connects that journey through its hosted board or public SDK. This guide covers why it matters for your board, how parsing feeds semantic job matching, and what you would need to build and maintain yourself.
What is AI resume parsing?
AI resume parsing reads an uploaded resume and extracts information into structured fields such as skills, work experience, education, and links. The candidate can then review those fields instead of creating a profile from scratch.
A stored PDF gives you a document to download. Structured fields let candidates edit individual roles and skills, and give search and matching systems information they can use.
The result needs review. A resume may contain an ambiguous date, an unusual layout, or a role that needs more context. Missing information should remain missing until the candidate supplies it.
In Cavuno, candidate profiles connect resume parsing to job matches, the talent directory, and employer messaging. Each serves a different purpose, with separate visibility and contact controls.
See how a resume becomes an editable profile, then supports job discovery.
One resume, three distinct steps
Start with the document
A candidate supplies their resume. Backend parsing extracts structured information from its contents.
maya-chen-resume.pdf
Maya Chen
Product designer · Melbourne
Experience
Designing accessible digital products, from early flows to interactive prototypes.
Skills
Figma · Accessible design · Prototyping
Step 1 of 3: Resume
Why your job board should offer resume parsing
Give candidates a useful starting point
Your signup flow competes with everything else a job seeker needs to do. Re-entering employment history is a substantial request, especially on a phone.
An upload gives them a profile to check and improve. That is a concrete benefit you can explain before registration: create an account, upload your resume, and review your profile to help find relevant jobs.
Cavuno's hosted board provides the upload and editing screens. With the SDK, you can place resume import wherever it fits your own onboarding flow.
Give matching more information to work with
An email address tells your board how to reach someone. A profile adds information about their background that can support personalized discovery.
Give candidates an immediate next action after profile creation: view relevant jobs. Track how many people complete their profile, open a match, and apply, then compare those results with your previous onboarding flow to understand the effect on your board.
Build a talent offering candidates control
Useful profiles can also support employer discovery when candidates choose to be visible. That is relevant if you operate a reverse job board or want to add a talent directory alongside job postings.
Keep the decisions separate. A candidate may want personalized matches while staying out of employer searches. In Cavuno, new profiles default to hidden, and hidden candidates can still use matches, saved jobs, and alerts. Candidates choose whether to make their profile visible to logged-in users or public.
The talent directory controls employer discovery. Cavuno's paid talent access lets you offer profile unlocks or paid contact alongside job postings, subject to candidates' visibility and contact choices.
Where parsing fits into your growth loop
Resume parsing can help a job board build a reinforcing loop: easier profile creation gives candidates a starting point, useful profiles support relevant connections, and employer results can encourage more job postings. More relevant jobs then give new and returning candidates a reason to participate.
Less effort to join. More reasons to come back.
Less manual entry
Parsing makes profile creation easier.
More useful profiles
Candidates review skills and experience.
Relevant connections
Matching and permitted talent discovery.
Value for employers
Relevant applicants and conversations.
More relevant jobs
Employers have a reason to post again.
Candidates return
Useful jobs attract new and returning people.
New and returning candidates can create or update profiles, feeding the loop again. Each connection depends on useful jobs, candidate participation, and employer results. This is a growth hypothesis, not a measured Cavuno outcome.
The important link is employer value, rather than the number of resumes stored. More profiles help when candidates have relevant experience, choose to participate, and can connect with suitable opportunities. Parsing does not replace employer acquisition or job quality. Candidate profiles also stay subject to their visibility and contact choices.
Cavuno supplies the connected profile, matching, and talent-access capabilities. Your role is to build the niche audience and employer relationships that make those connections valuable. Track profile completion, relevant applications or conversations, repeat employer postings, and returning candidates to find where your loop needs work.
How resume parsing connects to AI job matching
Resume parsing extracts information; AI job matching uses profile information to rank jobs. They are separate capabilities within one candidate journey:
- The candidate creates and verifies an account.
- They upload a resume and review the populated profile.
- They open their personalized job matches.
- They can choose to receive matching emails as relevant jobs arrive.
Cavuno ranks live jobs on the board using the candidate's profile and leaves out jobs they have already applied to. On the hosted board, candidates open Job matches from their account menu. For a custom frontend, the SDK returns the ranked list through board.me.recommendedJobs.list.
Display the returned job cards in order. The public response does not include match scores or ranking explanations, so your interface should not invent them.
When no matches are available, help candidates review their profile or browse other jobs. Your board still needs a relevant job inventory to make recommendations useful.
The same profile can support two different routes. Candidates do not have to become discoverable to employers to receive personalized job matches:
| Candidate finds jobs | Employer discovers candidates |
|---|---|
| Profile information → ranked jobs → candidate chooses where to apply | Profile information + permitted visibility → talent directory → employer can explore a candidate |
| A hidden profile can still receive matches | Discovery and contact depend on visibility, job-search status, and applicable access rules |
Go beyond matching job-title strings
Consider how Maya's experience could connect to a UX designer vacancy:
| Stage | Information | What it enables |
|---|---|---|
| Resume | “Planned usability studies and built interactive prototypes in Figma.” | Source evidence for the candidate's experience |
| Reviewed profile | Skills: usability testing, prototyping, Figma; original experience wording retained | Consistent fields the candidate can check and correct |
| Job requirement | “Conduct user research and prototype new product flows.” | A requirement expressed differently from the resume |
| Semantic retrieval | Usability studies relate to user research; building prototypes relates to prototyping product flows | Retrieve this job for further ranking, even without identical wording |
A literal search for “user research” could miss Maya's resume. Semantic retrieval can recognize the related experience, while an exact skill match can still identify Figma. This makes the job worth considering; it does not establish that Maya meets every requirement.
Embeddings represent text as numerical vectors that can be compared for semantic similarity. They help retrieve related content even when the wording differs. The Sentence Transformers semantic-search guide explains the general retrieval approach.
For an independent implementation, consider these separate responsibilities:
- Normalize explicit facts. Map equivalent skill names to consistent identifiers while preserving the candidate's original text. Do not merge distinct qualifications or assume similar job titles mean identical experience.
- Create representations for matching. Build candidate and job text from relevant roles, skills, and responsibilities. Generate compatible embeddings using the same model, or its documented query/document pairing. Avoid using contact details as relevance signals.
- Retrieve plausible jobs. Semantic retrieval supplies jobs worth considering. Exact terms still matter for specific tools and qualifications. Hybrid retrieval combines semantic and keyword signals; Qdrant's hybrid-query documentation shows this public architectural pattern.
- Enforce explicit constraints. Keep job status and stated location or work requirements in structured fields. A high semantic similarity should not override a known incompatibility. Ask for missing preferences instead of inferring them from someone's name or previous address.
- Rank and evaluate the shortlist. A second ranking pass can compare candidates and jobs more closely. Test whether the first results are useful with representative examples, including related wording and superficially similar but unsuitable roles.
An embedding similarity value is not a probability of being hired or proof that a candidate meets a requirement. More advanced retrieval also cannot repair invented profile facts. Keep extraction quality, retrieval relevance, and eligibility checks separately testable.
Recompute affected representations when a profile is corrected or a job changes, remove closed jobs from recommendations, and plan how to rebuild the index when changing embedding models. These are ongoing responsibilities in a custom matching service.
Cavuno's recommendations endpoint handles this infrastructure for your frontend. The steps above describe an independent build, rather than Cavuno's internal ranking implementation.
Matching emails extend the same workflow
Candidates can separately opt into weekly emails of jobs ranked from their profile. Uploading a resume does not automatically subscribe them.
On Cavuno's hosted board, first-run resume onboarding includes an unchecked matching-email option. Candidates can later change that preference in Settings. A custom board can manage the preference through board.me.notificationPreferences while Cavuno handles the matching-email service.
These emails differ from job alerts, which follow saved-search filters. They share the board's Email subscribers allowance, and a subscription may be waitlisted when that allowance is full. See the AI job matching guide for delivery behavior and limits.
How to build resume parsing into a job board
A useful first version needs an upload, extraction, structured output, and an editable profile. Making it dependable also requires decisions about failures, repeat imports, and candidate control.
1. Define the profile you want to populate
Start with fields your candidate experience will actually use. A small illustrative output could look like this:
{"skills": ["Accessibility", "Prototyping"],"experience": [{"title": "Product designer","companyName": "Example Studio","startDate": "2023-04"}],"education": []}
This illustrates the shape of structured information; it is not Cavuno's API schema. Keep career history separate from preferences the candidate should state explicitly. A previous job location, for example, does not establish where someone wants to work next.
For example, suppose a resume says: “Product designer, Example Studio, 2021–2023. Built Figma prototypes and ran usability studies.” A careful import should capture the role, employer, stated years, and supported skills. It should not invent January start dates, a degree, or the candidate's preferred next role. If the person corrects the title to “Senior product designer,” your next import needs a policy for preserving that edit.
Keep extraction, normalization, and inference distinct. Extraction captures what the document says. Normalization makes equivalent terms consistent. Inference adds an interpretation, which should not silently become a fact about the candidate. The exact fields in your schema should reflect the experience you can actually deliver.
2. Accept files and extract their content
Define supported formats and size limits, validate uploads on the server, and associate each file with the authenticated candidate. Decide how to handle documents with little extractable text, including scanned files that may require optical character recognition.
Then convert the extracted content into the fields you defined. Validate the result before writing it to the profile. A syntactically valid response can still contain incorrect information; your product needs a review step as well as schema validation.
You have several implementation choices. A document-text extractor plus rules can support a narrow set of known formats. A standalone parser API can supply structured output across its supported formats. A language model with schema-constrained output can be another extraction component, but still needs validation and factual evaluation. Compare these approaches using the resumes your niche receives, rather than assuming the newest technique performs best for every field.
OCR solves a different problem: obtaining text from images. Successfully reading the letters does not establish which employer a job title belongs to or whether a date describes work or education. Keep a way to distinguish an unreadable document from a readable document whose fields could not be reliably organized.
3. Process imports asynchronously
Return a processing state after accepting the upload, then let the interface check for completion. Provide distinct completed, failed, and still-processing states. A slow import should not trap the candidate behind an indefinite spinner.
Plan for repeated uploads. Decide whether a new import adds information or replaces existing entries, how you prevent duplicate work, and how you protect corrections the candidate has already made. Replacement needs a clear explanation before it happens.
For example, a retry of the same processing task should not add the same employment entry twice. A delayed result from an older upload should not overwrite a more recent import. Associate work with a specific import, make repeated completion safe, and decide which result is allowed to update the profile. These are general reliability requirements for an asynchronous import, independent of the parser you choose.
4. Make review and retention explicit
Display imported information in editable fields. Keep manual entry available for people who skip uploading or whose file cannot be parsed.
Treat retaining the original file, retaining profile fields, profile visibility, and email subscriptions as separate choices. Explain each action precisely so candidates understand what they are changing.
5. Test the whole journey
Use resumes you have permission to test, covering different layouts and incomplete histories. Check missing fields, incorrect dates, duplicates, processing failures, and repeat imports. Measure field correctness and successful profile review alongside parsing completion.
Keep that test set as the system evolves. Changes to document extraction, schemas, or import behavior can affect profiles that previously parsed correctly.
How to evaluate a parser for your niche
Use a small, permissioned sample that represents your actual candidates. Include the industries, languages, career histories, and document styles you expect to support. Keep the expected fields beside each document so you can repeat the evaluation after changing a provider or your implementation.
| Test case | What to inspect | Candidate recovery to provide |
|---|---|---|
| A scanned or photographed resume | Whether the text is readable and names survive extraction | Explain the issue and offer another file or manual entry |
| A complex layout | Whether each title stays attached to the correct employer | Let the candidate correct individual entries |
| Year-only dates or missing information | Whether the system preserves uncertainty | Ask for missing information without inventing precision |
| Another upload after profile edits | Whether corrections survive the chosen import mode | Explain append versus replace before importing |
| A job that sounds relevant but conflicts with a stated requirement | Whether retrieval and eligibility checks remain separate | Show useful alternatives or a clear empty state |
Measure processing completion, field correctness, and candidate review completion separately. A successful request only proves the system returned a result. Count missing facts and unsupported additions as well as correct fields, and inspect whether the fields that matter to your niche are usable.
Then examine downstream behavior: do people open their matches, apply, return, or have useful employer conversations? Compare similar traffic sources and job availability when evaluating changes. A growing job inventory can improve those numbers even if parsing itself has not changed.
Ask suppliers to explain what their accuracy claims measure, which formats and languages the claim covers, and whether results include normalization or inference. Also ask about file retention, deletion, data location, supported integrations, and what happens when processing fails. Textkernel's parser overview illustrates how many separate capabilities sit behind the phrase “resume parsing”; evaluate the ones your board needs.
Compare the full cost of the workflow
A standalone parser quote covers only part of an independent board. Account for document extraction or OCR, parsing requests, retries, storage, profile editing, and operation of the service. If you add semantic matching, include embedding updates, retrieval, ranking, and evaluation work as well.
Compare three routes against the same candidate journey: build the processing system, integrate a parser supplier, or use a job board platform. With a parser supplier you still need to connect the extracted data to accounts, profiles, visibility rules, and matching. With Cavuno, those public capabilities are connected; choose the hosted board for supplied screens or the SDK for your own interface. Check current plans against the capacity and workflows you expect to use.
Add resume parsing with the Cavuno SDK
Use @cavuno/board to upload a resume, check parsing status, and retrieve the populated profile. The responsibilities are:
| Step | Cavuno handles | Your custom frontend handles |
|---|---|---|
| Upload and parse | Resume processing and parsing status | File selection, candidate session, and progress display |
| Review the profile | Profile storage and supported editing operations | Editable fields, corrections, and clear candidate choices |
| Discover jobs | Ranking the candidate's job matches | Displaying returned job cards and handling an empty list |
For candidate profile imports, Cavuno accepts common resume formats including PDF and DOCX, with a 10 MB file limit. Uploads require a verified candidate account. The import can populate skills, work experience, education, and links; candidates can edit the result. An accepted upload starts asynchronous processing, so receiving a response does not mean parsing has finished. See the resume and profile reference for current options and responses.
The following browser example assumes you have installed the SDK and signed in a verified candidate using the same client. Replace pk_example with your board's publishable key. The key identifies the board; the candidate session authorizes personal account operations.
import { createBoardClient } from '@cavuno/board';export const board = createBoardClient({board: 'pk_example',auth: { storage: 'session' },});export async function importResume(file: File,keepResumeOnFile: boolean,) {let resume = await board.me.resume.upload(file, {keepResumeOnFile,importMode: 'append_only',});for (let poll = 0; poll < 30 && resume.parseStatus === 'parsing'; poll++) {await new Promise((resolve) => setTimeout(resolve, 2000));resume = await board.me.resume.retrieve();}if (resume.parseStatus !== 'parsed') {return { resume, profile: null };}const [profile, skills, experience, education] = await Promise.all([board.me.profile.retrieve(),board.me.profile.listSkills(),board.me.profile.listExperience(),board.me.profile.listEducation(),]);return { resume, profile, skills, experience, education };}
Pass keepResumeOnFile from the candidate's choice. The example uses an append-only import; the SDK also supports replacement with explicit confirmation. After completion, render the returned profile and collections for review, respecting pagination where applicable.
The polling loop has a fixed budget. If the returned status is still parsing, show a delayed state and offer to check again. If it is failed, show an appropriate failure message and keep manual editing available. Catch request errors in your caller so a failed upload also produces a usable screen. These are application responsibilities, not screens generated by the SDK.
The authentication guide covers session ownership and server-rendered integrations. Never share one candidate's credentials across users.
Show matches after profile review
When the candidate opens their matches page, retrieve the ranked jobs:
const matches = await board.me.recommendedJobs.list({ limit: 20 });const jobs = matches.data.map((match) => match.job);
Render these job cards in their returned order. Include an empty state, and use profile information to decide whether to suggest completing the profile. Keep private account responses out of shared caches. The job matches cookbook covers the full integration.
Deleting a stored resume is also distinct from deleting profile information: board.me.resume.delete() removes the stored file and its keep-on-file consent while retaining imported fields. Explain that distinction in the interface. See the candidate account reference for profile editing and resume operations.
Choose the implementation that fits your board
Use Cavuno's hosted board when you want the candidate workflow provided for you. Enable Job seeker profiles under Settings → Features, then test signup, resume upload, profile review, and Job matches. Resume parsing and AI job matching are available on every paid plan.
Choose the SDK when your board needs a custom onboarding flow or profile interface. The examples above connect those screens to Cavuno's managed services.
Building the underlying system yourself can make sense when document processing is central to your product or you need behavior beyond the available contract. Scope the ongoing operational work alongside the initial extraction prototype.
For most job board operators, the useful outcome is a connected experience: candidates bring their resume, improve their profile, and discover relevant opportunities. Start with the hosted candidate profile guide or the Cavuno SDK to build that journey on managed infrastructure.






