Parse a Resume in Node.js: Async PDF to JSON Tutorial   [ResumeParser.pro](https://resumeparser.pro)

 - [Parsing API](https://resumeparser.pro/resume-parsing-api)
- [Match Score API](https://resumeparser.pro/resume-job-match-score-api)
- [Sample JSON](https://resumeparser.pro/resume-to-json)
- [Guides](https://resumeparser.pro/guides)
- [Glossary](https://resumeparser.pro/glossary)
- [Get API key](https://sharpapi.com/en/resume-parsing-api?utm_source=resumeparser.pro&utm_medium=referral&utm_campaign=parse-resume-nodejs&utm_content=nav)

   1. [Home](https://resumeparser.pro)
2. [Guides](https://resumeparser.pro/guides)
3. Parse a Resume to JSON in Node.js

 Parse a Resume to JSON in Node.js
=================================

Node 18's native fetch and FormData cover the whole integration: no axios, no form-data package, no SDK required (though one exists). Upload, poll, read fields.

Updated 9 August 2026 · by the SharpAPI team

  To parse a resume in Node.js, send the file as multipart form data to the SharpAPI parse\_resume endpoint, then poll the returned status URL until the job reports success. Native fetch handles both calls; the result is 50+ structured candidate fields.

The whole flow, native fetch
----------------------------

  parse-resume.mjs — Node 18+ ```
import { readFile } from 'node:fs/promises';

const API_KEY = process.env.SHARP_API_KEY;
const headers = { Authorization: `Bearer ${API_KEY}` };

// 1. Submit — 202 Accepted + status URL, immediately
const form = new FormData();
form.append('file', new Blob([await readFile('resumes/candidate.pdf')]), 'candidate.pdf');
form.append('language', 'English');

const submit = await fetch('https://sharpapi.com/api/v1/hr/parse_resume', {
    method: 'POST',
    headers,
    body: form,
});
const { status_url } = await submit.json();

// 2. Poll — jobs typically finish in seconds
let job;
do {
    await new Promise((resolve) => setTimeout(resolve, 2000));
    job = await (await fetch(status_url, { headers })).json();
} while (job.data.attributes.status === 'pending');

const candidate = job.data.attributes.result;
console.log(candidate.candidate_name);
candidate.positions.forEach((role) =>
    console.log(`- ${role.position_name} @ ${role.company_name}`),
);
```

Or take the npm package
-----------------------

 @sharpapi/sharpapi-node-parse-resume (built on @sharpapi/sharpapi-node-core) wraps the same flow with rate limiting and typed DTOs — worth it once resume parsing stops being a one-off script.

Typing the response
-------------------

 The schema is deterministic — every parse returns the same structure, with empty values where the document lacks data. That makes TypeScript pleasant: one interface, written once against the [sample payload](https://resumeparser.pro/resume-to-json), describes every response your pipeline will ever see. Start from the [field reference](https://resumeparser.pro/what-fields-does-a-resume-parser-extract).

Production notes
----------------

- **Webhooks over polling.** Register a webhook URL at submission and delete the do-while loop — one Express route receives every result. Mandatory reading before a backfill: [bulk resume parsing](https://resumeparser.pro/guides/bulk-resume-parsing).
- **Scans included.** JPG, PNG and TIFF files go through the identical call — OCR runs server-side.
- **Errors are statuses.** A corrupt or password-protected file resolves to a failed status, not a hang; branch on it and keep the queue moving.

 Parse your first resume today
-----------------------------

Send a PDF, DOCX or photo CV to the SharpAPI Resume Parsing API and get 50+ structured JSON fields back — no models to train, no OCR vendor to add.

 [Start parsing free](https://sharpapi.com/en/resume-parsing-api?utm_source=resumeparser.pro&utm_medium=referral&utm_campaign=parse-resume-nodejs&utm_content=article-end) [Endpoint docs](https://sharpapi.com/documentation?utm_source=resumeparser.pro&utm_medium=referral&utm_campaign=parse-resume-nodejs&utm_content=article-end-docs) 

14-day trial · 100,000 words included · No credit card · 30-day money-back guarantee

 Questions, answered
-------------------

  Is there an npm package for SharpAPI resume parsing?Yes — @sharpapi/sharpapi-node-parse-resume, built on @sharpapi/sharpapi-node-core. Plain fetch with FormData works too; the API is standard multipart REST.

   Which Node.js version do I need?Node 18 or newer gives you native fetch, FormData and Blob — no request libraries needed. Older versions work with undici or form-data packages.

   Can I type the response in TypeScript?Comfortably — the schema is deterministic, so one interface describes every response. Fields the resume lacks come back empty rather than missing, which keeps the types honest.

   Further reading
---------------

- [Parse a Resume in Python: PDF to JSON in Under 30 Lines](https://resumeparser.pro/guides/parse-resume-python) A working Python tutorial: send a PDF resume to a parsing API, poll the async job and read 50+ structured fields — requests-only, no ML setup.
- [Parse a Resume in PHP &amp; Laravel: 2 Packages, 15 Minutes](https://resumeparser.pro/guides/parse-resume-php-laravel) Use the official PHP or Laravel SDK to parse resumes into structured JSON: install, one service call, webhook or polling — full code included.
- [Resume Parsing API — PDF, DOCX &amp; Photo CVs to JSON (80+ Langs)](https://resumeparser.pro/resume-parsing-api) AI resume parsing API: send a PDF, DOCX, RTF, TXT or photo CV, get back 50+ structured JSON fields. 80+ languages, OCR included, async REST, from $50/mo.
- [Resume to JSON — Explore a Real Parsed Output (50+ Fields)](https://resumeparser.pro/resume-to-json) Explore a real resume-to-JSON conversion: every field a production parser extracts, plus a full 20-dimension job match score payload. No signup needed.

    ResumeParser.pro — a free resource on resume parsing and candidate matching, written and maintained by the team behind [SharpAPI](https://sharpapi.com/?utm_source=resumeparser.pro&utm_medium=referral&utm_campaign=parse-resume-nodejs&utm_content=footer). The APIs documented here: [Resume Parsing API](https://sharpapi.com/en/resume-parsing-api?utm_source=resumeparser.pro&utm_medium=referral&utm_campaign=parse-resume-nodejs&utm_content=footer) and [Resume Job Match Score API](https://sharpapi.com/en/resume-job-match-score-api?utm_source=resumeparser.pro&utm_medium=referral&utm_campaign=parse-resume-nodejs&utm_content=footer). SDKs on [GitHub](https://github.com/sharpapi).

 On this site: [What is resume parsing](https://resumeparser.pro/what-is-resume-parsing)·[How parsing works](https://resumeparser.pro/how-does-resume-parsing-work)·[Extracted fields](https://resumeparser.pro/what-fields-does-a-resume-parser-extract)·[Resume to JSON](https://resumeparser.pro/resume-to-json)·[Best parser APIs](https://resumeparser.pro/guides/best-resume-parser-apis)·[All guides](https://resumeparser.pro/guides)·[Glossary](https://resumeparser.pro/glossary)·[About](https://resumeparser.pro/about)

 No cookies, no tracking pixels, no popups. © 2026 [A2Z Web](https://a2zweb.co).

 A Markdown version of this page is available at https://resumeparser.pro/guides/parse-resume-nodejs.md, optimized for AI and LLM tools.
