Prepare a resume upload
Create a report and a temporary upload destination before analysing a resume. Use this to connect one candidate application to a job description. This step does not start analysis.
Before you call
Have one PDF or DOCX (up to 10 MiB), its exact byte length, and job text or an active saved job ID. Choose a stable Idempotency-Key for this preparation.
Required scope: analyses:write.
What happens next
Save reportId, then PUT the file bytes to upload.url using upload.mimeType. Do not send your API key to storage. The URL lasts ten minutes; the preparation lasts 24 hours. After uploading, request an analysis quote.
Recovery
Repeat the identical body/key after a timeout. EXTERNAL_REFERENCE_CONFLICT means the application reference is already used. JD_REVISION_CHANGED requires reviewing the updated job. PENDING_UPLOAD_LIMIT requires cancelling unused preparations or waiting for expiry.
Follow the complete workflow · Errors and retries
ApiKeyAuthorizationBearer <token>Idempotency-Key*stringStable key for one logical write. Retry the identical body with the same key after a timeout; a changed body conflicts. 1–128 letters, digits, dots, underscores, colons, or hyphens.
^[A-Za-z0-9._:-]+$1 <= length <= 128application/json- body
externalReference?Your application identity: source plus id, unique within the workspace. Prefer an application ID rather than personal information.
fileName*stringOriginal PDF or DOCX filename, including extension. Paths and control characters are rejected.
^[^/\\\x00-\x1f]+\.(pdf|docx)$1 <= length <= 200fileSize*integerExact file byte length, from 1 to 10,485,760. This is not the number of characters or a megabyte count.
1 <= value <= 10485760mimeType*stringFile content type. The file extension, declared type, and uploaded content must agree.
"application/pdf""application/vnd.openxmlformats-officedocument.wordprocessingml.document"jobDescription*|Role context: inline text or a saved job ID on input; selected role fields on a report response.
Save reportId, then PUT the file bytes to upload.url using upload.mimeType. Do not send your API key to storage. The URL lasts ten minutes; the preparation lasts 24 hours. After uploading, request an analysis quote.
application/json- response
data*# Set PROBB_URL and PROBB_API_KEY. Replace RESOURCE_ID if present.# Set REQUEST_KEY once for this logical write; reuse it with the same body on retries.curl --fail-with-body -X POST "$PROBB_URL/api/v1/uploads" \ -H "Authorization: Bearer $PROBB_API_KEY" \ -H "Idempotency-Key: $REQUEST_KEY" \ -H 'Content-Type: application/json' \ --data-binary '{ "fileName": "resume.pdf", "fileSize": 1024, "mimeType": "application/pdf", "externalReference": { "source": "my-ats", "id": "application-42" }, "jobDescription": { "kind": "text", "text": "Build reliable backend services. Required: API development, PostgreSQL, and production incident response." }}'{ "data": { "reportId": "report_example", "upload": { "url": "https://storage.example.test/upload/synthetic-resume", "method": "PUT", "mimeType": "application/pdf", "sizeBytes": 1024, "expiresInSeconds": 600 } }}