POST /cvs/process
Upload a CV for parsing. Returns the extracted candidate name, latest employer and role, plus a signed URL to the stored source file. Does not render a formatted document.
POST /cvs/process uploads a CV to RemakeCV as multipart form data, parses it, and returns the extracted candidate name, latest employer and latest role plus a signed URL to the stored file. It requires the file and acting_user_email, needs CV storage enabled, and consumes one credit per call.
This endpoint parses and stores a CV; it does not return a rendered document. The download_url it returns points at the source file you uploaded, converted to PDF. For branded, template-rendered output on a candidate record, use the web app or a native integration — our team builds those for any ATS. See integrations overview.
CV storage must be enabled for your company. If it is not, every call still runs the full pipeline and spends a credit, then returns 400 storage_required. Confirm storage is on before you start integrating.
Request
POST /cvs/process · multipart/form-data · Authentication required
filebinaryrequiredThe CV to process. Accepts .pdf, .doc and .docx. Maximum 10MB by default.
acting_user_emailstringrequiredEmail address of the consultant this request is on behalf of. Determines template visibility and which credit limits apply.
template_idstring | nullInfluences the extraction schema for company-specific configurations. It does not render anything. Pass a value we have configured for your company, or omit it.
When omitted, a separate public-API setting is used, falling back to the literal default. That setting is not the same as the is_default template returned by GET /templates; contact support@remakecv.com to set it.
genderstringFree text passed into the extraction prompt as context about the candidate. It biases how the model reads the CV. Omit it unless you have a specific reason.
blurbstringA style exemplar, not content. It is shown to the model as an example summary to imitate when generating a candidate summary, and never appears verbatim in the output. It is only consulted when the CV has no existing summary.
curl -X POST "https://app.remakecv.com/api/public/v1/cvs/process" \
-H "Authorization: Bearer $REMAKECV_API_KEY" \
-F "file=@candidate-cv.pdf" \
-F "acting_user_email=consultant@agency.com" \
-F "template_id=42"Response
{
"data": {
"id": 1234,
"stored": true,
"storage_enabled": true,
"candidate_name": "Alex Morgan",
"latest_company": "Northwind Logistics",
"latest_role": "Operations Manager",
"processing_method": "text",
"download_url": "https://storage.googleapis.com/..."
},
"pagination": null,
"error": null
}idinteger | nullThe stored CV's identifier, or null when CV storage is disabled for your company.
storedbooleanAlways true on a 200 response. A CV that could not be stored returns an error instead.
storage_enabledbooleanAlways true on a 200 response — storage is a prerequisite, so a company without it never reaches this response.
candidate_namestring | nullExtracted candidate name. null if it could not be determined.
latest_companystring | nullThe candidate's most recent employer.
latest_rolestring | nullThe candidate's most recent job title.
processing_methodstringtext when the document had an extractable text layer, image when OCR was required.
download_urlstringSigned URL for the source CV you uploaded, as a PDF (Word files are converted). Valid for 1 hour.
download_url expires after 1 hour. Do not store it in a database or send it to a client. Store id instead and fetch a fresh URL from GET /cvs/{cvId}/file when you need one.
Scope of this endpoint
POST /cvs/process is the parse-and-store endpoint. Worth knowing as you design around it:
| Behaviour | Detail |
|---|---|
| Branded document output | Handled by the web app and the native integrations rather than this endpoint — ask us about your platform |
| Processing mode | Automatic; RemakeCV selects the right extraction path per document |
| Each call | Treated as a new CV, so use your stored cvId rather than re-posting the same file |
| Filtering by consultant | Filter client-side from GET /cvs |
Need something here that the API does not currently expose? Email support@remakecv.com — the API is actively developed and customer requirements drive what lands next.
Errors
| Status | Code | Cause |
|---|---|---|
400 | upload_required | No file in the file field |
400 | acting_user_required | acting_user_email missing |
400 | validation_error | File too large, or malformed multipart body |
401 | invalid_api_key | Key invalid, revoked or expired |
400 | storage_required | CV storage is disabled — a credit is still spent |
403 | api_disabled | Public API not enabled for this company |
400/500 | process_failed | Processing failed. Credit rejections arrive here, with the reason in message |
400/500 | storage_failed | Parsed, but storing failed — credit already spent, and no download_url is returned |
404 | acting_user_invalid | Acting user is not a member of this company |
429 | rate_limit_exceeded | Over 30 requests per minute |
See errors.
Notes
- One credit per call that reaches processing. Validation, auth and rate-limit rejections cost nothing, but
storage_requiredandstorage_failedoccur after the credit is deducted. processing_method: "image"means OCR ran. Those results warrant closer review — see scanned PDFs and OCR.template_idis not validated. An unknown ID is accepted and quietly ignored.
Frequently asked questions
- What is the maximum file size?
- 10MB by default, configurable per company. Exceeding it returns 400 validation_error.
- Does download_url give me the formatted CV?
- It points at the source file you uploaded, converted to PDF. For branded, template-rendered output on a candidate record, use the web app or a native integration — our team builds those for any ATS.
- How long does download_url stay valid?
- One hour. For longer-lived access, store the returned CV id and fetch a fresh URL from GET /cvs/{cvId}/file when needed.
- Does a failed call consume a credit?
- Usually not — validation, auth and rate-limit rejections are free. But storage_required and storage_failed happen after the credit is deducted, so those do cost one.
Related articles
Last updated . Still stuck? Email support@remakecv.com or book a call.