---
title: "Import or create a CRSProf artifact"
method: POST
path: "/api/crsprof/imports"
tags: ["CRSProf"]
---

# Import or create a CRSProf artifact

`POST /api/crsprof/imports`

## Request

- Base URL: `https://courseprofiler.com`
- URL: `https://courseprofiler.com/api/crsprof/imports`
- Auth: one of:
  - API key in header `X-API-Key`
  - HTTP bearer
  - none

Async operation. Creates a CRSProf artifact from GPX, FIT, CRSProf, public HTTPS URL, existing import/share ID, or raw CRSProf JSON.

## Request body

- CrsprofImportRequest
  - `source` union, required
    - object
      - `kind` 'artifact', required
      - `artifact_id` string, required
    - object
      - `kind` 'url', required
      - `url` string, uri, required
    - object
      - `kind` 'raw_json', required
      - `payload` object, required
    - object
      - `kind` 'import_id', required
      - `import_id` string, required
  - `options` CrsprofImportOptions: GPX/FIT analysis flags. Existing CRSProf is preserved with analysis_options_not_applied warnings when flags are supplied.
    - `include_segments` boolean
    - `include_routes` boolean

## Response `202`

Async job accepted

- Job
  - `request_id` string: Current HTTP request correlation ID, also X-Request-Id; not an idempotency key.
  - `job_persistence` 'not_persisted' | 'confirmed' | 'unknown': Latest job metadata write outcome, not a current retrievability guarantee. Do not blindly retry unknown writes.
  - `submission_request_id` string: Original allocation request ID; omitted in legacy job metadata.
  - `job_id` string, required
  - `status` 'queued' | 'running' | 'succeeded' | 'failed' | 'expired' | 'cancelled', required
  - `status_url` string, required
  - `created_at` string, date-time, required
  - `started_at` string, date-time
  - `completed_at` string, date-time
  - `expires_at` string, date-time, required
  - `result_artifacts` Artifact[], required
    - `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
  - `warnings` ApiProblem[], required
    - `code` string, required
    - `message` string, required
    - `severity` 'info' | 'warning' | 'error', required
    - `field` string
    - `details` object
  - `errors` ApiProblem[], required
    - `code` string, required
    - `message` string, required
    - `severity` 'info' | 'warning' | 'error', required
    - `field` string
    - `details` object
  - `progress` object

## Other responses

- `400`: Invalid request
- `413`: Payload too large
- `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)
