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.

Base URLhttps://dqzxwwacosqcxipouyzxnrh7ky0sdnqw.lambda-url.us-east-2.on.aws
01

Get 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.

02

Authentication


Send your key in the X-API-Key header on every request.

X-API-Key: rp_live_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
HTTPMeaning
401Missing or invalid API key
403API key revoked
03

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
}
04

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.

FieldWhat it holds
data.personal_infoName, 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
confidencePer-section + overall scores, 0–1
skills_validationTaxonomy match ratio and recognized / unrecognized split
partial · warningspartial=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.

05

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": [] }
06

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.

07

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]"]
}
08

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.completed
09

Errors


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": "…" } }
HTTPerror_code
401 / 403MISSING_API_KEY · INVALID_API_KEY · REVOKED_API_KEY
413 / 415FILE_TOO_LARGE · UNSUPPORTED_FILE_TYPE
404JOB_NOT_FOUND
500PARSE_FAILED · EXTRACTION_FAILED · OCR_FAILED
failed job (poll)WORKER_DISPATCH_FAILED — async processing could not start; retry the upload
10

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"])