---
title: "Get artifact metadata and a private pre-signed download URL"
method: GET
path: "/api/artifacts/{artifact_id}"
tags: ["Artifacts"]
---

# Get artifact metadata and a private pre-signed download URL

`GET /api/artifacts/{artifact_id}`

## Request

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

## Path parameters

- `artifact_id` string, required

## Response `200`

Artifact metadata

- 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

- `404`: Resource not found
- `410`: Artifact expired
- `500`: stored_metadata_invalid or artifact_body_missing; not evidence of resource absence.
- `503`: storage_unconfigured, storage_unavailable or storage_access_denied; service storage denial is not caller authorization denial.

---

[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)
