Resume Parser API
The XeCubes AI Resume Parser extracts structured candidate entities from raw resumes (PDF, DOCX, TXT) and computes a multi-dimensional job suitability score against your job requirements.
1. Upload Resume for Analysis​
Submit a multipart form-data payload containing the candidate's resume and target job_id.
Form Parameters​
| Field | Type | Required | Description |
|---|---|---|---|
resume | File | Yes | PDF or DOCX resume document (Max size: 15MB). |
job_id | String | Yes | Target Job UUID to score candidate against. |
callback_url | String | No | HTTPS webhook URL to receive parser results when completed. |
- cURL
- Node.js
- Python
- Go
curl -X POST "https://api.xecubes.com/recruiter/jobs/vendor/resume-analysis" \
-H "X-API-Key: xh_live_your_secret_key" \
-F "resume=@/path/to/candidate_resume.pdf" \
-F "job_id=job_uuid_12345678" \
-F "callback_url=https://yourserver.com/webhooks/resume-parsed"
const formData = new FormData();
formData.append('resume', fs.createReadStream('./candidate_resume.pdf'));
formData.append('job_id', 'job_uuid_12345678');
formData.append('callback_url', 'https://yourserver.com/webhooks/resume-parsed');
const response = await fetch('https://api.xecubes.com/recruiter/jobs/vendor/resume-analysis', {
method: 'POST',
headers: {
'X-API-Key': 'xh_live_your_secret_key'
},
body: formData
});
const result = await response.json();
console.log('Queued Analysis:', result);
import requests
files = {'resume': open('candidate_resume.pdf', 'rb')}
data = {
'job_id': 'job_uuid_12345678',
'callback_url': 'https://yourserver.com/webhooks/resume-parsed'
}
headers = {'X-API-Key': 'xh_live_your_secret_key'}
response = requests.post(
"https://api.xecubes.com/recruiter/jobs/vendor/resume-analysis",
headers=headers,
files=files,
data=data
)
print(response.json())
package main
import (
"bytes"
"io"
"mime/multipart"
"net/http"
"os"
)
func main() {
file, _ := os.Open("candidate_resume.pdf")
defer file.Close()
body := &bytes.Buffer{}
writer := multipart.NewWriter(body)
part, _ := writer.CreateFormFile("resume", "candidate_resume.pdf")
io.Copy(part, file)
_ = writer.WriteField("job_id", "job_uuid_12345678")
_ = writer.WriteField("callback_url", "https://yourserver.com/webhooks/resume-parsed")
writer.Close()
req, _ := http.NewRequest("POST", "https://api.xecubes.com/recruiter/jobs/vendor/resume-analysis", body)
req.Header.Set("X-API-Key", "xh_live_your_secret_key")
req.Header.Set("Content-Type", writer.FormDataContentType())
client := &http.Client{}
resp, _ := client.Do(req)
defer resp.Body.Close()
}
Immediate Queue Response​
{
"status": "success",
"message": "resume analysis created and queued",
"data": {
"analysis_id": "anal_987654321"
}
}
2. Retrieve Parser Status & Results​
Query the processing status and candidate extraction results using the analysis_id returned during upload.
- cURL
- Node.js
curl -X GET "https://api.xecubes.com/recruiter/jobs/vendor/resume-analysis/anal_987654321" \
-H "X-API-Key: xh_live_your_secret_key"
const res = await fetch('https://api.xecubes.com/recruiter/jobs/vendor/resume-analysis/anal_987654321', {
headers: {
'X-API-Key': 'xh_live_your_secret_key'
}
});
const report = await res.json();
console.log('Candidate Score:', report.data.analysis.suitability_score);
Comprehensive Parsed Output​
{
"status": "success",
"data": {
"id": "anal_987654321",
"status": "completed",
"candidate": {
"name": "Sarah Connor",
"phone": "+1 415 555 0192",
"linkedin_url": "https://linkedin.com/in/sarahconnor",
"github_url": "https://github.com/sconnor",
"location": "San Francisco, CA"
},
"analysis": {
"suitability_score": 94.5,
"analysis_summary": "Exceptional fit for Senior AI Infrastructure role. Demonstrates 6+ years of distributed systems engineering, deep PyTorch experience, and high-throughput vector database deployments.",
"match_breakdown": {
"technical_skills": 96.0,
"experience_depth": 92.0,
"education_pedigree": 95.0
},
"key_skills": [
"Python",
"TypeScript",
"PgVector",
"PyTorch",
"Kubernetes",
"Distributed Systems"
],
"experience_years": 6.8,
"seniority_level": "Senior Staff"
}
}
}