Skip to main content

Upload Resume

POST /api/v1/resumes/upload

Upload and parse a resume file. The API automatically extracts information using AI-powered parsing and creates a new resume in your account.

Request

Headers

HeaderValueRequired
AuthorizationBearer YOUR_API_KEYREQUIRED
Content-Typemultipart/form-dataREQUIRED

Form Data

FieldTypeDescription
filefileResume file to upload REQUIRED

File Requirements

  • Accepted formats: PDF, DOC, DOCX
  • Maximum size: 10 MB
  • Content: Must contain valid resume information

Response

Success Response

Status Code: 200 OK

{
"id": "64f1a2b3c4d5e6f7g8h9i0j1"
}

Response Fields

FieldTypeDescription
idstringUnique identifier of the newly created resume

Examples

Upload with cURL

cURL
curl -X POST "https://api.enhancv.com/api/v1/resumes/upload" \
-H "Authorization: Bearer enh_live_your_api_key_here" \
-F "file=@/path/to/resume.pdf"

Upload with JavaScript (Node.js)

JavaScript - Using FormData
const FormData = require('form-data');
const fs = require('fs');
const fetch = require('node-fetch');

const form = new FormData();
form.append('file', fs.createReadStream('/path/to/resume.pdf'));

const response = await fetch('https://api.enhancv.com/api/v1/resumes/upload', {
method: 'POST',
headers: {
'Authorization': 'Bearer enh_live_your_api_key_here',
...form.getHeaders()
},
body: form
});

const data = await response.json();
console.log('Resume uploaded! ID:', data.id);

Upload with Python

Python - Using requests
import requests

api_key = 'enh_live_your_api_key_here'

with open('/path/to/resume.pdf', 'rb') as file:
files = {'file': file}
headers = {'Authorization': f'Bearer {api_key}'}

response = requests.post(
'https://api.enhancv.com/api/v1/resumes/upload',
headers=headers,
files=files
)

data = response.json()
print(f"Resume uploaded! ID: {data['id']}")

Upload from URL

JavaScript - Download and Upload
const fetch = require('node-fetch');
const FormData = require('form-data');

// Download resume from URL
const fileResponse = await fetch('https://example.com/resume.pdf');
const fileBuffer = await fileResponse.arrayBuffer();

// Upload to Enhancv
const form = new FormData();
form.append('file', Buffer.from(fileBuffer), 'resume.pdf');

const response = await fetch('https://api.enhancv.com/api/v1/resumes/upload', {
method: 'POST',
headers: {
'Authorization': 'Bearer enh_live_your_api_key_here',
...form.getHeaders()
},
body: form
});

const data = await response.json();
console.log('Resume uploaded! ID:', data.id);

Error Responses

400 Bad Request

No File Uploaded

{
"error": "No file uploaded",
"status": 400
}

File Too Large

{
"error": "File size exceeds 10MB",
"status": 400
}

Invalid File Type

{
"error": "Invalid file type. Only PDF, DOC, and DOCX are allowed",
"status": 400
}

401 Unauthorized

Missing or invalid API key.

{
"error": "Invalid API key",
"status": 401
}

403 Forbidden

Business Plan Required

{
"error": "API access requires a business plan",
"status": 403
}

Resume Limit Reached

{
"error": "Maximum resume limit reached",
"status": 403
}

Resume Parsing

How It Works

  1. File Upload: Your resume file is securely uploaded to our servers
  2. AI Parsing: We use HRFlow AI to extract structured information:
    • Personal information (name, email, phone, location)
    • Work experience (job titles, companies, dates, responsibilities)
    • Education (degrees, institutions, dates)
    • Skills (technical and soft skills)
    • Certifications, languages, and other sections
  3. Resume Creation: A new resume is created in your account with the extracted data
  4. Ready to Use: You can view and edit the resume in the Enhancv editor

Supported Content

The parser can extract:

  • ✅ Work experience with bullet points
  • ✅ Education history
  • ✅ Skills and competencies
  • ✅ Certifications and courses
  • ✅ Languages
  • ✅ Contact information
  • ✅ Professional summary
  • ✅ Projects and achievements

Parsing Quality

  • PDF: Best results, preserves formatting cues
  • DOCX: Very good results
  • DOC: Good results (converted to DOCX internally)

What Happens After Upload

  1. The resume is immediately accessible in your account
  2. You can view it in the Enhancv editor
  3. All sections are editable
  4. Original formatting is not preserved (Enhancv styling is applied)
  5. The resume ID can be used with other API endpoints

Performance

  • Upload time: 1-3 seconds
  • Parsing time: 5-15 seconds
  • Total time: Usually completes in 10-20 seconds
Asynchronous Processing

While the API endpoint waits for parsing to complete, the process is non-blocking on the server side. Multiple uploads can be processed simultaneously.

Best Practices

  1. Validate files client-side before uploading to reduce errors
  2. Handle timeouts gracefully - parsing can take 10-20 seconds
  3. Store the returned resume ID for future operations
  4. Check resume quality - AI parsing may not be 100% accurate
  5. Inform users that they may need to review and edit the parsed content

Notes

  • Uploaded resumes count toward your account's resume limit
  • The parser works best with standard resume formats
  • Creative or highly designed resumes may not parse perfectly
  • You can always edit the resume after upload in the Enhancv editor