> ## Documentation Index
> Fetch the complete documentation index at: https://careerk.mintlify.site/llms.txt
> Use this file to discover all available pages before exploring further.

# Confirm CV Upload

> Confirm the CV upload after the file has been uploaded to cloud storage

## Endpoint

```
POST /api/v1/cv/confirm
```

**Base URL**: `http://localhost:3000/api/v1`

<Note>This endpoint requires **authentication** and **Job Seeker role**.</Note>

## Authentication

Include the access token in the Authorization header:

```bash theme={null}
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

<ParamField body="key" type="string" required>
  The storage key returned from the presigned URL request (e.g.,
  "cvs/a9ff20fb-8010-4a22-8873-344c103726af/1771315860529-test-cv.pdf").
</ParamField>

<ParamField body="fileName" type="string" required>
  The original file name (e.g., "test-cv.pdf").
</ParamField>

<ParamField body="mimeType" type="string" required>
  The MIME type of the file (e.g., "application/pdf").
</ParamField>

## Request Example

```json theme={null}
{
  "key": "cvs/a9ff20fb-8010-4a22-8873-344c103726af/1771315860529-test-cv.pdf",
  "fileName": "test-cv.pdf",
  "mimeType": "application/pdf"
}
```

## Response

### Success Response (200 OK)

```json theme={null}
{
  "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

```json theme={null}
{
  "success": false,
  "error": {
    "message": "Unauthorized",
    "statusCode": 401,
    "timestamp": "2026-04-23T20:00:00.000Z",
    "path": "/cv/confirm",
    "method": "POST",
    "details": "Unauthorized"
  }
}
```

### 403 Forbidden

```json theme={null}
{
  "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

```json theme={null}
{
  "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

<Steps>
  <Step title="Request Upload URL">Call POST /cv/presigned-url to get an upload URL</Step>
  <Step title="Upload File">Upload the file using PUT with the upload URL</Step>
  <Step title="Confirm Upload">Call POST /cv/confirm to finalize the upload</Step>
</Steps>

<Info>
  **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.
</Info>
