--- title: "Best AI Resume Parsing APIs for Structured JSON Output" type: "Ranking" url: "https://aidemos.com/best/resume-parsing-apis" description: "If you need a resume parsing API that turns PDF and DOCX resumes into clean, machine-readable JSON, the hard part is not just extracting names and emails. The real test is whether the parser keeps work history, education, skills, certifications, and layout-dependent fields accurate across clean, multi-column, messy, and OCR-only resumes without manual field mapping." readTime: "14 min read" tested: "Extracta.ai vs Airparser vs Parseur vs LlamaParse vs Affinda vs HrFlow vs Hireability vs CVParserPro vs Skima AI vs OpenResume" testedDate: "July 2026" category: "developer-tools" published: "2026-08-06T06:00:31.609824+00:00" updated: "2026-08-06T06:00:31.609824+00:00" evidenceCount: 152 verifiedCount: 96 coverage: "dense" --- # Best AI Resume Parsing APIs for Structured JSON Output `10 Tools Tested` · `API Benchmark` · `PDF + DOCX` · `OCR Edge Case` · `Structured JSON` **Tested:** Extracta.ai vs Airparser vs Parseur vs LlamaParse vs Affinda vs HrFlow vs Hireability vs CVParserPro vs Skima AI vs OpenResume · July 2026 > If you need a resume parsing API that turns PDF and DOCX resumes into clean, machine-readable JSON, the hard part is not just extracting names and emails. The real test is whether the parser keeps work history, education, skills, certifications, and layout-dependent fields accurate across clean, multi-column, messy, and OCR-only resumes without manual field mapping. ## Our Verdict **#1 pick: Extracta.ai** (Best) — Excellent when you know exactly which fields you want, but it silently drops anything outside the schema and can map the wrong data to a field name. - #2 Airparser — Strongest at readable JSON extraction from varied resumes, but it can slip on exact contact details and title completeness. - #3 Parseur — Strong template-driven parser for core resume fields, but it weakens on structured list fields and messy education details. - #4 LlamaParse — Strongest at structured extraction and layout resilience, but less reliable on exact value fidelity and consistent field naming. - #5 Affinda — Strong on structured JSON, custom fields, and multi-column layouts, but it needs cleanup for accuracy and noisy skills. - #6 HrFlow — Reliable API parser for clean PDFs, but noisy and less accurate on harder layouts. - #7 Hireability — Strong on JSON/API delivery, but shaky on layout edge cases and noisy skill output. - #8 CVParserPro — Good at building a structured candidate profile, but weak on date accuracy and fixed-schema flexibility. - #9 Skima AI — Fast on basic resumes, but weak on structured output and sidebar-heavy layouts. - #10 OpenResume — Free, zero-signup browser parser that opens PDFs easily, but it is brittle on field placement and offers no machine-readable export. ## How We Tested We compared resume parsing tools on the same benchmark set: a clean single-column resume, a multi-column sidebar resume, a messy real-world resume, and an added image-only OCR edge case described in the benchmark plan. Each tool was judged on contact info, work history, skills, education, JSON structure, layout handling, output noise, custom field support, export behavior, and whether it fit a developer-led API workflow without manual data entry. **What we evaluated:** | Criterion | Description | | --- | --- | | Input handling | Does the tool accept PDF via API without errors? | | Output format | Does it return valid, structured JSON? | | Field coverage | Are name, email, phone, experience, education, and skills extracted? | | Accuracy | Are extracted values correct and complete? | | Multi-column handling | Does it correctly parse two-column sidebar layouts? | | Messy resume handling | Does it degrade gracefully on poorly formatted input? | | Noise in output | Does it add incorrect or hallucinated fields? | | Custom field support | Can the developer define or select specific output fields? | | Export format | How is the output delivered — JSON, CSV, webhook? | | Free tier viability | Is the tool testable without a paid plan or enterprise outreach? | ## The Ranking 10 tools tested head-to-head on the same input. ### 1. Extracta.ai — Best *Best for schema-driven resume extraction with very clean JSON and low output noise.* Excellent when you know exactly which fields you want, but it silently drops anything outside the schema and can map the wrong data to a field name. ### 2. Airparser — Usable *Strongest at readable JSON extraction from varied resumes, but it can slip on exact contact details and title completeness.* A very strong runner-up with readable output and good extraction depth, but it can hallucinate contact data and flatten skills in ways that need cleanup. ### 3. Parseur — Usable *Strong template-driven parser for core resume fields, but it weakens on structured list fields and messy education details.* Good for defined fields and neat exports, but it requires upfront template work and still flattens or misses data outside the template. ### 4. LlamaParse — Usable *Strongest at structured extraction and layout resilience, but less reliable on exact value fidelity and consistent field naming.* The best structured output on depth and layout awareness, but field names drift between parses and some values are embedded or omitted rather than normalized. ### 5. Affinda — Usable *Strong on structured JSON, custom fields, and multi-column layouts, but it needs cleanup for accuracy and noisy skills.* Best overall balance of accuracy, schema richness, and layout handling, even though it still misses CGPA values and introduces taxonomy noise. ### 6. HrFlow — Usable *Reliable API parser for clean PDFs, but noisy and less accurate on harder layouts.* It accepts PDFs and returns structured JSON, but phone truncation, lowercase normalization, and certification failures make it hard to trust without cleanup. ### 7. Hireability — Usable *Strong on JSON/API delivery, but shaky on layout edge cases and noisy skill output.* It is API-ready and returns structured data, but name splitting, merged fields, and multi-column misclassification make the output risky to use directly. ### 8. CVParserPro — Needs work *Good at building a structured candidate profile, but weak on date accuracy and fixed-schema flexibility.* It extracts core profile data, but wrong experience counts, missing LinkedIn/CGPA, and no JSON export limit its fit for an API integration. ### 9. Skima AI — Needs work *Fast on basic resumes, but weak on structured output and sidebar-heavy layouts.* It can handle simple uploads, but it loses certifications, concatenates skills into one string, and lacks the export behavior needed for a true API workflow. ### 10. OpenResume — Needs work *Free, zero-signup browser parser that opens PDFs easily, but it is brittle on field placement and offers no machine-readable export.* Useful for manual inspection, but it fails on essential fields, breaks badly on harder layouts, and does not meet the JSON API requirement. ## Full Breakdown ### Extracta.ai Extracta.ai is the most predictable schema-first parser in the set: very clean output, no noise, and strong field precision, but only for fields you define up front. ![Extracta.ai screenshot showing Source resume](https://d3epheqghktydj.cloudfront.net/parse-resumes-into-structured-data-using-extracta-ai-input-1-534dfa572466.pdf) *Screenshot — Clean single-column resume used to test whether schema-defined fields are extracted precisely.* ![Extracta.ai screenshot showing Source resume](https://d3epheqghktydj.cloudfront.net/parse-resumes-into-structured-data-using-extracta-ai-input-2-a079eb70ee69.pdf) *Screenshot — Multi-column sidebar resume used to check whether Extracta.ai can separate the split header and right-side sections cleanly.* ![Extracta.ai screenshot showing Source resume](https://d3epheqghktydj.cloudfront.net/parse-resumes-into-structured-data-using-extracta-ai-input-3-7806367fd9c2.pdf) *Screenshot — Messy resume used to check how well a schema-defined extraction handles inconsistent formatting.* **What worked:** - Extracta.ai returned lean, exact-field JSON with no metadata noise, kept work histories and skills intact, extracted the spoken languages section on the multi-column resume, and handled the messy resume's skills, certifications, and three education entries cleanly. **Where it struggled:** - Anything not explicitly defined in the schema vanished, including LinkedIn, summary, projects, and the job-title headline; CGPA stayed buried inside description text, and the clean resume's languages field picked up programming languages instead of spoken ones. **What came out:** ![Extracta.ai output showing Parsed structured output](https://d3epheqghktydj.cloudfront.net/parse-resumes-into-structured-data-using-extracta-ai-output-1-a01c085fbe66.txt) *Output — Extracta.ai returned a clean minimal JSON payload for the clean resume, but LinkedIn was absent because it was not part of the schema and the CGPA stayed embedded in a description string.* ![Extracta.ai output showing Parsed structured output](https://d3epheqghktydj.cloudfront.net/parse-resumes-into-structured-data-using-extracta-ai-output2-c32b71b0b786.txt) *Output — Extracta.ai extracted the multi-column resume cleanly, including spoken languages, but still omitted LinkedIn and kept the CGPA value inside a description field.* ![Extracta.ai output showing Parsed structured output](https://d3epheqghktydj.cloudfront.net/parse-resumes-into-structured-data-using-extracta-ai-output-3-28bd0eabeb73.txt) *Output — Extracta.ai handled the messy resume well, including all education entries and soft skills, but the languages field was blank and the certifications were preserved in lower case.* ### Airparser Airparser produces clean, human-readable JSON and did well on the harder resume layouts, but it still shows GPT-style hallucination risk and inconsistent skill formatting. ![Airparser screenshot showing Source resume](https://d3epheqghktydj.cloudfront.net/parse-resumes-into-structured-data-using-airparser-input-1-3eaec5a4b786.pdf) *Screenshot — Clean single-column resume used to test baseline extraction quality and contact accuracy.* ![Airparser screenshot showing Source resume](https://d3epheqghktydj.cloudfront.net/parse-resumes-into-structured-data-using-airparser-input-2-5bdda5de3c7f.pdf) *Screenshot — Multi-column sidebar resume used to test layout robustness and structured output depth.* ![Airparser screenshot showing Source resume](https://d3epheqghktydj.cloudfront.net/parse-resumes-into-structured-data-using-airparser-input-3-2437c51116ff.pdf) *Screenshot — Messy resume used to test whether the parser can recover usable structure from inconsistent formatting.* **What worked:** - Airparser extracted all major fields on the clean and multi-column resumes, preserved CGPA values as strings, pulled both certifications, and did especially well on the messy resume by recovering certifications, hobbies, references, and soft skills. **Where it struggled:** - It hallucinated the clean-resume email as rugged.nichite@email.com, dropped part of the clean-resume job title, flattened the multi-column skills into a list of individual objects, and returned all messy-resume skills as one concatenated string. **What came out:** ![Airparser output showing Parsed structured output](https://d3epheqghktydj.cloudfront.net/parse-resumes-into-structured-data-using-airparser-1-output-566ff479b5bf.txt) *Output — Airparser captured the clean resume's major fields and preserved the CGPA as a string, but it misread the email address and dropped part of the job title.* ![Airparser output showing Parsed structured output](https://d3epheqghktydj.cloudfront.net/parse-resumes-into-structured-data-using-airparser-output-1-25a770e8bb86.txt) *Output — Airparser handled the multi-column resume well, including projects and spoken languages, but it flattened skills into individual objects rather than preserving the original category grouping.* ![Airparser output showing Parsed structured output](https://d3epheqghktydj.cloudfront.net/parse-resumes-into-structured-data-using-airparser-output-3-1443e1cd9ec9.txt) *Output — Airparser recovered the messy resume's contact info, education, certifications, hobbies, and soft skills, but it returned the skills as one concatenated string instead of a machine-friendly array.* ### Parseur Parseur is a strong template-driven option: clean output for the fields you define, easy exports, and good control, but it is limited by upfront setup and template scope. ![Parseur screenshot showing Source resume](https://d3epheqghktydj.cloudfront.net/parse-resumes-into-structured-data-using-input1-rugved-nichite-cleanresume-2-d776e5470f6f.pdf) *Screenshot — Clean single-column resume used to test Parseur's template-based extraction.* ![Parseur screenshot showing Source resume](https://d3epheqghktydj.cloudfront.net/parse-resumes-into-structured-data-using-input2-priya-sharma-multicolumnresume-2-0e443ffc95c3.pdf) *Screenshot — Multi-column sidebar resume used to test whether Parseur's template can survive split layout content.* ![Parseur screenshot showing Source resume](https://d3epheqghktydj.cloudfront.net/parse-resumes-into-structured-data-using-input3-john-kumar-messyresume-2-75275a848042.pdf) *Screenshot — Messy resume used to test how much Parseur can recover after a template has been defined.* **What worked:** - Once the template was set, Parseur returned clean, readable JSON for the fields it knew about, kept the core contact and work data tidy, and exported to JSON, CSV, and Excel. **Where it struggled:** - It required one-time mailbox/template setup, flattened certifications into a single string, embedded CGPA in the education text, skipped template-free fields like languages and work locations, and only returned one education entry on the messy resume. **What came out:** ![Parseur output showing Parsed structured output](https://d3epheqghktydj.cloudfront.net/parse-resumes-into-structured-data-using-parseur-1-output-e65d11f1aa86.txt) *Output — Parseur cleanly extracted the clean resume's defined fields, but certifications were flattened into one string and CGPA stayed embedded inside education text.* ![Parseur output showing Parsed structured output](https://d3epheqghktydj.cloudfront.net/parse-resumes-into-structured-data-using-parseur-2-output-aec574dc685b.txt) *Output — Parseur handled the multi-column resume's defined fields well, but fields not in the template such as CGPA, languages, and work location were omitted.* ![Parseur output showing Parsed structured output](https://d3epheqghktydj.cloudfront.net/parse-resumes-into-structured-data-using-parseur-3-output-f5df455402b5.txt) *Output — Parseur's messy-resume output showed that it could recover some core information, but only one education entry appeared and the skills were still unstructured.* ### LlamaParse LlamaParse returns the richest nested structure in the set, with strong layout awareness and structured skills and certifications, but its field naming and normalization are inconsistent. ![LlamaParse screenshot showing Source resume](https://d3epheqghktydj.cloudfront.net/parse-resumes-into-structured-data-using-image-28-54afcf4e20d2.png) *Screenshot — Clean-resume test input shown in the LlamaParse interface.* ![LlamaParse screenshot showing Source resume](https://d3epheqghktydj.cloudfront.net/parse-resumes-into-structured-data-using-image-32-f43eaec9f365.png) *Screenshot — Multi-column resume input shown in the LlamaParse interface.* ![LlamaParse screenshot showing Source resume](https://d3epheqghktydj.cloudfront.net/parse-resumes-into-structured-data-using-image-34-456a7359338a.png) *Screenshot — Messy resume input shown in the LlamaParse interface.* **What worked:** - LlamaParse produced the richest nested JSON of the group, with categorized skills, structured certifications, clean responsibility arrays, strong multi-column handling, and the best messy-resume coverage. **Where it struggled:** - It dropped AI from the clean-resume job title, packed CGPA into a string, changed field names across parses, omitted certification issuers on the multi-column resume, and left absent keys entirely instead of nulls. **What came out:** ![LlamaParse output showing Parsed structured output](https://d3epheqghktydj.cloudfront.net/parse-resumes-into-structured-data-using-llama-output-2-b0738d3697c2.txt) *Output — LlamaParse handled the multi-column resume strongly, including projects and spoken languages, but the certification issuer fields disappeared on this parse.* ![LlamaParse output showing Parsed structured output](https://d3epheqghktydj.cloudfront.net/parse-resumes-into-structured-data-using-llama-output-3-211c2f59deaf.txt) *Output — LlamaParse produced the strongest messy-resume output, but it still preserved inconsistent key naming and left the languages key absent when the section was missing.* ### Affinda Affinda is the most complete API-style resume parser in this set, with rich field metadata, broad custom-field support, and strong performance on clean, multi-column, and messy resumes. ![Affinda screenshot showing Source resume](https://d3epheqghktydj.cloudfront.net/parse-resumes-into-structured-data-using-affinda-input-1-c745d078efaa.pdf) *Screenshot — Clean single-column resume used to test baseline contact, work history, education, skills, and certification extraction.* ![Affinda screenshot showing Source resume](https://d3epheqghktydj.cloudfront.net/parse-resumes-into-structured-data-using-affinda-input-2-df97006ac140.pdf) *Screenshot — Multi-column sidebar resume used to test reading order, section detection, and field coverage across split layouts.* ![Affinda screenshot showing Source resume](https://d3epheqghktydj.cloudfront.net/parse-resumes-into-structured-data-using-affinda-input-3-16d7d7282549.pdf) *Screenshot — Messy resume used to test inconsistent formatting, mixed date styles, and fallback heuristics.* **What worked:** - Accepted PDFs directly, returned a rich JSON schema, extracted both work histories, and handled the multi-column layout and messy bullet lists without crashing. It also captured a large skill set with detailed taxonomy metadata and extracted certifications and languages in a structured way. **Where it struggled:** - It never captured the CGPA number, split LinkedIn into two website fragments, injected certification names and other noise into skills, truncated one project description, and inflated John Kumar's total experience to 7.3 years. **What came out:** ![Affinda output showing Parsed structured output](https://t9014651757.p.clickup-attachments.com/t9014651757/54c56877-09e8-49e2-82b0-d0be2afd91be/json%20output%201.txt) *Output — Affinda's clean-resume JSON captured the core sections and rich skill metadata, but the CGPA score field stayed empty even though the resume clearly showed 8.2.* ![Affinda output showing Parsed structured output](https://t9014651757.p.clickup-attachments.com/t9014651757/309682dd-12ef-437a-8144-9d493033b30a/json%20output%202.txt) *Output — Affinda handled the multi-column resume well, but the output still missed the numeric CGPA value, left the objective and summary empty, and truncated the project description.* ![Affinda output showing Parsed structured output](https://d3epheqghktydj.cloudfront.net/parse-resumes-into-structured-data-using-json-output-3-1e94d404d664.txt) *Output — Affinda recovered the messy resume's core data, but the total experience value was inflated, one certification was missed, and the skills output included noise and taxonomy spillover.* ### HrFlow HrFlow is a developer-first API with fixed schema output, but the parsing quality is uneven enough that a production integration would need cleanup and validation. ![HrFlow screenshot showing Source resume](https://d3epheqghktydj.cloudfront.net/parse-resumes-into-structured-data-using-image-39-c688e0982059.png) *Screenshot — Clean-resume test input shown in the HrFlow flow.* ![HrFlow screenshot showing Source resume](https://d3epheqghktydj.cloudfront.net/parse-resumes-into-structured-data-using-image-43-76d24955b1b7.png) *Screenshot — Multi-column resume test input shown in the HrFlow flow.* ![HrFlow screenshot showing Source resume](https://d3epheqghktydj.cloudfront.net/parse-resumes-into-structured-data-using-image-47-2d3ffda81984.png) *Screenshot — Messy resume test input shown in the HrFlow flow.* **What worked:** - HrFlow accepted API uploads, extracted core contact and work data for all three resumes, and recovered the multi-column languages section plus the messy resume's education history. **Where it struggled:** - Phone numbers were truncated on two inputs, all text was lowercased, certifications were unreliable or misclassified, job titles were truncated, tasks were incomplete, and noise skills polluted the output. **What came out:** ![HrFlow output showing Parsed structured output](https://d3epheqghktydj.cloudfront.net/parse-resumes-into-structured-data-using-hrflow-output-1-9f17ceb5aef8.txt) *Output — HrFlow extracted the clean resume's main fields, but it missed the CGPA field and treated a certification as an education entry.* ![HrFlow output showing Parsed structured output](https://d3epheqghktydj.cloudfront.net/parse-resumes-into-structured-data-using-hrflow-output-2-f9ab0eee10f0.txt) *Output — HrFlow extracted the multi-column resume's core fields, but the job title was truncated and several project/task fragments leaked into skills.* ![HrFlow output showing Parsed structured output](https://d3epheqghktydj.cloudfront.net/parse-resumes-into-structured-data-using-hrflow-output-3-e67919dd0604.txt) *Output — HrFlow handled the messy resume without crashing, but certifications were missing, soft skills were dropped, and only part of the tasks survived.* ### Hireability Hireability returns structured JSON and works well enough on some messy content, but the name splitting and category-mixing problems make the output unreliable without heavy cleanup. ![Hireability screenshot showing Source resume](https://d3epheqghktydj.cloudfront.net/parse-resumes-into-structured-data-using-hireability-input-1-40a1cf535653.pdf) *Screenshot — Clean single-column resume used to test Hireability's JSON extraction and competency mapping.* ![Hireability screenshot showing Source resume](https://d3epheqghktydj.cloudfront.net/parse-resumes-into-structured-data-using-input-2-multicolumn-resume-715fd9f46669.pdf) *Screenshot — Multi-column resume used to test whether Hireability can keep contact fields and candidate structure intact.* ![Hireability screenshot showing Source resume](https://d3epheqghktydj.cloudfront.net/parse-resumes-into-structured-data-using-input-3-messy-resume-531b45c70847.pdf) *Screenshot — Messy resume used to test Hireability's robustness on unstructured content.* **What worked:** - Hireability returned API-ready JSON, extracted contact and work data on the messy resume reasonably well, preserved hobbies, and captured a broad competency set. **Where it struggled:** - The clean resume split the name into Dev/loper, the multi-column resume was misread as a job order with missing contact fields, skills were flattened into noisy beginner-level competencies, and certifications were merged with skills and references on the messy file. **What came out:** ![Hireability output showing Parsed structured output](https://d3epheqghktydj.cloudfront.net/parse-resumes-into-structured-data-using-hireability-output-1-48eafab4ff52.txt) *Output — Hireability extracted the clean resume's core fields, but the given and family name were split incorrectly and the competencies were noisy and over-labeled as beginner.* ![Hireability output showing Parsed structured output](https://d3epheqghktydj.cloudfront.net/parse-resumes-into-structured-data-using-hireability-output2-9309c0b1117f.txt) *Output — Hireability misread the multi-column resume as a job order, which caused contact fields to go missing and level fields to come back blank.* ![Hireability output showing Parsed structured output](https://d3epheqghktydj.cloudfront.net/parse-resumes-into-structured-data-using-hireability-output-3-ccd87ec3223d.txt) *Output — Hireability did better on the messy resume, but it still merged employer and role text, collapsed certifications with references, and left one education entry missing.* ### CVParserPro CVParserPro produces a readable candidate profile and handles basic fields well, but the experience math and missing fields make it too fragile for a production API workflow. ![CVParserPro screenshot showing Source resume](https://d3epheqghktydj.cloudfront.net/parse-resumes-into-structured-data-using-input1-rugved-nichite-cleanresume-5354fbc53b64.pdf) *Screenshot — Clean single-column resume used to test the profile view and field extraction.* ![CVParserPro screenshot showing Source resume](https://d3epheqghktydj.cloudfront.net/parse-resumes-into-structured-data-using-input2-priya-sharma-multicolumnresume-471ac8d903f6.pdf) *Screenshot — Multi-column resume used to test reading order and candidate profile extraction.* ![CVParserPro screenshot showing Source resume](https://d3epheqghktydj.cloudfront.net/parse-resumes-into-structured-data-using-input3-john-kumar-messyresume-12efbcc7cceb.pdf) *Screenshot — Messy resume used to test robustness against weak formatting.* **What worked:** - CVParserPro extracted core profile data, work history, education, certifications, and skills into a readable candidate profile, and it handled the messy resume better than expected on the basics. **Where it struggled:** - Experience counts were wrong, CGPA and LinkedIn were missing, one education start date was hallucinated, certification issuers disappeared on the multi-column resume, and there was no JSON export for a true API workflow. **What came out:** ![CVParserPro output showing Parsed structured output](https://d3epheqghktydj.cloudfront.net/parse-resumes-into-structured-data-using-resumeparser-output-1-4bfa947db0c8.txt) *Output — CVParserPro extracted the clean resume's major fields, but the experience count was inflated, LinkedIn was missing, and CGPA was absent.* ![CVParserPro output showing Parsed structured output](https://d3epheqghktydj.cloudfront.net/parse-resumes-into-structured-data-using-resumeparser-output-2-fd659b6b9d5f.txt) *Output — CVParserPro handled the multi-column resume's core data, but it inferred the wrong education start date, omitted CGPA, and dropped issuer details from certifications.* ![CVParserPro output showing Parsed structured output](https://d3epheqghktydj.cloudfront.net/parse-resumes-into-structured-data-using-resumeparser-output-3-7f9a90a91110.txt) *Output — CVParserPro recovered the messy resume's basics, but it still lacked a clean JSON export and the detailed structure needed for reliable downstream automation.* ### Skima AI Skima AI can parse the easy cases, but the output is not stable enough for an API integration because key sections collapse, skills flatten, and certifications go missing. ![Skima AI screenshot showing Source resume](https://d3epheqghktydj.cloudfront.net/parse-resumes-into-structured-data-using-input-1-clean-resume-d56ebcff8cec.pdf) *Screenshot — Clean single-column resume used to test Skima AI's baseline parsing.* ![Skima AI screenshot showing Source resume](https://d3epheqghktydj.cloudfront.net/parse-resumes-into-structured-data-using-input-2-multicolumn-resume-715fd9f46669.pdf) *Screenshot — Multi-column resume used to test Skima AI's layout handling and sidebar capture.* ![Skima AI screenshot showing Source resume](https://d3epheqghktydj.cloudfront.net/parse-resumes-into-structured-data-using-input-3-messy-resume-531b45c70847.pdf) *Screenshot — Messy resume used to test how Skima AI handles weak structure and unformatted bullets.* **What worked:** - Skima AI parsed clean and multi-column resumes without configuration, extracted names, contacts, work histories, education, and a decent skill set on the first two inputs, and even computed total experience. **Where it struggled:** - It lost CGPA and certifications, concatenated skills into one unstructured string, truncated responsibilities on the multi-column resume, and produced missing or collapsed sections on the messy resume with no obvious JSON export. **What came out:** ![Skima AI output showing Parsed structured output](https://d3epheqghktydj.cloudfront.net/parse-resumes-into-structured-data-using-skima-ai-output-1-1a4bf3942f24.txt) *Output — Skima AI extracted the clean resume's main fields, but skills were flattened into one concatenated string and certifications were not extracted.* ![Skima AI output showing Parsed structured output](https://d3epheqghktydj.cloudfront.net/parse-resumes-into-structured-data-using-skimaai-2-output-0cd7f4218684.txt) *Output — Skima AI handled the multi-column resume's contacts and experience, but the sidebar content, projects, and responsibilities suffered truncation or omission.* ![Skima AI output showing Parsed structured output](https://d3epheqghktydj.cloudfront.net/parse-resumes-into-structured-data-using-skima-ai-3-output-dfb16620f9bb.txt) *Output — Skima AI recovered some messy-resume data, but it still merged fields and left key sections like certifications and references collapsed.* ### OpenResume OpenResume is a useful browser viewer for single-column resumes, but it is not a production API parser and it fails on too many essential fields to recommend here. ![OpenResume screenshot showing Source resume](https://d3epheqghktydj.cloudfront.net/parse-resumes-into-structured-data-using-input1-rugved-nichite-cleanresume-5354fbc53b64.pdf) *Screenshot — Clean single-column resume used to test OpenResume's browser parser.* ![OpenResume screenshot showing Source resume](https://d3epheqghktydj.cloudfront.net/parse-resumes-into-structured-data-using-input2-priya-sharma-multicolumnresume-471ac8d903f6.pdf) *Screenshot — Multi-column resume used to test whether OpenResume can keep field alignment intact.* ![OpenResume screenshot showing Source resume](https://d3epheqghktydj.cloudfront.net/parse-resumes-into-structured-data-using-input3-john-kumar-messyresume-12efbcc7cceb.pdf) *Screenshot — Messy resume used to test the parser's resilience to weak structure.* **What worked:** - OpenResume could read email, LinkedIn, summary, work experience, education, and categorized skills on the clean resume, and it preserved some of the messy resume's text for manual inspection. **Where it struggled:** - Name and phone failed on the clean file, GPA landed in the wrong field, the multi-column resume caused company/job-title mismatches, the messy resume broke education and job-title extraction, and there is no JSON export or API fit. **What came out:** ![OpenResume output showing Parsed structured output](https://d3epheqghktydj.cloudfront.net/parse-resumes-into-structured-data-using-o1-name-empty-a76b7c79fa7e.png) *Output — The clean resume's name field was empty even though the name and title were present in the source text.* ![OpenResume output showing Parsed structured output](https://d3epheqghktydj.cloudfront.net/parse-resumes-into-structured-data-using-o2-phone-empty-9d357c7ef89d.png) *Output — The clean resume's phone field stayed blank because the parser did not match the Indian phone format.* ![OpenResume output showing Parsed structured output](https://d3epheqghktydj.cloudfront.net/parse-resumes-into-structured-data-using-o3-gpa-in-date-field-50e69ddabe2d.png) *Output — The clean resume's CGPA text was shoved into the Date field while the GPA field itself stayed empty.* ![OpenResume output showing Parsed structured output](https://d3epheqghktydj.cloudfront.net/parse-resumes-into-structured-data-using-o4-summary-wrong-1197c353ecbe.png) *Output — The multi-column resume's summary field was populated with the job-title headline rather than an actual summary.* ![OpenResume output showing Parsed structured output](https://d3epheqghktydj.cloudfront.net/parse-resumes-into-structured-data-using-o5-gpa-priya-4a208843b703.png) *Output — The multi-column resume again placed CGPA text inside the Date field instead of returning a clean grade value.* ![OpenResume output showing Parsed structured output](https://d3epheqghktydj.cloudfront.net/parse-resumes-into-structured-data-using-o6-company-jobtitle-mismatch-03145f230bed.png) *Output — The multi-column resume collapsed company and job title into the same wrong text value.* ![OpenResume output showing Parsed structured output](https://d3epheqghktydj.cloudfront.net/parse-resumes-into-structured-data-using-o7-education-failed-9f9f7dee6cc7.png) *Output — The messy resume's education section failed badly, leaving School and Degree blank and misplacing the degree line into Date.* ![OpenResume output showing Parsed structured output](https://d3epheqghktydj.cloudfront.net/parse-resumes-into-structured-data-using-o8-company-wrong-e3e7299ec5d3.png) *Output — The messy resume filled the Company field with a bullet-point description instead of an employer name.* ![OpenResume output showing Parsed structured output](https://d3epheqghktydj.cloudfront.net/parse-resumes-into-structured-data-using-o9-jobtitle-empty-464540356fcf.png) *Output — The messy resume left the Job Title field empty for the experience entry that should have been parsed.* ## Evidence (first-party, tested) *152 tested cells · 96/152 artifact-verified. Cite a cell by its Evidence ID, e.g. `ev:affinda·multi-column-sidebar-resume-priya-sharma·accuracy`.* | Tool | Criterion | Scenario | Verdict | Proof | Evidence ID | | --- | --- | --- | --- | --- | --- | | Affinda | Accuracy | Multi-column sidebar resume — Priya Sharma | ✗ failed | 🧾 [proof](https://d3epheqghktydj.cloudfront.net/affinda-image-7-dc9ad2fa8739.png) | `ev:affinda·multi-column-sidebar-resume-priya-sharma·accuracy` | | Affinda | Accuracy | Clean single-column resume — Rugved Nichite | ◐ mixed | 🧾 [proof](https://d3epheqghktydj.cloudfront.net/affinda-image-17-ddbc40addae5.png) | `ev:affinda·clean-single-column-resume-rugved-nichite·accuracy` | | Affinda | Accuracy | Messy real-world resume — John Kumar | ✗ failed | 🧾 [proof](https://d3epheqghktydj.cloudfront.net/affinda-image-10-d6a62fc24445.png) | `ev:affinda·messy-real-world-resume-john-kumar·accuracy` | | Affinda | Accuracy | cross-scenario | ⚠ struggled | 👁 observed | `ev:affinda·cross·accuracy` | | Affinda | Custom field support | cross-scenario | ✓ worked | 🧾 [proof](https://d3epheqghktydj.cloudfront.net/affinda-image-3-0cd2a17ae277.png) | `ev:affinda·cross·custom-field-support` | | Affinda | Export format | cross-scenario | ✓ worked | 🧾 [proof](https://d3epheqghktydj.cloudfront.net/research-media-json-output-1-4b8efc393b4a.txt) | `ev:affinda·cross·export-format` | | Affinda | Field coverage | Clean single-column resume — Rugved Nichite | ✓ worked | 🧾 [proof](https://d3epheqghktydj.cloudfront.net/research-media-json-output-1-4b8efc393b4a.txt) | `ev:affinda·clean-single-column-resume-rugved-nichite·field-coverage` | | Affinda | Input handling | cross-scenario | ✓ worked | 👁 observed | `ev:affinda·cross·input-handling` | | Affinda | Messy resume handling | Messy real-world resume — John Kumar | ✓ worked | 🧾 [proof](https://d3epheqghktydj.cloudfront.net/affinda-image-10-d6a62fc24445.png) | `ev:affinda·messy-real-world-resume-john-kumar·messy-resume-handling` | | Affinda | Multi-column handling | Multi-column sidebar resume — Priya Sharma | ✓ worked | 🧾 [proof](https://d3epheqghktydj.cloudfront.net/affinda-image-15-c1c7f2ce6aca.png) | `ev:affinda·multi-column-sidebar-resume-priya-sharma·multi-column-handling` | | Affinda | Noise in output | Multi-column sidebar resume — Priya Sharma | ✗ failed | 🧾 [proof](https://d3epheqghktydj.cloudfront.net/affinda-image-8-49ba3c23c23d.png) | `ev:affinda·multi-column-sidebar-resume-priya-sharma·noise-in-output` | | Affinda | Noise in output | Clean single-column resume — Rugved Nichite | ⚠ struggled | 🧾 [proof](https://d3epheqghktydj.cloudfront.net/affinda-image-17-ddbc40addae5.png) | `ev:affinda·clean-single-column-resume-rugved-nichite·noise-in-output` | | Affinda | Noise in output | Messy real-world resume — John Kumar | ✗ failed | 🧾 [proof](https://d3epheqghktydj.cloudfront.net/affinda-image-10-d6a62fc24445.png) | `ev:affinda·messy-real-world-resume-john-kumar·noise-in-output` | | Affinda | Noise in output | cross-scenario | ✗ failed | 👁 observed | `ev:affinda·cross·noise-in-output` | | Affinda | Output format | cross-scenario | ✓ worked | 🧾 [proof](https://d3epheqghktydj.cloudfront.net/research-media-json-output-1-4b8efc393b4a.txt) | `ev:affinda·cross·output-format` | | Airparser | Accuracy | Clean single-column resume — Rugved Nichite | ✗ failed | 🧾 [proof](https://d3epheqghktydj.cloudfront.net/airparser-image-2-5652d1899ce8.png) | `ev:airparser·clean-single-column-resume-rugved-nichite·accuracy` | | Airparser | Accuracy | Messy real-world resume — John Kumar | ◐ mixed | 🧾 [proof](https://d3epheqghktydj.cloudfront.net/airparser-image-8-0e184cd31272.png) | `ev:airparser·messy-real-world-resume-john-kumar·accuracy` | | Airparser | Accuracy | cross-scenario | ◐ mixed | 👁 observed | `ev:airparser·cross·accuracy` | | Airparser | Field coverage | Clean single-column resume — Rugved Nichite | ✓ worked | 🧾 [proof](https://d3epheqghktydj.cloudfront.net/airparser-image-c3584f208d30.png) | `ev:airparser·clean-single-column-resume-rugved-nichite·field-coverage` | | Airparser | Field coverage | Multi-column sidebar resume — Priya Sharma | ✓ worked | 🧾 [proof](https://d3epheqghktydj.cloudfront.net/airparser-image-4-aac909c1959d.png) | `ev:airparser·multi-column-sidebar-resume-priya-sharma·field-coverage` | | Airparser | Field coverage | cross-scenario | ✓ worked | 👁 observed | `ev:airparser·cross·field-coverage` | | Airparser | Input handling | cross-scenario | ✓ worked | 👁 observed | `ev:airparser·cross·input-handling` | | Airparser | Messy resume handling | Messy real-world resume — John Kumar | ✓ worked | 🧾 [proof](https://d3epheqghktydj.cloudfront.net/airparser-image-6-cefe3ba8049e.png) | `ev:airparser·messy-real-world-resume-john-kumar·messy-resume-handling` | | Airparser | Multi-column handling | Multi-column sidebar resume — Priya Sharma | ◐ mixed | 🧾 [proof](https://d3epheqghktydj.cloudfront.net/airparser-image-4-aac909c1959d.png) | `ev:airparser·multi-column-sidebar-resume-priya-sharma·multi-column-handling` | | Airparser | Output format | cross-scenario | ✓ worked | 🧾 [proof](https://d3epheqghktydj.cloudfront.net/airparser-airparser-1-output-566ff479b5bf.txt) | `ev:airparser·cross·output-format` | | Airparser | Output format | Messy real-world resume — John Kumar | ◐ mixed | 🧾 [proof](https://d3epheqghktydj.cloudfront.net/airparser-image-7-43885cfb8772.png) | `ev:airparser·messy-real-world-resume-john-kumar·output-format` | | CVParserPro | Accuracy | Multi-column sidebar resume — Priya Sharma | ✗ failed | 🧾 [proof](https://d3epheqghktydj.cloudfront.net/cvparserpro-cvparserpro-task2-experience-2yrs-2a7cc173c5c7.png) | `ev:cvparserpro·multi-column-sidebar-resume-priya-sharma·accuracy` | | CVParserPro | Accuracy | Clean single-column resume — Rugved Nichite | ✗ failed | 🧾 [proof](https://d3epheqghktydj.cloudfront.net/cvparserpro-cvparserpro-task1-experience-11yrs-26ebfa1895f3.png) | `ev:cvparserpro·clean-single-column-resume-rugved-nichite·accuracy` | | CVParserPro | Accuracy | cross-scenario | ◐ mixed | 👁 observed | `ev:cvparserpro·cross·accuracy` | | CVParserPro | Custom field support | cross-scenario | ✗ failed | 👁 observed | `ev:cvparserpro·cross·custom-field-support` | | CVParserPro | Export format | cross-scenario | ✓ worked | 👁 observed | `ev:cvparserpro·cross·export-format` | | CVParserPro | Field coverage | Clean single-column resume — Rugved Nichite | ◐ mixed | 🧾 [proof](https://d3epheqghktydj.cloudfront.net/cvparserpro-cvparserpro-task1-cgpa-missing-f318f513ac53.png) | `ev:cvparserpro·clean-single-column-resume-rugved-nichite·field-coverage` | | CVParserPro | Field coverage | Messy real-world resume — John Kumar | ⚠ struggled | 👁 observed | `ev:cvparserpro·messy-real-world-resume-john-kumar·field-coverage` | | CVParserPro | Free tier viability | cross-scenario | ⚠ struggled | 👁 observed | `ev:cvparserpro·cross·free-tier-viability` | | CVParserPro | Input handling | cross-scenario | ✓ worked | 👁 observed | `ev:cvparserpro·cross·input-handling` | | CVParserPro | Multi-column handling | Multi-column sidebar resume — Priya Sharma | ✓ worked | 👁 observed | `ev:cvparserpro·multi-column-sidebar-resume-priya-sharma·multi-column-handling` | | CVParserPro | Noise in output | cross-scenario | ✗ failed | 👁 observed | `ev:cvparserpro·cross·noise-in-output` | | CVParserPro | Noise in output | Multi-column sidebar resume — Priya Sharma | ✗ failed | 🧾 [proof](https://d3epheqghktydj.cloudfront.net/cvparserpro-cvparserpro-task2-dates-hallucinated-ef866d2a8f65.png) | `ev:cvparserpro·multi-column-sidebar-resume-priya-sharma·noise-in-output` | | CVParserPro | Output format | cross-scenario | ◐ mixed | 👁 observed | `ev:cvparserpro·cross·output-format` | | Extracta.ai | Accuracy | Multi-column sidebar resume — Priya Sharma | ◐ mixed | 🧾 [proof](https://d3epheqghktydj.cloudfront.net/extracta-ai-image-5-aa9cc0c96107.png) | `ev:extracta-labs·multi-column-sidebar-resume-priya-sharma·accuracy` | | Extracta.ai | Accuracy | Clean single-column resume — Rugved Nichite | ✓ worked | 🧾 [proof](https://d3epheqghktydj.cloudfront.net/extracta-ai-image-5-aa9cc0c96107.png) | `ev:extracta-labs·clean-single-column-resume-rugved-nichite·accuracy` | | Extracta.ai | Accuracy | cross-scenario | ◐ mixed | 👁 observed | `ev:extracta-labs·cross·accuracy` | | Extracta.ai | Custom field support | cross-scenario | ✓ worked | 🧾 [proof](https://d3epheqghktydj.cloudfront.net/extracta-ai-image-b5f6862962fa.png) | `ev:extracta-labs·cross·custom-field-support` | | Extracta.ai | Export format | cross-scenario | ✓ worked | 🧾 [proof](https://d3epheqghktydj.cloudfront.net/extracta-ai-extracta-ai-output-1-a01c085fbe66.txt) | `ev:extracta-labs·cross·export-format` | | Extracta.ai | Field coverage | Clean single-column resume — Rugved Nichite | ✓ worked | 🧾 [proof](https://d3epheqghktydj.cloudfront.net/extracta-ai-screenshot-2026-05-05-124028-cbdba62c2569.png) | `ev:extracta-labs·clean-single-column-resume-rugved-nichite·field-coverage` | | Extracta.ai | Input handling | cross-scenario | ✓ worked | 🧾 [proof](https://d3epheqghktydj.cloudfront.net/extracta-ai-extracta-ai-output-1-a01c085fbe66.txt) | `ev:extracta-labs·cross·input-handling` | | Extracta.ai | Messy resume handling | Messy real-world resume — John Kumar | ◐ mixed | 🧾 [proof](https://d3epheqghktydj.cloudfront.net/extracta-ai-screenshot-2026-05-05-124544-174ecd83f60c.png) | `ev:extracta-labs·messy-real-world-resume-john-kumar·messy-resume-handling` | | Extracta.ai | Multi-column handling | Multi-column sidebar resume — Priya Sharma | ✓ worked | 🧾 [proof](https://d3epheqghktydj.cloudfront.net/extracta-ai-image-5-aa9cc0c96107.png) | `ev:extracta-labs·multi-column-sidebar-resume-priya-sharma·multi-column-handling` | | Extracta.ai | Noise in output | cross-scenario | ✓ worked | 🧾 [proof](https://d3epheqghktydj.cloudfront.net/extracta-ai-extracta-ai-output-1-a01c085fbe66.txt) | `ev:extracta-labs·cross·noise-in-output` | | Extracta.ai | Output format | cross-scenario | ✓ worked | 🧾 [proof](https://d3epheqghktydj.cloudfront.net/extracta-ai-extracta-ai-output-1-a01c085fbe66.txt) | `ev:extracta-labs·cross·output-format` | | Hireability | Accuracy | Messy real-world resume — John Kumar | ✗ failed | 🧾 [proof](https://d3epheqghktydj.cloudfront.net/hireability-hireability-task3-employer-name-merged-m-85d6c25840b0.png) | `ev:hireability·messy-real-world-resume-john-kumar·accuracy` | | Hireability | Accuracy | Clean single-column resume — Rugved Nichite | ✗ failed | 🧾 [proof](https://d3epheqghktydj.cloudfront.net/hireability-hireability-task1-name-split-dev-loper-77c127014a1c.png) | `ev:hireability·clean-single-column-resume-rugved-nichite·accuracy` | | Hireability | Accuracy | cross-scenario | ✗ failed | 👁 observed | `ev:hireability·cross·accuracy` | | Hireability | Custom field support | Clean single-column resume — Rugved Nichite | ⚠ struggled | 🧾 [proof](https://d3epheqghktydj.cloudfront.net/hireability-hireability-task1-categorized-skills-not-953637385832.png) | `ev:hireability·clean-single-column-resume-rugved-nichite·custom-field-support` | | Hireability | Custom field support | cross-scenario | ✓ worked | 👁 observed | `ev:hireability·cross·custom-field-support` | | Hireability | Export format | cross-scenario | ✓ worked | 🧾 [proof](https://d3epheqghktydj.cloudfront.net/hireability-image-5-ac69b4ff1dd6.png) | `ev:hireability·cross·export-format` | | Hireability | Field coverage | Clean single-column resume — Rugved Nichite | ✓ worked | 👁 observed | `ev:hireability·clean-single-column-resume-rugved-nichite·field-coverage` | | Hireability | Field coverage | Multi-column sidebar resume — Priya Sharma | ✗ failed | 🧾 [proof](https://d3epheqghktydj.cloudfront.net/hireability-hireability-task2-contact-fields-missing-b3b54962f8fc.png) | `ev:hireability·multi-column-sidebar-resume-priya-sharma·field-coverage` | | Hireability | Field coverage | Messy real-world resume — John Kumar | ✗ failed | 🧾 [proof](https://d3epheqghktydj.cloudfront.net/hireability-hireability-task3-education-entries-miss-26097fa84061.png) | `ev:hireability·messy-real-world-resume-john-kumar·field-coverage` | | Hireability | Field coverage | cross-scenario | ◐ mixed | 👁 observed | `ev:hireability·cross·field-coverage` | | Hireability | Free tier viability | cross-scenario | ✓ worked | 👁 observed | `ev:hireability·cross·free-tier-viability` | | Hireability | Input handling | Multi-column sidebar resume — Priya Sharma | ✓ worked | 👁 observed | `ev:hireability·multi-column-sidebar-resume-priya-sharma·input-handling` | | Hireability | Multi-column handling | Multi-column sidebar resume — Priya Sharma | ✗ failed | 🧾 [proof](https://d3epheqghktydj.cloudfront.net/hireability-hireability-task2-job-order-misclassific-e8f4531332a1.png) | `ev:hireability·multi-column-sidebar-resume-priya-sharma·multi-column-handling` | | Hireability | Noise in output | Messy real-world resume — John Kumar | ✗ failed | 🧾 [proof](https://d3epheqghktydj.cloudfront.net/hireability-hireability-task3-certs-refs-merged-mock-c80cee78a881.png) | `ev:hireability·messy-real-world-resume-john-kumar·noise-in-output` | | Hireability | Noise in output | Clean single-column resume — Rugved Nichite | ✗ failed | 🧾 [proof](https://d3epheqghktydj.cloudfront.net/hireability-hireability-task1-competency-beginner-no-d21b6ddafcdb.png) | `ev:hireability·clean-single-column-resume-rugved-nichite·noise-in-output` | | Hireability | Noise in output | Multi-column sidebar resume — Priya Sharma | ✗ failed | 🧾 [proof](https://d3epheqghktydj.cloudfront.net/hireability-hireability-task2-competency-levels-blan-845c00e10224.png) | `ev:hireability·multi-column-sidebar-resume-priya-sharma·noise-in-output` | | Hireability | Noise in output | cross-scenario | ✗ failed | 👁 observed | `ev:hireability·cross·noise-in-output` | | Hireability | Output format | cross-scenario | ✓ worked | 🧾 [proof](https://d3epheqghktydj.cloudfront.net/hireability-image-7-c8fd67a0f60c.png) | `ev:hireability·cross·output-format` | | HrFlow | Accuracy | Clean single-column resume — Rugved Nichite | ◐ mixed | 🧾 [proof](https://d3epheqghktydj.cloudfront.net/hrflow-image-9-b8fa7c0d0bb8.png) | `ev:hrflow·clean-single-column-resume-rugved-nichite·accuracy` | | HrFlow | Accuracy | Multi-column sidebar resume — Priya Sharma | ◐ mixed | 🧾 [proof](https://d3epheqghktydj.cloudfront.net/hrflow-image-9-b8fa7c0d0bb8.png) | `ev:hrflow·multi-column-sidebar-resume-priya-sharma·accuracy` | | HrFlow | Accuracy | Messy real-world resume — John Kumar | ⚠ struggled | 👁 observed | `ev:hrflow·messy-real-world-resume-john-kumar·accuracy` | | HrFlow | Accuracy | cross-scenario | ◐ mixed | 👁 observed | `ev:hrflow·cross·accuracy` | | HrFlow | Custom field support | cross-scenario | ✗ failed | 👁 observed | `ev:hrflow·cross·custom-field-support` | | HrFlow | Field coverage | Multi-column sidebar resume — Priya Sharma | ✓ worked | 👁 observed | `ev:hrflow·multi-column-sidebar-resume-priya-sharma·field-coverage` | | HrFlow | Field coverage | Clean single-column resume — Rugved Nichite | ✓ worked | 🧾 [proof](https://d3epheqghktydj.cloudfront.net/hrflow-hrflow-output-1-9f17ceb5aef8.txt) | `ev:hrflow·clean-single-column-resume-rugved-nichite·field-coverage` | | HrFlow | Field coverage | cross-scenario | ◐ mixed | 👁 observed | `ev:hrflow·cross·field-coverage` | | HrFlow | Input handling | cross-scenario | ✓ worked | 👁 observed | `ev:hrflow·cross·input-handling` | | HrFlow | Messy resume handling | Messy real-world resume — John Kumar | ◐ mixed | 👁 observed | `ev:hrflow·messy-real-world-resume-john-kumar·messy-resume-handling` | | HrFlow | Multi-column handling | Multi-column sidebar resume — Priya Sharma | ✓ worked | 🧾 [proof](https://d3epheqghktydj.cloudfront.net/hrflow-image-9-b8fa7c0d0bb8.png) | `ev:hrflow·multi-column-sidebar-resume-priya-sharma·multi-column-handling` | | HrFlow | Noise in output | Messy real-world resume — John Kumar | ◐ mixed | 👁 observed | `ev:hrflow·messy-real-world-resume-john-kumar·noise-in-output` | | HrFlow | Noise in output | Clean single-column resume — Rugved Nichite | ◐ mixed | 🧾 [proof](https://d3epheqghktydj.cloudfront.net/hrflow-image-9-b8fa7c0d0bb8.png) | `ev:hrflow·clean-single-column-resume-rugved-nichite·noise-in-output` | | HrFlow | Noise in output | Multi-column sidebar resume — Priya Sharma | ◐ mixed | 🧾 [proof](https://d3epheqghktydj.cloudfront.net/hrflow-image-9-b8fa7c0d0bb8.png) | `ev:hrflow·multi-column-sidebar-resume-priya-sharma·noise-in-output` | | HrFlow | Noise in output | cross-scenario | ✗ failed | 👁 observed | `ev:hrflow·cross·noise-in-output` | | HrFlow | Output format | cross-scenario | ✓ worked | 👁 observed | `ev:hrflow·cross·output-format` | | LlamaParse | Accuracy | Clean single-column resume — Rugved Nichite | ⚠ struggled | 🧾 [proof](https://d3epheqghktydj.cloudfront.net/llamaparse-image-3-ddd2752b9f60.png) | `ev:llamaparse·clean-single-column-resume-rugved-nichite·accuracy` | | LlamaParse | Accuracy | Messy real-world resume — John Kumar | ⚠ struggled | 🧾 [proof](https://d3epheqghktydj.cloudfront.net/llamaparse-image-11-a64cab3d3997.png) | `ev:llamaparse·messy-real-world-resume-john-kumar·accuracy` | | LlamaParse | Accuracy | Multi-column sidebar resume — Priya Sharma | ⚠ struggled | 🧾 [proof](https://d3epheqghktydj.cloudfront.net/llamaparse-image-6-86b8b2ac1a91.png) | `ev:llamaparse·multi-column-sidebar-resume-priya-sharma·accuracy` | | LlamaParse | Accuracy | cross-scenario | ⚠ struggled | 🧾 [proof](https://d3epheqghktydj.cloudfront.net/llamaparse-image-9-5135e1c903e9.png) | `ev:llamaparse·cross·accuracy` | | LlamaParse | Custom field support | cross-scenario | ✓ worked | 👁 observed | `ev:llamaparse·cross·custom-field-support` | | LlamaParse | Extraction Accuracy | Invoice PDF | ✓ worked | 🧾 [proof](https://d3epheqghktydj.cloudfront.net/research-media-llamaparse-invoice-summary-9c05de684d8a.png) | `ev:llamaparse·invoice-pdf·extraction-accuracy` | | LlamaParse | Extraction Accuracy | cross-scenario | ✓ worked | 👁 observed | `ev:llamaparse·cross·extraction-accuracy` | | LlamaParse | Extraction Accuracy | Bank Statement PDF | ✗ failed | 🧾 [proof](https://d3epheqghktydj.cloudfront.net/research-media-llamaparse-bank-statement-16-jul-value-d-4906fee56b7b.png) | `ev:llamaparse·bank-statement-pdf·extraction-accuracy` | | LlamaParse | Field coverage | Messy real-world resume — John Kumar | ✓ worked | 👁 observed | `ev:llamaparse·messy-real-world-resume-john-kumar·field-coverage` | | LlamaParse | Field coverage | Multi-column sidebar resume — Priya Sharma | ✓ worked | 👁 observed | `ev:llamaparse·multi-column-sidebar-resume-priya-sharma·field-coverage` | | LlamaParse | Field coverage | cross-scenario | ✓ worked | 👁 observed | `ev:llamaparse·cross·field-coverage` | | LlamaParse | Free tier viability | cross-scenario | ✓ worked | 🧾 [proof](https://d3epheqghktydj.cloudfront.net/llamaparse-image-54afcf4e20d2.png) | `ev:llamaparse·cross·free-tier-viability` | | LlamaParse | Input handling | cross-scenario | ✓ worked | 👁 observed | `ev:llamaparse·cross·input-handling` | | LlamaParse | Messy resume handling | Messy real-world resume — John Kumar | ✓ worked | 🧾 [proof](https://d3epheqghktydj.cloudfront.net/llamaparse-image-7-180f1deae78b.png) | `ev:llamaparse·messy-real-world-resume-john-kumar·messy-resume-handling` | | LlamaParse | Multi-column handling | Multi-column sidebar resume — Priya Sharma | ✓ worked | 🧾 [proof](https://d3epheqghktydj.cloudfront.net/llamaparse-image-15-e8ac563d751d.png) | `ev:llamaparse·multi-column-sidebar-resume-priya-sharma·multi-column-handling` | | LlamaParse | Output format | cross-scenario | ✓ worked | 👁 observed | `ev:llamaparse·cross·output-format` | | LlamaParse | Schema Adherence | Invoice PDF | ✓ worked | 🧾 [proof](https://d3epheqghktydj.cloudfront.net/research-media-llamaparse-invoice-metadata-af804b493598.png) | `ev:llamaparse·invoice-pdf·schema-adherence` | | LlamaParse | Schema Adherence | cross-scenario | ✓ worked | 🧾 [proof](https://cdn.futuresmart.ai/public/aidemos/85953a3b02bd40a5a4ba50666d72878a.mp4?v=1) | `ev:llamaparse·cross·schema-adherence` | | LlamaParse | Schema Adherence | Bank Statement PDF | ✓ worked | 🧾 [proof](https://d3epheqghktydj.cloudfront.net/research-media-llamaparse-bank-statement-extracted-deta-1c069bb9dc7a.png) | `ev:llamaparse·bank-statement-pdf·schema-adherence` | | LlamaParse | Semantic Field Enrichment | Invoice PDF | ✓ worked | 🧾 [proof](https://d3epheqghktydj.cloudfront.net/research-media-llamaparse-invoice-extracted-line-item-2-f4ecd3c8fd80.png) | `ev:llamaparse·invoice-pdf·semantic-field-enrichment` | | LlamaParse | Semantic Field Enrichment | Bank Statement PDF | ✗ failed | 🧾 [proof](https://d3epheqghktydj.cloudfront.net/research-media-llamaparse-bank-statement-transaction-id-c01a0d30b3be.png) | `ev:llamaparse·bank-statement-pdf·semantic-field-enrichment` | | LlamaParse | Structural Clean Output | cross-scenario | ✓ worked | 🧾 [proof](https://d3epheqghktydj.cloudfront.net/research-media-llama-extract-output-1-790fdeaa33c5.json) | `ev:llamaparse·cross·structural-clean-output` | | LlamaParse | Table & Record Completeness | Invoice PDF | ✓ worked | 🧾 [proof](https://d3epheqghktydj.cloudfront.net/research-media-llamaparse-invoice-extracted-line-items-eb4fd58a2160.png) | `ev:llamaparse·invoice-pdf·table-record-completeness` | | LlamaParse | Table & Record Completeness | Bank Statement PDF | ✗ failed | 🧾 [proof](https://d3epheqghktydj.cloudfront.net/research-media-llamaparse-bank-statement-transaction-co-ea2cee32bed3.png) | `ev:llamaparse·bank-statement-pdf·table-record-completeness` | | LlamaParse | Table & Record Completeness | Bank Statement PDF | ✗ failed | 🧾 [proof](https://d3epheqghktydj.cloudfront.net/research-media-llamaparse-bank-statement-transaction-co-ea2cee32bed3.png) | `ev:llamaparse·bank-statement-pdf·table-and-record-completeness` | | LlamaParse | Table & Record Completeness | Invoice PDF | ◐ mixed | 🧾 [proof](https://d3epheqghktydj.cloudfront.net/research-media-llamaparse-invoice-extracted-line-item-8-ddd5553310ea.png) | `ev:llamaparse·invoice-pdf·table-and-record-completeness` | | OpenResume | Accuracy | Clean single-column resume — Rugved Nichite | ✗ failed | 🧾 [proof](https://d3epheqghktydj.cloudfront.net/openresume-o3-gpa-in-date-field-50e69ddabe2d.png) | `ev:openresume·clean-single-column-resume-rugved-nichite·accuracy` | | OpenResume | Accuracy | Multi-column sidebar resume — Priya Sharma | ◐ mixed | 🧾 [proof](https://d3epheqghktydj.cloudfront.net/openresume-o4-summary-wrong-1197c353ecbe.png) | `ev:openresume·multi-column-sidebar-resume-priya-sharma·accuracy` | | OpenResume | Accuracy | cross-scenario | ✗ failed | 👁 observed | `ev:openresume·cross·accuracy` | | OpenResume | Accuracy | Messy real-world resume — John Kumar | ◐ mixed | 👁 observed | `ev:openresume·messy-real-world-resume-john-kumar·accuracy` | | OpenResume | Custom field support | cross-scenario | ✗ failed | 👁 observed | `ev:openresume·cross·custom-field-support` | | OpenResume | Export format | cross-scenario | ✗ failed | 👁 observed | `ev:openresume·cross·export-format` | | OpenResume | Field coverage | cross-scenario | ✗ failed | 👁 observed | `ev:openresume·cross·field-coverage` | | OpenResume | Field coverage | Clean single-column resume — Rugved Nichite | ✗ failed | 🧾 [proof](https://d3epheqghktydj.cloudfront.net/openresume-o2-phone-empty-9d357c7ef89d.png) | `ev:openresume·clean-single-column-resume-rugved-nichite·field-coverage` | | OpenResume | Free tier viability | cross-scenario | ✓ worked | 🧾 [proof](https://d3epheqghktydj.cloudfront.net/openresume-openresume-tool-demo-video-ee4677fc4171.mp4) | `ev:openresume·cross·free-tier-viability` | | OpenResume | Input handling | cross-scenario | ✓ worked | 👁 observed | `ev:openresume·cross·input-handling` | | OpenResume | Messy resume handling | Messy real-world resume — John Kumar | ✗ failed | 🧾 [proof](https://d3epheqghktydj.cloudfront.net/openresume-o9-jobtitle-empty-464540356fcf.png) | `ev:openresume·messy-real-world-resume-john-kumar·messy-resume-handling` | | OpenResume | Messy resume handling | cross-scenario | ✗ failed | 👁 observed | `ev:openresume·cross·messy-resume-handling` | | OpenResume | Multi-column handling | Multi-column sidebar resume — Priya Sharma | ✗ failed | 🧾 [proof](https://d3epheqghktydj.cloudfront.net/openresume-o6-company-jobtitle-mismatch-03145f230bed.png) | `ev:openresume·multi-column-sidebar-resume-priya-sharma·multi-column-handling` | | OpenResume | Output format | cross-scenario | ✗ failed | 👁 observed | `ev:openresume·cross·output-format` | | Parseur | Accuracy | Multi-column sidebar resume — Priya Sharma | ✓ worked | 🧾 [proof](https://d3epheqghktydj.cloudfront.net/parseur-image-3-726e4e3fba8c.png) | `ev:parseur·multi-column-sidebar-resume-priya-sharma·accuracy` | | Parseur | Accuracy | Clean single-column resume — Rugved Nichite | ✓ worked | 🧾 [proof](https://d3epheqghktydj.cloudfront.net/parseur-image-7-c5a350a2e9fe.png) | `ev:parseur·clean-single-column-resume-rugved-nichite·accuracy` | | Parseur | Accuracy | Messy real-world resume — John Kumar | ✓ worked | 🧾 [proof](https://d3epheqghktydj.cloudfront.net/parseur-image-4-a76ecb3d1154.png) | `ev:parseur·messy-real-world-resume-john-kumar·accuracy` | | Parseur | Accuracy | cross-scenario | ◐ mixed | 👁 observed | `ev:parseur·cross·accuracy` | | Parseur | Custom field support | cross-scenario | ✓ worked | 🧾 [proof](https://d3epheqghktydj.cloudfront.net/parseur-parseur-task1-template-setup-cbce417ccafc.png) | `ev:parseur·cross·custom-field-support` | | Parseur | Export format | cross-scenario | ✓ worked | 🧾 [proof](https://d3epheqghktydj.cloudfront.net/parseur-parseur-task1-export-formats-488f44e5242e.png) | `ev:parseur·cross·export-format` | | Parseur | Field coverage | Multi-column sidebar resume — Priya Sharma | ◐ mixed | 🧾 [proof](https://d3epheqghktydj.cloudfront.net/parseur-pa4-cgpa-not-in-template-0842b8e5acd1.png) | `ev:parseur·multi-column-sidebar-resume-priya-sharma·field-coverage` | | Parseur | Field coverage | Clean single-column resume — Rugved Nichite | ✓ worked | 🧾 [proof](https://d3epheqghktydj.cloudfront.net/parseur-image-7-c5a350a2e9fe.png) | `ev:parseur·clean-single-column-resume-rugved-nichite·field-coverage` | | Parseur | Field coverage | Messy real-world resume — John Kumar | ◐ mixed | 🧾 [proof](https://d3epheqghktydj.cloudfront.net/parseur-parseur-task3-one-education-mock-ccafe2d4a20d.png) | `ev:parseur·messy-real-world-resume-john-kumar·field-coverage` | | Parseur | Field coverage | cross-scenario | ◐ mixed | 👁 observed | `ev:parseur·cross·field-coverage` | | Parseur | Free tier viability | cross-scenario | ✓ worked | 🧾 [proof](https://d3epheqghktydj.cloudfront.net/parseur-parseur-task2-cgpa-missing-cd54d02758dd.png) | `ev:parseur·cross·free-tier-viability` | | Parseur | Input handling | cross-scenario | ◐ mixed | 🧾 [proof](https://d3epheqghktydj.cloudfront.net/parseur-parseur-task1-template-setup-cbce417ccafc.png) | `ev:parseur·cross·input-handling` | | Parseur | Messy resume handling | Messy real-world resume — John Kumar | ✓ worked | 🧾 [proof](https://d3epheqghktydj.cloudfront.net/parseur-image-4-a76ecb3d1154.png) | `ev:parseur·messy-real-world-resume-john-kumar·messy-resume-handling` | | Parseur | Multi-column handling | Multi-column sidebar resume — Priya Sharma | ✓ worked | 🧾 [proof](https://d3epheqghktydj.cloudfront.net/parseur-image-3-726e4e3fba8c.png) | `ev:parseur·multi-column-sidebar-resume-priya-sharma·multi-column-handling` | | Skima AI | Accuracy | Clean single-column resume — Rugved Nichite | ◐ mixed | 🧾 [proof](https://d3epheqghktydj.cloudfront.net/skima-ai-01-input1-gpa-certs-missing-c59774f5e448.png) | `ev:skima-ai·clean-single-column-resume-rugved-nichite·accuracy` | | Skima AI | Accuracy | cross-scenario | ◐ mixed | 👁 observed | `ev:skima-ai·cross·accuracy` | | Skima AI | Custom field support | cross-scenario | ✗ failed | 👁 observed | `ev:skima-ai·cross·custom-field-support` | | Skima AI | Field coverage | Messy real-world resume — John Kumar | ✓ worked | 👁 observed | `ev:skima-ai·messy-real-world-resume-john-kumar·field-coverage` | | Skima AI | Field coverage | Clean single-column resume — Rugved Nichite | ✓ worked | 🧾 [proof](https://d3epheqghktydj.cloudfront.net/skima-ai-image-4-d3d76b30dad1.png) | `ev:skima-ai·clean-single-column-resume-rugved-nichite·field-coverage` | | Skima AI | Field coverage | cross-scenario | ◐ mixed | 👁 observed | `ev:skima-ai·cross·field-coverage` | | Skima AI | Free tier viability | cross-scenario | ✓ worked | 👁 observed | `ev:skima-ai·cross·free-tier-viability` | | Skima AI | Input handling | cross-scenario | ✓ worked | 🧾 [proof](https://d3epheqghktydj.cloudfront.net/skima-ai-01-input-handling-d64b34a20313.png) | `ev:skima-ai·cross·input-handling` | | Skima AI | Messy resume handling | Messy real-world resume — John Kumar | ✗ failed | 🧾 [proof](https://d3epheqghktydj.cloudfront.net/skima-ai-05-runon-input3-2809394923e0.png) | `ev:skima-ai·messy-real-world-resume-john-kumar·messy-resume-handling` | | Skima AI | Multi-column handling | Multi-column sidebar resume — Priya Sharma | ✗ failed | 🧾 [proof](https://d3epheqghktydj.cloudfront.net/skima-ai-06-input2-sidebar-missing-07290c0a1129.png) | `ev:skima-ai·multi-column-sidebar-resume-priya-sharma·multi-column-handling` | | Skima AI | Noise in output | cross-scenario | ✗ failed | 👁 observed | `ev:skima-ai·cross·noise-in-output` | | Skima AI | Noise in output | Clean single-column resume — Rugved Nichite | ✗ failed | 🧾 [proof](https://d3epheqghktydj.cloudfront.net/skima-ai-02-input1-skills-concatenated-mock-96c354edff51.png) | `ev:skima-ai·clean-single-column-resume-rugved-nichite·noise-in-output` | | Skima AI | Noise in output | Messy real-world resume — John Kumar | ✗ failed | 🧾 [proof](https://d3epheqghktydj.cloudfront.net/skima-ai-09-input3-skills-concatenated-mock-d25303702406.png) | `ev:skima-ai·messy-real-world-resume-john-kumar·noise-in-output` | | Skima AI | Output format | cross-scenario | ✗ failed | 🧾 [proof](https://d3epheqghktydj.cloudfront.net/skima-ai-01-input-handling-d64b34a20313.png) | `ev:skima-ai·cross·output-format` | > 🧾 = artifact-verified (proof captured) · 👁 = observed (noted, no artifact) · verdicts: worked / mixed / struggled / failed. ## Final Take Extracta.ai is the overall winner because it is the only tool that tops all five decisive checks together: Accuracy 4/5, Field coverage 5/5, Messy resume handling 5/5, Multi-column handling 5/5, and Noise in output 5/5. That makes it the cleanest all-around pick for schema-driven resume extraction with consistently tidy JSON. Parseur is the closest practical alternative if you want strong handling of messy resumes and multi-column layouts, and it also keeps output noise low. The trade-off is lower Field coverage (3/5), so it is stronger on the core parsing flow than on broader structured field capture. Affinda has strong structured JSON, custom fields, and layout handling, but its low Accuracy score (2/5) and especially noisy output (1/5) keep it below the top two. HrFlow is a decent middle option for cleaner PDFs, but it drops on harder layouts and noise. CVParserPro and Skima AI both show useful structure in some areas, but their low Accuracy and/or weak output quality make them less dependable overall. Hireability is attractive if JSON/API delivery matters, but its low Field coverage, weak multi-column handling, and noisy output are major limitations. OpenResume stands out mainly for being free and browser-based, but its very low Accuracy, brittle layout handling, and lack of machine-readable export keep it from competing with the stronger parsers. Airparser and LlamaParse are both marked partly tested, so they stay below fully measured tools by policy even though their measured scores look strong in layout resilience and structured extraction. Airparser looks better balanced than LlamaParse on the recorded decisive checks, while LlamaParse is held back by lower Accuracy and weaker input handling. Tested as of July 2026 · re-verified monthly. ## Need a custom AI solution for this use case? If you are looking to build a custom resume parsing, resume extraction, or candidate profile JSON pipeline for your business or internal workflow, email us at [contact@futuresmart.ai](mailto:contact@futuresmart.ai). ### Found something inaccurate or missing? We try to keep our AI research accurate and useful. If you found outdated information, an issue, or have a suggestion, email us at [collaborate@aidemos.com](mailto:collaborate@aidemos.com).