Confirm CV Upload
curl --request POST \
--url https://api.example.com/api/v1/cv/confirm \
--header 'Content-Type: application/json' \
--data '
{
"key": "<string>",
"fileName": "<string>",
"mimeType": "<string>"
}
'import requests
url = "https://api.example.com/api/v1/cv/confirm"
payload = {
"key": "<string>",
"fileName": "<string>",
"mimeType": "<string>"
}
headers = {"Content-Type": "application/json"}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'Content-Type': 'application/json'},
body: JSON.stringify({key: '<string>', fileName: '<string>', mimeType: '<string>'})
};
fetch('https://api.example.com/api/v1/cv/confirm', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.example.com/api/v1/cv/confirm",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'key' => '<string>',
'fileName' => '<string>',
'mimeType' => '<string>'
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.example.com/api/v1/cv/confirm"
payload := strings.NewReader("{\n \"key\": \"<string>\",\n \"fileName\": \"<string>\",\n \"mimeType\": \"<string>\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api.example.com/api/v1/cv/confirm")
.header("Content-Type", "application/json")
.body("{\n \"key\": \"<string>\",\n \"fileName\": \"<string>\",\n \"mimeType\": \"<string>\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.example.com/api/v1/cv/confirm")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Content-Type"] = 'application/json'
request.body = "{\n \"key\": \"<string>\",\n \"fileName\": \"<string>\",\n \"mimeType\": \"<string>\"\n}"
response = http.request(request)
puts response.read_bodyCV
Confirm CV Upload
Confirm the CV upload after the file has been uploaded to cloud storage
POST
/
api
/
v1
/
cv
/
confirm
Confirm CV Upload
curl --request POST \
--url https://api.example.com/api/v1/cv/confirm \
--header 'Content-Type: application/json' \
--data '
{
"key": "<string>",
"fileName": "<string>",
"mimeType": "<string>"
}
'import requests
url = "https://api.example.com/api/v1/cv/confirm"
payload = {
"key": "<string>",
"fileName": "<string>",
"mimeType": "<string>"
}
headers = {"Content-Type": "application/json"}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'Content-Type': 'application/json'},
body: JSON.stringify({key: '<string>', fileName: '<string>', mimeType: '<string>'})
};
fetch('https://api.example.com/api/v1/cv/confirm', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.example.com/api/v1/cv/confirm",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'key' => '<string>',
'fileName' => '<string>',
'mimeType' => '<string>'
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.example.com/api/v1/cv/confirm"
payload := strings.NewReader("{\n \"key\": \"<string>\",\n \"fileName\": \"<string>\",\n \"mimeType\": \"<string>\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api.example.com/api/v1/cv/confirm")
.header("Content-Type", "application/json")
.body("{\n \"key\": \"<string>\",\n \"fileName\": \"<string>\",\n \"mimeType\": \"<string>\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.example.com/api/v1/cv/confirm")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Content-Type"] = 'application/json'
request.body = "{\n \"key\": \"<string>\",\n \"fileName\": \"<string>\",\n \"mimeType\": \"<string>\"\n}"
response = http.request(request)
puts response.read_bodyEndpoint
POST /api/v1/cv/confirm
http://localhost:3000/api/v1
This endpoint requires authentication and Job Seeker role.
Authentication
Include the access token in the Authorization header:Authorization: Bearer YOUR_ACCESS_TOKEN
Description
Confirm the CV upload after the file has been uploaded to cloud storage. This finalizes the CV attachment to your profile. This is the third and final step in the CV upload process.Request Body
string
required
The storage key returned from the presigned URL request (e.g.,
“cvs/a9ff20fb-8010-4a22-8873-344c103726af/1771315860529-test-cv.pdf”).
string
required
The original file name (e.g., “test-cv.pdf”).
string
required
The MIME type of the file (e.g., “application/pdf”).
Request Example
{
"key": "cvs/a9ff20fb-8010-4a22-8873-344c103726af/1771315860529-test-cv.pdf",
"fileName": "test-cv.pdf",
"mimeType": "application/pdf"
}
Response
Success Response (200 OK)
{
"success": true,
"data": {
"status": "COMPLETED",
"parseResultId": "9968ae8c-e8f4-4d36-a17a-79215cca669c",
"firstName": "Amr",
"lastName": "Ashraf Mubarak",
"profileImageUrl": null,
"profile": {
"jobSeekerId": "a9ff20fb-8010-4a22-8873-344c103726af",
"title": "Software Engineer",
"location": "Egypt",
"availabilityStatus": "OPEN_TO_WORK",
"workPreference": "REMOTE",
"preferredJobTypes": null,
"yearsOfExperience": 0.3,
"linkedinUrl": "linkedin.com/in/amramubarak",
"portfolioUrl": null,
"githubUrl": "github.com/amrrdev",
"cvEmail": "amrrdev@gmail.com",
"noticePeriod": null,
"phone": "+20 120 456 2326",
"expectedSalary": null,
"summary": "Software Engineer with 1+ year of experience building scalable microservices..."
},
"educations": [
{
"degreeType": "BACHELOR",
"description": null,
"institutionName": "Benha University",
"isCurrent": false,
"fieldOfStudy": "Science in Computer Science",
"endDate": "2026-01-01",
"gpa": 3.6,
"startDate": "2022-01-01"
}
],
"workExperiences": [
{
"companyName": "Linux Foundation Decentralized Trust",
"description": "Developed a testing strategy for a decentralized trust solution...",
"isCurrent": false,
"startDate": "2025-05-01",
"jobTitle": "Software Engineer",
"location": "Remote",
"endDate": "2025-07-01"
}
],
"skills": [
{ "name": "typescript", "verified": true },
{ "name": "node.js", "verified": true },
{ "name": "nestjs", "verified": true }
],
"processingTime": 952
},
"message": "Success",
"meta": {
"timestamp": "2026-04-23T20:00:00.000Z",
"path": "/cv/confirm",
"method": "POST"
}
}
Error Responses
401 Unauthorized
{
"success": false,
"error": {
"message": "Unauthorized",
"statusCode": 401,
"timestamp": "2026-04-23T20:00:00.000Z",
"path": "/cv/confirm",
"method": "POST",
"details": "Unauthorized"
}
}
403 Forbidden
{
"success": false,
"error": {
"message": "Forbidden resource",
"statusCode": 403,
"timestamp": "2026-04-23T20:00:00.000Z",
"path": "/cv/confirm",
"method": "POST",
"details": "Forbidden"
}
}
400 Bad Request - File Not Found
{
"success": false,
"error": {
"message": "File not found in storage, upload may have failed",
"statusCode": 400,
"timestamp": "2026-04-23T20:00:00.000Z",
"path": "/cv/confirm",
"method": "POST",
"details": "Bad Request"
}
}
Complete Upload Flow
1
Request Upload URL
Call POST /cv/presigned-url to get an upload URL
2
Upload File
Upload the file using PUT with the upload URL
3
Confirm Upload
Call POST /cv/confirm to finalize the upload
CV Upload Complete: After confirmation, your CV will be available via GET /cv/me and can be
downloaded using GET /cv/me/download-url. The NLP parsing starts automatically and you can preview
results using GET /cv-parse/preview.
