---
title: "Complete an upload session and register a source_file artifact"
method: POST
path: "/api/artifact-uploads/{upload_id}/complete"
tags: ["Uploads"]
---

# Complete an upload session and register a source_file artifact

`POST /api/artifact-uploads/{upload_id}/complete`

## Request

- Base URL: `https://courseprofiler.com`
- URL: `https://courseprofiler.com/api/artifact-uploads/{upload_id}/complete`
- Auth: one of:
  - API key in header `X-API-Key`
  - HTTP bearer
  - none

## Path parameters

- `upload_id` string, required

## Request body

- ArtifactUploadCompleteRequest
  - `checksum` ArtifactUploadChecksum
    - `algorithm` 'sha256', required
    - `value` string, required

## Response `201`

Uploaded file registered as an artifact

- Artifact
  - `request_id` string: Current HTTP request correlation ID, also X-Request-Id; not an idempotency key.
  - `artifact_id` string, required
  - `type` 'source_file' | 'crsprof' | 'usrprof' | 'pdf' | 'json' | 'diagnostics', required
  - `content_type` string, required
  - `file_name` string
  - `size_bytes` integer
  - `download_url` string, uri: Private pre-signed URL. May be omitted for expired artifacts.
  - `download_url_expires_at` string, date-time
  - `created_at` string, date-time, required
  - `expires_at` string, date-time, required
  - `metadata` object
  - `warnings` ApiProblem[]
    - `code` string, required
    - `message` string, required
    - `severity` 'info' | 'warning' | 'error', required
    - `field` string
    - `details` object

## Other responses

- `400`: Invalid request
- `404`: Resource not found
- `410`: Upload session expired
- `429`: Rate limit exceeded

---

[API](https://skmtc.dev/courseprofiler/apis/courseprofiler-public-api.md) · [All operations](https://skmtc.dev/courseprofiler/apis/courseprofiler-public-api/llms.txt) · [OpenAPI document](https://skmtc.dev/courseprofiler/apis/courseprofiler-public-api/revisions/e07403d7dba9?raw)
