---
title: "Enrich a CRSProf artifact with waypoint/resource data"
method: POST
path: "/api/crsprof/waypoints"
tags: ["CRSProf"]
---

# Enrich a CRSProf artifact with waypoint/resource data

`POST /api/crsprof/waypoints`

## Request

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

Async operation. Applies structured waypoint/resource/cutoff data or parsed aid-station table text to an existing CRSProf artifact and returns an enriched CRSProf artifact. Use this before segment generation and race-plan estimation when official aid stations, water/food/crew resources, cutoffs, or split separators are available.

## Request body

- CrsprofWaypointsRequest
  - `course` object, required
    - `crsprof_artifact_id` string, required: Existing CRSProf artifact to enrich.
  - `waypoints` union, required
    - StructuredWaypointEnrichment
      - `mode` 'structured'
      - `distance_unit` 'm' | 'km' | 'mi'
      - `items` WaypointItem[], required
        - `name` string, required
        - `distance` number, required
        - `distance_unit` 'm' | 'km' | 'mi'
        - `kind` 'start' | 'finish' | 'aid' | 'checkpoint' | 'water' | 'crew' | 'other'
        - `resources` string[]
        - `cutoff` string: Total elapsed cutoff in HH:MM. HH may be greater than 24.
        - `cutoff_kind` 'enter' | 'leave'
        - `split_separator` boolean: Reserved for explicit split separator behavior; current enrichment preserves existing CourseProfiler semantics.
        - `notes` string
        - `source_text` string
        - `source_ref` string
    - TableWaypointEnrichment
      - `mode` 'table', required
      - `text` string: Copied official aid-station/course-point table text. Provide either text or table_url.
      - `table_url` string, uri: Public HTTPS URL for an official aid-station/course-point table, HTML page, or PDF. Provide either text or table_url.
      - `source_ref` string: Optional source URL/page/table reference.
      - `start_time` string: Optional race start time used when parsing clock-based cutoffs.

## 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
- `404`: Resource not found
- `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)
