API Reference
Using your API keys
Authenticate with your API key, send a resume, and get structured JSON back. All requests go to the base URL below.
https://dqzxwwacosqcxipouyzxnrh7ky0sdnqw.lambda-url.us-east-2.on.awsGet an API key
Sign in and open the dashboard, then click Generate key. Your key looks like rp_live_… and is shown once — copy it somewhere safe (or download the .csv). Treat it as a secret: use it only from your server, never in browser or mobile code.
Authentication
Send your key in the X-API-Key header on every request.
X-API-Key: rp_live_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx| HTTP | Meaning |
|---|---|
| 401 | Missing or invalid API key |
| 403 | API key revoked |
Parse a resume
POST /api/v1/resume/parse with multipart/form-data and a single filefield. Supported: PDF, DOCX, PNG, JPG, TIFF, WEBP (max 10 MB).
curl -X POST "https://dqzxwwacosqcxipouyzxnrh7ky0sdnqw.lambda-url.us-east-2.on.aws/api/v1/resume/parse" \
-H "X-API-Key: rp_live_your_key" \
-F "file=@resume.pdf"Digital PDFs and DOCX return the result immediately (status: "completed"). Scanned PDFs and images need OCR and return status: "processing" with a job_id to poll (or use a webhook). Add -F "force_textract=true" to force high-accuracy OCR on a difficult scan.
{
"job_id": "01J3K…",
"status": "completed",
"data": {
"personal_info": { "full_name": "…", "credentials": ["RN", "BSN"], … },
"experience": [ … ],
"education": [ … ],
"skills": [ … ],
"certifications": [ … ],
"licenses": [ { "license_type": "RN", "state": "FL", "license_number": "RN9411204" } ],
"professional_associations": [ "Sigma Theta Tau International Member", "Sepsis Clinical Services Committee" ],
"awards": [ "Summa Cum Laude (2015)" ],
"references": [ … ]
},
"confidence": { "overall": 0.91, "personal_info": 0.96, "experience": 0.88 },
"skills_validation": { "recognized_ratio": 0.8 },
"partial": false,
"warnings": [],
"poll_url": null
}Output fields
Every completed parse returns a healthcare-normalized record. Specialties are resolved to canonical taxonomy names, credentials and state licences are captured separately, and each section carries a confidence score so you can route low-confidence records to human review.
| Field | What it holds |
|---|---|
| data.personal_info | Name, post-nominal credentials[] (RN, BSN, MPH…), full address, contact, summary |
| data.experience[] | Per-role facility, title, dates, location, profession, specialties, shift, responsibilities[] |
| data.licenses[] | State licences with license_number, state, status, and compact flag — kept separate from certifications |
| data.certifications[] | Time-limited certifications (BLS, ACLS, CCRN…) with issuer and dates |
| data.professional_associations[] | Society / honor-society memberships, committees, and collaboratives (Sigma Theta Tau, unit committees…) |
| data.awards[] · publications[] | Awards and academic honors (Summa Cum Laude…); publications as citation strings |
| confidence | Per-section + overall scores, 0–1 |
| skills_validation | Taxonomy match ratio and recognized / unrecognized split |
| partial · warnings | partial=true flags a degraded record; warnings[] explains what to review (e.g. no email detected on a low-quality scan, or a name that looks truncated vs the email) |
Always check partial. When extraction degrades on a difficult document the API still returns whatever could be recovered (rather than failing), with partial: true and a human-readable warnings list — surface these records for review instead of auto-importing them.
Poll async jobs
For async jobs, poll GET /api/v1/resume/job/{job_id} until status is completed or failed. Results are kept for 1 hour. A failed job carries an errormessage — and a parse you're unhappy with can be re-run with POST /api/v1/resume/{job_id}/retry (the file is re-uploaded; up to 3 retries).
GET /api/v1/resume/job/01J3K…
→ { "status": "completed", "data": { … }, "confidence": { … },
"partial": false, "warnings": [] }Batch & large files
Batch: send up to 200 files in one multipart/form-data request to POST /api/v1/resume/batch. You get a batch_id plus per-file job_ids; poll GET /api/v1/resume/batch/{batch_id} for overall progress, or subscribe to the batch.completed webhook.
curl -X POST "https://dqzxwwacosqcxipouyzxnrh7ky0sdnqw.lambda-url.us-east-2.on.aws/api/v1/resume/batch" \
-H "X-API-Key: rp_live_your_key" \
-F "files=@a.pdf" -F "files=@b.docx" -F "files=@c.png"Large files (> ~6 MB): the direct endpoint is capped by the platform request limit, so use the two-step flow — POST /api/v1/resume/upload-url returns a presigned S3 form; upload the file straight to storage, then call POST /api/v1/resume/parse-uploaded with the returned job_id (and optional force_textract) and poll as usual. Files up to 10 MB.
Submit feedback
After a user reviews and corrects a parsed resume, send the original and the corrected JSON back so we can improve accuracy. POST /api/v1/resume/{job_id}/feedback — server-to-server (uses your X-API-Key). Returns 202 Accepted; feedback is processed asynchronously.
curl -X POST "https://dqzxwwacosqcxipouyzxnrh7ky0sdnqw.lambda-url.us-east-2.on.aws/api/v1/resume/01J3K…/feedback" \
-H "X-API-Key: rp_live_your_key" \
-H "Content-Type: application/json" \
-d '{
"original": { …parser JSON… },
"updated": { …user-corrected JSON… },
"changed": true
}'Send it after the review step — only when the user changed something, or always as a quality signal (both are accepted). If you omit changed we derive it from the diff. The response lists the exact fields that changed.
{
"feedback_id": "01J3K…",
"job_id": "01J3K…",
"status": "accepted",
"changed": true,
"changed_fields": ["personal_info.full_name", "skills[1]"]
}Webhooks
Instead of polling, register a webhook to receive results. Each delivery is signed: verify X-Signature = HMAC-SHA256(secret, "{timestamp}.{body}") against the raw body, and reject deliveries older than 5 minutes.
X-Signature: sha256=<hex>
X-Timestamp: <unix seconds>
X-Event: parse.completedErrors
All errors share one envelope. Branch on error_code; show hint to users.
{ "error": { "status_code": 413, "error_code": "FILE_TOO_LARGE",
"detail": "…", "hint": "…", "request_id": "…" } }| HTTP | error_code |
|---|---|
| 401 / 403 | MISSING_API_KEY · INVALID_API_KEY · REVOKED_API_KEY |
| 413 / 415 | FILE_TOO_LARGE · UNSUPPORTED_FILE_TYPE |
| 404 | JOB_NOT_FOUND |
| 500 | PARSE_FAILED · EXTRACTION_FAILED · OCR_FAILED |
| failed job (poll) | WORKER_DISPATCH_FAILED — async processing could not start; retry the upload |
Quickstart
Node.js
const form = new FormData();
form.append("file", fileBlob, "resume.pdf");
const res = await fetch("https://dqzxwwacosqcxipouyzxnrh7ky0sdnqw.lambda-url.us-east-2.on.aws/api/v1/resume/parse", {
method: "POST",
headers: { "X-API-Key": process.env.RP_API_KEY },
body: form,
});
const json = await res.json();
console.log(json.status === "completed" ? json.data : json.job_id);Python
import requests
with open("resume.pdf", "rb") as f:
r = requests.post(
"https://dqzxwwacosqcxipouyzxnrh7ky0sdnqw.lambda-url.us-east-2.on.aws/api/v1/resume/parse",
headers={"X-API-Key": "rp_live_your_key"},
files={"file": f},
)
data = r.json()
print(data["data"] if data["status"] == "completed" else data["job_id"])