Let's Build: AI resume parser with Transloadit
Turn a PDF or DOCX resume into a local JSON file with contact details, skills, work experience, and education. This TypeScript example uses Transloadit to convert documents when needed and extract fields with an AI model. You can run it from a fresh directory without this website’s repository, then compare the saved result with your source document.
What we’re building
- Accept one PDF or DOCX resume.
- Convert DOCX to PDF with 🤖 /document/convert.
- Extract fields with 🤖 /ai/chat and save them as JSON.
The example selects anthropic/claude-sonnet-4-6, which supports PDF input through /ai/chat.
It does not accept image files or rank candidates. Schema validation checks the shape of the
response; it does not establish that the extracted information is correct.
Schema first (zod)
The example script exports the schema used both for the
model request and local validation. After downloading the app below, save this as
inspect-schema.ts in your project root and run node inspect-schema.ts:
import { zodToJsonSchema } from 'zod-to-json-schema'
import { resumeSchema } from './resume-parser/run.ts'
const resumeJsonSchema = zodToJsonSchema(resumeSchema)
console.log(JSON.stringify(resumeJsonSchema, null, 2))
All fields are required in the response. Unknown text uses an empty string, and lists without
entries use empty arrays. Besides contact and employment fields, the schema includes summary,
certifications, and links; it does not return confidence scores. An entirely empty extraction
is rejected, but a plausible, incorrect value can still pass validation.
Pipeline overview
PDF resumes ──▶ /ai/chat ──▶ local JSON
DOCX resumes ──▶ /document/convert (pdf) ──▶ /ai/chat ──▶ local JSON
Assembly snippet
To inspect the actual Steps without submitting an
Assembly, save this as inspect-steps.ts in the same
project root and run node inspect-steps.ts:
import { example } from './resume-parser/run.ts'
const steps = example.steps({ test_credentials: true })
console.log(JSON.stringify({ steps }, null, 2))
The recipe filters uploaded PDFs into pdf_verified and converts other accepted documents through
pdf_converted. The extract_resume Step consumes those outputs and requests JSON with a serialized
schema. Constructing these instructions makes no API request. The CLI handles uploading, waiting,
downloading the result, and validating it before saving.
Try the example app
Use a new, empty directory and follow the complete
setup instructions. They install the tested combination
of @transloadit/node 4.14.0, Zod 3.25.76, and zod-to-json-schema 3.25.2 with Yarn 4.12.0.
This walkthrough was tested with Node.js 26.12.1;
use a maintained Node.js release meeting the README’s prerequisite. Corepack and cURL must also be
available. These are reproduction versions, not claims about the latest releases.
This existing runner uses Zod 3 schemas with the deprecated JSON Schema converter. Keep the listed pins to reproduce it. Adapting the app to Zod 4 also requires updating its schema conversion; changing only the installed major version is insufficient.
Download both resume-parser/run.ts and shared/runtime.ts using the README’s commands. Their
relative layout matters because the parser imports the shared runtime. Run setup outside an existing
project so its package-manager configuration does not affect your first test. The README’s final
--help command starts the app without uploading anything.
Setup creates package.json without replacing an existing file. If installation or a download stops
partway, keep that directory for inspection and restart in another empty directory.
Export your Transloadit Workspace Auth Key and Secret as TRANSLOADIT_AUTH_KEY and
TRANSLOADIT_AUTH_SECRET in the shell where you will run the app. Keep their values out of source
control. The script reads the process environment and does not load an environment file.
For the command below, leave TRANSLOADIT_AI_CREDENTIALS unset: --test-credentials explicitly
selects Transloadit-provided AI credentials. AI test credentials and the other processing Steps
are billed. Alternatively, use an existing Anthropic AI Credential name in
TRANSLOADIT_AI_CREDENTIALS and omit the flag. Select exactly one mode; the program does not create
or change credentials. Review the AI credential documentation before
choosing a mode.
Place a resume you are authorized to upload at resume.pdf, then run:
node resume-parser/run.ts --input ./resume.pdf --output ./result.json --test-credentials
Use a new destination for each run. The app refuses an existing output before submitting an Assembly and leaves the input untouched. This tutorial limits input and downloaded output to 20 MiB; these are example limits, not Transloadit product limits. It allows five minutes for processing and 30 seconds for the result download.
On success, the terminal prints an Assembly ID and a Saved message followed by the local output path. Inspect that file:
cat ./result.json
Compare names, email addresses, skills, dates, and employment entries with the original before importing them into an ATS. A successful Assembly or readable JSON is insufficient evidence of accurate extraction. Keep the saved file private when it contains personal information.
If the run fails after printing an Assembly ID, inspect that Assembly in the Console before retrying. A local timeout or interruption does not establish that remote processing stopped, and the work can still be billed. The script does not automatically retry an Assembly. When it handles a result-validation failure, it removes the unfinished output and preserves any pre-existing destination. An interruption can leave a partial local file; inspect it before choosing a new destination.
Example inputs
Start with a synthetic resume you create as a PDF or DOCX. For example, use “Jamie Example,”
jamie@example.test, the skills “TypeScript” and “PostgreSQL,” and one role at “Example Systems.”
Give that role a concrete achievement such as “Built an internal document search service.” These
known facts let you check the saved result without uploading a real person’s information.
Replace --input ./resume.pdf with your DOCX path to use the conversion branch. The same CLI and
JSON schema apply. Document layout and model inference can affect the result, so inspect each
output rather than treating a passing sample as an accuracy guarantee.
Next steps
Normalize phone numbers and dates only after reviewing their source values. Treat empty fields as missing information, and route uncertain extractions to manual review. When adapting the example script for an ATS, keep that review step between extraction and import.

