The API, in detail.
The implemented beta endpoints, generated from the same OpenAPI contract you can import into your development tools. These server endpoints require the appropriate bearer credential; project builder access and athlete-data access are separate. See API authentication.
Upload a FIT activity#
POST /v1/activities
Send raw FIT bytes, not multipart or JSON. Maximum 4 MiB. The same bytes in the same workspace reuse one activity. HTTP 202 means processing is pending; 200 means the returned activity is already ready or failed. Concurrent uploads converge on one ID; duplicate is advisory.
Body: raw FIT bytes, maximum 4 MiB. Content-Type: application/vnd.ant.fit or application/octet-stream.
| HTTP | Response |
|---|---|
200 |
Existing terminal activity |
202 |
Activity accepted for asynchronous processing |
400 |
Invalid request |
401 |
Missing, invalid, or revoked key |
413 |
Input or result exceeds the endpoint limit |
415 |
Unsupported media type |
422 |
Input validation or analysis failed |
503 |
Service or stored object unavailable; hosted beta may not be open |
List activities#
GET /v1/activities
Workspace-scoped, newest first (created_at then id, both descending). Offset pages can shift when new activities are added. stats always describes the entire workspace, independent of filters.
| Parameter | Location | Details |
|---|---|---|
q |
query | Case-sensitive activity ID substring; trimmed |
status |
query | processing combines received and queued Values: received, queued, processing, ready, failed. |
limit |
query | Range: 1–100. Default: 20. |
offset |
query | Range: 0–100000. Default: 0. |
| HTTP | Response |
|---|---|
200 |
Matching activities and workspace counts |
400 |
Invalid request |
401 |
Missing, invalid, or revoked key |
503 |
Service or stored object unavailable; hosted beta may not be open |
Read activity status#
GET /v1/activities/{id}
| Parameter | Location | Details |
|---|---|---|
id |
path · required | Activity ID returned by upload |
| HTTP | Response |
|---|---|
200 |
Activity metadata; check status for processing state |
401 |
Missing, invalid, or revoked key |
404 |
Unknown resource or inaccessible workspace |
503 |
Service or stored object unavailable; hosted beta may not be open |
Retrieve decoded JSON#
GET /v1/activities/{id}/data
Available only for ready activities. FIT SDK field names and units are retained; source-dependent message fields are intentionally open.
| Parameter | Location | Details |
|---|---|---|
id |
path · required | Activity ID returned by upload |
| HTTP | Response |
|---|---|
200 |
Decoded FIT messages |
401 |
Missing, invalid, or revoked key |
404 |
Unknown resource or inaccessible workspace |
409 |
Conflicting request or resource still processing |
503 |
Service or stored object unavailable; hosted beta may not be open |
Download untouched original#
GET /v1/activities/{id}/original
Available even when decoding failed. Compare its SHA-256 with the activity metadata and your source.
| Parameter | Location | Details |
|---|---|---|
id |
path · required | Activity ID returned by upload |
| HTTP | Response |
|---|---|
200 |
Exact uploaded FIT bytes |
401 |
Missing, invalid, or revoked key |
404 |
Unknown resource or inaccessible workspace |
503 |
Service or stored object unavailable; hosted beta may not be open |
Analyse a GPX course#
POST /v1/event-analyses
One continuous route with elevation, up to 3 MiB / 50,000 points. Saves a private derived result. 100 attempts per owner per UTC day; 1,000 shared. Raw GPX is not retained. No weather or athlete matching. See /docs/event-intelligence for retry and retention semantics.
| Parameter | Location | Details |
|---|---|---|
Idempotency-Key |
header | Keep stable for retries; different input with the same key returns 409. If omitted, normalized input determines duplicate identity. |
Body: JSON with gpx_xml and optional event. See Event Intelligence for input limits, output and retry behavior.
| HTTP | Response |
|---|---|
200 |
Existing terminal attempt; inspect status |
201 |
New completed analysis |
202 |
Matching attempt is processing; retrieve links.self |
400 |
Invalid request |
401 |
Missing, invalid, or revoked key |
409 |
Conflicting request or resource still processing |
410 |
Result has been deleted |
413 |
Input or result exceeds the endpoint limit |
415 |
Unsupported media type |
422 |
Input validation or analysis failed |
429 |
Daily analysis allowance reached |
503 |
Service or stored object unavailable; hosted beta may not be open |
List route analyses#
GET /v1/event-analyses
Newest first, 20 per page. Deleted results are omitted. Offset pages can shift as new records arrive.
| Parameter | Location | Details |
|---|---|---|
offset |
query | Range: 0–100000. Default: 0. |
| HTTP | Response |
|---|---|
200 |
Private attempt summaries |
400 |
Invalid request |
401 |
Missing, invalid, or revoked key |
503 |
Service or stored object unavailable; hosted beta may not be open |
Retrieve a route analysis#
GET /v1/event-analyses/{id}
| Parameter | Location | Details |
|---|---|---|
id |
path · required |
| HTTP | Response |
|---|---|
200 |
Attempt status and result when ready |
401 |
Missing, invalid, or revoked key |
404 |
Unknown resource or inaccessible workspace |
410 |
Result has been deleted |
503 |
Service or stored object unavailable; hosted beta may not be open |
Delete a saved route result#
DELETE /v1/event-analyses/{id}
Removes derived result and event name. Minimal usage and idempotency metadata remains. Does not purge backups or downloaded copies. Processing attempts cannot be deleted.
| Parameter | Location | Details |
|---|---|---|
id |
path · required |
| HTTP | Response |
|---|---|
204 |
Result removed |
401 |
Missing, invalid, or revoked key |
404 |
Unknown resource or inaccessible workspace |
409 |
Conflicting request or resource still processing |
503 |
Service or stored object unavailable; hosted beta may not be open |
Read Event Intelligence usage#
GET /v1/event-analyses/usage
Current UTC month. Attempts count admissions, not validation failures or replays. Measured cost is unknown (null), never inferred as zero. Billing is off.
| HTTP | Response |
|---|---|
200 |
Usage and current daily allowance |
401 |
Missing, invalid, or revoked key |
503 |
Service or stored object unavailable; hosted beta may not be open |
Read combined individual uploads and bulk recordings#
GET /v1/library
Up to 50 rows ordered by ingestion time. Single-upload summaries are null; retrieve their decoded data for metrics. No storage data is rewritten or merged.
| Parameter | Location | Details |
|---|---|---|
athlete_id |
query | Optional workspace filter; athlete-scoped credentials are always constrained to their athlete. |
offset |
query | Range: 0–100000. Default: 0. |
| HTTP | Response |
|---|---|
200 |
Private activity library |
400 |
Invalid request |
401 |
Missing, invalid, or revoked key |
404 |
Unknown resource or inaccessible workspace |
503 |
Service or stored object unavailable; hosted beta may not be open |
Read the athlete connected to a private project#
GET /v1/project-data/{id}
Connection is configured in the signed-in workspace. Credential must authorise the workspace and, for athlete grants, the connected athlete. Disconnected projects return 404.
| Parameter | Location | Details |
|---|---|---|
id |
path · required | |
offset |
query | Range: 0–100000. Default: 0. |
| HTTP | Response |
|---|---|
200 |
Connected athlete library |
400 |
Invalid request |
401 |
Missing, invalid, or revoked key |
404 |
Unknown resource or inaccessible workspace |
503 |
Service or stored object unavailable; hosted beta may not be open |
List bulk-imported recordings#
GET /v1/recordings
| Parameter | Location | Details |
|---|---|---|
athlete_id |
query | Optional workspace filter; athlete-scoped credentials are always constrained to their athlete. |
offset |
query | Range: 0–100000. Default: 0. |
| HTTP | Response |
|---|---|
200 |
Recording summaries |
400 |
Invalid request |
401 |
Missing, invalid, or revoked key |
404 |
Unknown resource or inaccessible workspace |
503 |
Service or stored object unavailable; hosted beta may not be open |
Read a recording summary#
GET /v1/recordings/{id}
| Parameter | Location | Details |
|---|---|---|
id |
path · required |
| HTTP | Response |
|---|---|
200 |
Recording summary |
401 |
Missing, invalid, or revoked key |
404 |
Unknown resource or inaccessible workspace |
503 |
Service or stored object unavailable; hosted beta may not be open |
Read full decoded FIT messages#
GET /v1/recordings/{id}/data
| Parameter | Location | Details |
|---|---|---|
id |
path · required |
| HTTP | Response |
|---|---|
200 |
Decoded evidence |
401 |
Missing, invalid, or revoked key |
404 |
Unknown resource or inaccessible workspace |
503 |
Service or stored object unavailable; hosted beta may not be open |
Download the first uploaded source unchanged#
GET /v1/recordings/{id}/original
May be FIT or FIT.GZ; preserves the original container bytes.
| Parameter | Location | Details |
|---|---|---|
id |
path · required |
| HTTP | Response |
|---|---|
200 |
Original file |
401 |
Missing, invalid, or revoked key |
404 |
Unknown resource or inaccessible workspace |
503 |
Service or stored object unavailable; hosted beta may not be open |
Read app status and current version#
GET /v1/software/{app_id}
| Parameter | Location | Details |
|---|---|---|
app_id |
path · required |
| HTTP | Response |
|---|---|
200 |
Owned app status |
400 |
Invalid request |
401 |
Missing, invalid, or revoked key |
402 |
Active Core subscription required for customer writes |
403 |
Browser access or processing restriction |
404 |
Unknown resource or inaccessible workspace |
409 |
Conflicting request or resource still processing |
429 |
Daily analysis allowance reached |
503 |
Service or stored object unavailable; hosted beta may not be open |
Inspect supported runtime, limits and access#
GET /v1/software/{app_id}/inspect
| Parameter | Location | Details |
|---|---|---|
app_id |
path · required |
| HTTP | Response |
|---|---|
200 |
Builder capability contract |
400 |
Invalid request |
401 |
Missing, invalid, or revoked key |
402 |
Active Core subscription required for customer writes |
403 |
Browser access or processing restriction |
404 |
Unknown resource or inaccessible workspace |
409 |
Conflicting request or resource still processing |
429 |
Daily analysis allowance reached |
503 |
Service or stored object unavailable; hosted beta may not be open |
Download verified current public source#
GET /v1/software/{app_id}/source
Returns the static package or a legacy generated-page object, plus current version. Does not include provider credentials or private records.
| Parameter | Location | Details |
|---|---|---|
app_id |
path · required |
| HTTP | Response |
|---|---|
200 |
Current source |
400 |
Invalid request |
401 |
Missing, invalid, or revoked key |
402 |
Active Core subscription required for customer writes |
403 |
Browser access or processing restriction |
404 |
Unknown resource or inaccessible workspace |
409 |
Conflicting request or resource still processing |
429 |
Daily analysis allowance reached |
503 |
Service or stored object unavailable; hosted beta may not be open |
List up to 200 app-owned releases#
GET /v1/software/{app_id}/releases
| Parameter | Location | Details |
|---|---|---|
app_id |
path · required |
| HTTP | Response |
|---|---|
200 |
Versions and active pointer |
400 |
Invalid request |
401 |
Missing, invalid, or revoked key |
402 |
Active Core subscription required for customer writes |
403 |
Browser access or processing restriction |
404 |
Unknown resource or inaccessible workspace |
409 |
Conflicting request or resource still processing |
429 |
Daily analysis allowance reached |
503 |
Service or stored object unavailable; hosted beta may not be open |
Publish a verified static browser app#
PUT /v1/software/{app_id}/deploy-static
Maximum 6 MiB JSON request. Use a stable new UUID for retries and public:true after reviewing all files. Storage verification precedes atomic activation. Retries can return active:false if a later version is live; do not present that as a successful current publish. 30 releases/day and 200 retained rows per app, including failed attempts. No server code execution.
| Parameter | Location | Details |
|---|---|---|
app_id |
path · required | |
If-Match |
header · required | Exact current version ID, without quotes. A different current version returns 409. |
Body: JSON. See the OpenAPI contract for required fields and AI tools for the builder workflow.
| HTTP | Response |
|---|---|
200 |
Release outcome; check active |
400 |
Invalid request |
401 |
Missing, invalid, or revoked key |
402 |
Active Core subscription required for customer writes |
403 |
Browser access or processing restriction |
404 |
Unknown resource or inaccessible workspace |
409 |
Conflicting request or resource still processing |
429 |
Daily analysis allowance reached |
503 |
Service or stored object unavailable; hosted beta may not be open |
Save a private static update without changing the live app#
PUT /v1/software/{app_id}/stage
| Parameter | Location | Details |
|---|---|---|
app_id |
path · required | |
If-Match |
header · required | Exact current version ID, without quotes. A different current version returns 409. |
Body: JSON. See the OpenAPI contract for required fields and AI tools for the builder workflow.
| HTTP | Response |
|---|---|
200 |
Saved candidate and base version |
400 |
Invalid request |
401 |
Missing, invalid, or revoked key |
402 |
Active Core subscription required for customer writes |
403 |
Browser access or processing restriction |
404 |
Unknown resource or inaccessible workspace |
409 |
Conflicting request or resource still processing |
429 |
Daily analysis allowance reached |
503 |
Service or stored object unavailable; hosted beta may not be open |
Retrieve verified app-owned candidate files for a local preview#
GET /v1/software/{app_id}/release-source/{version}
| Parameter | Location | Details |
|---|---|---|
app_id |
path · required | |
version |
path · required |
| HTTP | Response |
|---|---|
200 |
Private candidate package and base version |
400 |
Invalid request |
401 |
Missing, invalid, or revoked key |
402 |
Active Core subscription required for customer writes |
403 |
Browser access or processing restriction |
404 |
Unknown resource or inaccessible workspace |
409 |
Conflicting request or resource still processing |
429 |
Daily analysis allowance reached |
503 |
Service or stored object unavailable; hosted beta may not be open |
Review changes and check evidence for a saved static update#
GET /v1/software/{app_id}/review/{version}
Returns a private hosted preview URL, exact saved content hash, file change summary and scoped check results. The preview requires the owner’s MovePacket sign-in even for a public project. Manual functional review and unconfigured independent review are not marked passed.
| Parameter | Location | Details |
|---|---|---|
app_id |
path · required | |
version |
path · required |
| HTTP | Response |
|---|---|
200 |
Saved-version review evidence |
400 |
Invalid request |
401 |
Missing, invalid, or revoked key |
402 |
Active Core subscription required for customer writes |
403 |
Browser access or processing restriction |
404 |
Unknown resource or inaccessible workspace |
409 |
Conflicting request or resource still processing |
429 |
Daily analysis allowance reached |
503 |
Service or stored object unavailable; hosted beta may not be open |
Publish the exact saved candidate after owner review#
POST /v1/software/{app_id}/publish-candidate
Requires the live version to still match the candidate base. Does not apply database changes.
| Parameter | Location | Details |
|---|---|---|
app_id |
path · required | |
If-Match |
header · required | Exact current version ID, without quotes. A different current version returns 409. |
Body: JSON. See the OpenAPI contract for required fields and AI tools for the builder workflow.
| HTTP | Response |
|---|---|
200 |
Published candidate |
400 |
Invalid request |
401 |
Missing, invalid, or revoked key |
402 |
Active Core subscription required for customer writes |
403 |
Browser access or processing restriction |
404 |
Unknown resource or inaccessible workspace |
409 |
Conflicting request or resource still processing |
429 |
Daily analysis allowance reached |
503 |
Service or stored object unavailable; hosted beta may not be open |
Restore an app-owned verified release#
POST /v1/software/{app_id}/rollback
| Parameter | Location | Details |
|---|---|---|
app_id |
path · required | |
If-Match |
header · required | Exact current version ID, without quotes. A different current version returns 409. |
Body: JSON. See the OpenAPI contract for required fields and AI tools for the builder workflow.
| HTTP | Response |
|---|---|
200 |
Restored version |
400 |
Invalid request |
401 |
Missing, invalid, or revoked key |
402 |
Active Core subscription required for customer writes |
403 |
Browser access or processing restriction |
404 |
Unknown resource or inaccessible workspace |
409 |
Conflicting request or resource still processing |
429 |
Daily analysis allowance reached |
503 |
Service or stored object unavailable; hosted beta may not be open |
Discover Data Connect capabilities#
GET /v1/software/{app_id}/data-connect
| Parameter | Location | Details |
|---|---|---|
app_id |
path · required |
| HTTP | Response |
|---|---|
200 |
Authorised result |
400 |
Invalid or unsupported input |
401 |
Invalid or expired server app credential |
403 |
Permission, entitlement or current resource access denied |
404 |
Resource unavailable |
409 |
Conflict, changed state or capacity limit |
List athletes explicitly granted to this app#
GET /v1/software/{app_id}/data-connect/athletes
| Parameter | Location | Details |
|---|---|---|
app_id |
path · required | |
before |
query |
| HTTP | Response |
|---|---|
200 |
Authorised result |
400 |
Invalid or unsupported input |
401 |
Invalid or expired server app credential |
403 |
Permission, entitlement or current resource access denied |
404 |
Resource unavailable |
409 |
Conflict, changed state or capacity limit |
Discover this athlete’s app permissions#
GET /v1/software/{app_id}/data-connect/athletes/{athlete_id}
| Parameter | Location | Details |
|---|---|---|
app_id |
path · required | |
athlete_id |
path · required |
| HTTP | Response |
|---|---|
200 |
Authorised result |
400 |
Invalid or unsupported input |
401 |
Invalid or expired server app credential |
403 |
Permission, entitlement or current resource access denied |
404 |
Resource unavailable |
409 |
Conflict, changed state or capacity limit |
Read athlete identity#
GET /v1/software/{app_id}/data-connect/athletes/{athlete_id}/identity
Requires the corresponding current athlete grant. No provider activation or automatic coaching. Activities include quality status; memory and observations retain separate source semantics.
| Parameter | Location | Details |
|---|---|---|
app_id |
path · required | |
athlete_id |
path · required |
| HTTP | Response |
|---|---|
200 |
Authorised result |
400 |
Invalid or unsupported input |
401 |
Invalid or expired server app credential |
403 |
Permission, entitlement or current resource access denied |
404 |
Resource unavailable |
409 |
Conflict, changed state or capacity limit |
Read athlete activities#
GET /v1/software/{app_id}/data-connect/athletes/{athlete_id}/activities
Requires the corresponding current athlete grant. No provider activation or automatic coaching. Activities include quality status; memory and observations retain separate source semantics.
| Parameter | Location | Details |
|---|---|---|
app_id |
path · required | |
athlete_id |
path · required |
| HTTP | Response |
|---|---|
200 |
Authorised result |
400 |
Invalid or unsupported input |
401 |
Invalid or expired server app credential |
403 |
Permission, entitlement or current resource access denied |
404 |
Resource unavailable |
409 |
Conflict, changed state or capacity limit |
Read athlete memory#
GET /v1/software/{app_id}/data-connect/athletes/{athlete_id}/memory
Requires the corresponding current athlete grant. No provider activation or automatic coaching. Activities include quality status; memory and observations retain separate source semantics.
| Parameter | Location | Details |
|---|---|---|
app_id |
path · required | |
athlete_id |
path · required |
| HTTP | Response |
|---|---|
200 |
Authorised result |
400 |
Invalid or unsupported input |
401 |
Invalid or expired server app credential |
403 |
Permission, entitlement or current resource access denied |
404 |
Resource unavailable |
409 |
Conflict, changed state or capacity limit |
Promote a selected app record field into athlete memory#
POST /v1/software/{app_id}/data-connect/athletes/{athlete_id}/memory
Uses the existing single-athlete app record promotion contract documented in Records. No arbitrary memory value is accepted.
| Parameter | Location | Details |
|---|---|---|
app_id |
path · required | |
athlete_id |
path · required |
Body: JSON. See the OpenAPI contract for required fields and AI tools for the builder workflow.
| HTTP | Response |
|---|---|
200 |
Authorised result |
201 |
Promoted evidence ID |
400 |
Invalid or unsupported input |
401 |
Invalid or expired server app credential |
403 |
Permission, entitlement or current resource access denied |
404 |
Resource unavailable |
409 |
Conflict, changed state or capacity limit |
Withdraw supplied memory evidence#
DELETE /v1/software/{app_id}/data-connect/athletes/{athlete_id}/memory
| Parameter | Location | Details |
|---|---|---|
app_id |
path · required | |
athlete_id |
path · required |
Body: JSON. See the OpenAPI contract for required fields and AI tools for the builder workflow.
| HTTP | Response |
|---|---|
200 |
Authorised result |
400 |
Invalid or unsupported input |
401 |
Invalid or expired server app credential |
403 |
Permission, entitlement or current resource access denied |
404 |
Resource unavailable |
409 |
Conflict, changed state or capacity limit |
Read athlete observations#
GET /v1/software/{app_id}/data-connect/athletes/{athlete_id}/observations
Requires the corresponding current athlete grant. No provider activation or automatic coaching. Activities include quality status; memory and observations retain separate source semantics.
| Parameter | Location | Details |
|---|---|---|
app_id |
path · required | |
athlete_id |
path · required |
| HTTP | Response |
|---|---|
200 |
Authorised result |
400 |
Invalid or unsupported input |
401 |
Invalid or expired server app credential |
403 |
Permission, entitlement or current resource access denied |
404 |
Resource unavailable |
409 |
Conflict, changed state or capacity limit |
Read an athlete activity#
GET /v1/software/{app_id}/data-connect/athletes/{athlete_id}/activities/{activity_id}
| Parameter | Location | Details |
|---|---|---|
app_id |
path · required | |
athlete_id |
path · required | |
activity_id |
path · required |
| HTTP | Response |
|---|---|
200 |
Authorised result |
400 |
Invalid or unsupported input |
401 |
Invalid or expired server app credential |
403 |
Permission, entitlement or current resource access denied |
404 |
Resource unavailable |
409 |
Conflict, changed state or capacity limit |
Download original or decoded athlete activity#
GET /v1/software/{app_id}/data-connect/athletes/{athlete_id}/activities/{activity_id}/{part}
| Parameter | Location | Details |
|---|---|---|
app_id |
path · required | |
athlete_id |
path · required | |
activity_id |
path · required | |
part |
path · required | Values: original, data. |
| HTTP | Response |
|---|---|
200 |
Original FIT/FIT.GZ or decoded JSON |
400 |
Invalid or unsupported input |
401 |
Invalid or expired server app credential |
403 |
Permission, entitlement or current resource access denied |
404 |
Resource unavailable |
409 |
Conflict, changed state or capacity limit |
Read dated source records and history#
GET /v1/software/{app_id}/data-connect/athletes/{athlete_id}/records/{domain}
50 records/page, opaque ID cursor. Current is latest effective record per app/domain/record_key/schema version, preserving distinct producers. RetainedSyntheticPlanV2 is an internal synthetic provider-plan read variant requiring current named operation grants as well as Foundation read grants; version-1 records cannot supersede or withdraw it. as_of filters effective dates under current permissions; it is not a reconstruction of what was known at that time. Local-only measurements use capture time for selection and retain the unzoned measurement date separately.
| Parameter | Location | Details |
|---|---|---|
app_id |
path · required | |
athlete_id |
path · required | |
domain |
path · required | Values: measurements, coaching_relationship, goals, events, constraints, availability, history, performance_targets, subjective_feedback, coach_observations, decisions, interventions, outcomes, current_priorities, prescriptions. |
before |
query | |
view |
query | Values: history, current. Default: history. |
as_of |
query |
| HTTP | Response |
|---|---|
200 |
Authorised result |
400 |
Invalid or unsupported input |
401 |
Invalid or expired server app credential |
403 |
Permission, entitlement or current resource access denied |
404 |
Resource unavailable |
409 |
Conflict, changed state or capacity limit |
Supply one immutable athlete record#
POST /v1/software/{app_id}/data-connect/athletes/{athlete_id}/records/{domain}
Version 1 only; internal provider-plan receipts cannot be supplied here. 32 KiB maximum. Server app key plus per-athlete/domain supply grant and paid writes. Source rights are caller assertions, not provider authorisation. Same request_id and identical body replay safely; changed body conflicts. No direct provider calls.
| Parameter | Location | Details |
|---|---|---|
app_id |
path · required | |
athlete_id |
path · required | |
domain |
path · required | Values: measurements, coaching_relationship, goals, events, constraints, availability, history, performance_targets, subjective_feedback, coach_observations, decisions, interventions, outcomes, current_priorities, prescriptions. |
Body: JSON. See the OpenAPI contract for required fields and AI tools for the builder workflow.
| HTTP | Response |
|---|---|
200 |
Authorised result |
201 |
Created record with permanent ID |
400 |
Invalid or unsupported input |
401 |
Invalid or expired server app credential |
403 |
Permission, entitlement or current resource access denied |
404 |
Resource unavailable |
409 |
Conflict, changed state or capacity limit |
Read a retained domain record#
GET /v1/software/{app_id}/data-connect/athletes/{athlete_id}/records/{domain}/{record_id}
| Parameter | Location | Details |
|---|---|---|
app_id |
path · required | |
athlete_id |
path · required | |
domain |
path · required | Values: measurements, coaching_relationship, goals, events, constraints, availability, history, performance_targets, subjective_feedback, coach_observations, decisions, interventions, outcomes, current_priorities, prescriptions. |
record_id |
path · required |
| HTTP | Response |
|---|---|
200 |
Authorised result |
400 |
Invalid or unsupported input |
401 |
Invalid or expired server app credential |
403 |
Permission, entitlement or current resource access denied |
404 |
Resource unavailable |
409 |
Conflict, changed state or capacity limit |
Withdraw this app’s version-1 domain record#
DELETE /v1/software/{app_id}/data-connect/athletes/{athlete_id}/records/{domain}/{record_id}
| Parameter | Location | Details |
|---|---|---|
app_id |
path · required | |
athlete_id |
path · required | |
domain |
path · required | Values: measurements, coaching_relationship, goals, events, constraints, availability, history, performance_targets, subjective_feedback, coach_observations, decisions, interventions, outcomes, current_priorities, prescriptions. |
record_id |
path · required |
| HTTP | Response |
|---|---|
200 |
Authorised result |
400 |
Invalid or unsupported input |
401 |
Invalid or expired server app credential |
403 |
Permission, entitlement or current resource access denied |
404 |
Resource unavailable |
409 |
Conflict, changed state or capacity limit |
List this app’s imports for the athlete#
GET /v1/software/{app_id}/data-connect/athletes/{athlete_id}/imports
| Parameter | Location | Details |
|---|---|---|
app_id |
path · required | |
athlete_id |
path · required |
| HTTP | Response |
|---|---|
200 |
Authorised result |
400 |
Invalid or unsupported input |
401 |
Invalid or expired server app credential |
403 |
Permission, entitlement or current resource access denied |
404 |
Resource unavailable |
409 |
Conflict, changed state or capacity limit |
Create an athlete FIT import manifest#
POST /v1/software/{app_id}/data-connect/athletes/{athlete_id}/imports
Requires training_data.supply, paid account and activated Core app. Maximum 200 files, 4 MiB/file, 200 MiB/batch. Uses existing manifest validation, idempotency and limits. Accepted work belongs to the workspace.
| Parameter | Location | Details |
|---|---|---|
app_id |
path · required | |
athlete_id |
path · required |
Body: JSON. See the OpenAPI contract for required fields and AI tools for the builder workflow.
| HTTP | Response |
|---|---|
200 |
Authorised result |
201 |
Import session ID |
400 |
Invalid or unsupported input |
401 |
Invalid or expired server app credential |
403 |
Permission, entitlement or current resource access denied |
404 |
Resource unavailable |
409 |
Conflict, changed state or capacity limit |
Read this app’s import status#
GET /v1/software/{app_id}/data-connect/athletes/{athlete_id}/imports/{session_id}
| Parameter | Location | Details |
|---|---|---|
app_id |
path · required | |
athlete_id |
path · required | |
session_id |
path · required |
| HTTP | Response |
|---|---|
200 |
Authorised result |
400 |
Invalid or unsupported input |
401 |
Invalid or expired server app credential |
403 |
Permission, entitlement or current resource access denied |
404 |
Resource unavailable |
409 |
Conflict, changed state or capacity limit |
Upload an original FIT or FIT.GZ file#
PUT /v1/software/{app_id}/data-connect/athletes/{athlete_id}/imports/{session_id}/items/{item_id}
| Parameter | Location | Details |
|---|---|---|
app_id |
path · required | |
athlete_id |
path · required | |
session_id |
path · required | |
item_id |
path · required |
Body: raw FIT bytes, maximum 4 MiB. Content-Type: application/vnd.ant.fit or application/octet-stream.
| HTTP | Response |
|---|---|
200 |
Authorised result |
202 |
File accepted for processing |
400 |
Invalid or unsupported input |
401 |
Invalid or expired server app credential |
403 |
Permission, entitlement or current resource access denied |
404 |
Resource unavailable |
409 |
Conflict, changed state or capacity limit |
Retry eligible failed file processing#
POST /v1/software/{app_id}/data-connect/athletes/{athlete_id}/imports/{session_id}/items/{item_id}/retry
| Parameter | Location | Details |
|---|---|---|
app_id |
path · required | |
athlete_id |
path · required | |
session_id |
path · required | |
item_id |
path · required |
| HTTP | Response |
|---|---|
200 |
Authorised result |
400 |
Invalid or unsupported input |
401 |
Invalid or expired server app credential |
403 |
Permission, entitlement or current resource access denied |
404 |
Resource unavailable |
409 |
Conflict, changed state or capacity limit |
Download an original from this app’s import#
GET /v1/software/{app_id}/data-connect/athletes/{athlete_id}/imports/{session_id}/items/{item_id}/original
Also requires training_data.read.
| Parameter | Location | Details |
|---|---|---|
app_id |
path · required | |
athlete_id |
path · required | |
session_id |
path · required | |
item_id |
path · required |
| HTTP | Response |
|---|---|
200 |
Authorised result |
400 |
Invalid or unsupported input |
401 |
Invalid or expired server app credential |
403 |
Permission, entitlement or current resource access denied |
404 |
Resource unavailable |
409 |
Conflict, changed state or capacity limit |
Discover current connection capabilities and intake limits#
GET /v1/workspace-builder
| HTTP | Response |
|---|---|
200 |
Current capability flags, links and limits |
400 |
Invalid bounded input |
401 |
Invalid proof |
402 |
Subscription required |
403 |
Current permission denies access |
404 |
Project or operation unavailable |
409 |
State changed or preparation incomplete |
413 |
Package too large |
429 |
Workspace or release limit |
503 |
Storage unavailable |
Find explicitly selected active athletes by name#
GET /v1/workspace-builder/athletes
Returns only id, name and status. Names do not establish permission or a unique identity. Resolve ambiguity before uploading. Current selections are paginated in pages of 50.
| Parameter | Location | Details |
|---|---|---|
q |
query | |
offset |
query | Range: 0–100000. Default: 0. |
| HTTP | Response |
|---|---|
200 |
Selected athletes, offset and has_more |
400 |
Invalid bounded input |
401 |
Invalid proof |
402 |
Subscription required |
403 |
Current permission denies access |
404 |
Project or operation unavailable |
409 |
State changed or preparation incomplete |
413 |
Package too large |
429 |
Workspace or release limit |
503 |
Storage unavailable |
Create and select one athlete with explicit athlete-create permission#
POST /v1/workspace-builder/athletes
Permission defaults off. Reuse the same request_id and exact payload after interruption. Conflicting reuse returns 409. A removed selection cannot be restored by replay. Active paid subscription required; at most 100 new intake athlete requests per day, 1000 retained per workspace and 50 selected athletes per connection. Limit or lost access returns 403. This creates an Athlete record, not a login or provider connection.
Body: JSON. See the OpenAPI contract for required fields and AI tools for the builder workflow.
| HTTP | Response |
|---|---|
200 |
Identical creation replay |
201 |
Created athlete ID |
400 |
Invalid bounded input |
401 |
Invalid proof |
402 |
Subscription required |
403 |
Current permission denies access |
404 |
Project or operation unavailable |
409 |
State changed or preparation incomplete |
413 |
Package too large |
429 |
Workspace or release limit |
503 |
Storage unavailable |
List this connection’s latest 50 imports for a selected athlete#
GET /v1/workspace-builder/athletes/{athlete_id}/imports
| Parameter | Location | Details |
|---|---|---|
athlete_id |
path · required |
| HTTP | Response |
|---|---|
200 |
Scoped import sessions |
400 |
Invalid bounded input |
401 |
Invalid proof |
402 |
Subscription required |
403 |
Current permission denies access |
404 |
Project or operation unavailable |
409 |
State changed or preparation incomplete |
413 |
Package too large |
429 |
Workspace or release limit |
503 |
Storage unavailable |
Admit a bounded FIT/FIT.GZ import manifest#
POST /v1/workspace-builder/athletes/{athlete_id}/imports
Requires import permission, current athlete selection and an active paid subscription. Body athlete_id must match the path. Reuse request_id and the exact manifest to resume. Maximum 200 files, 4 MiB per file and expanded FIT, 200 MiB per batch, 100 manifests per UTC day and 1000 retained per workspace. Limit or lost access returns 403. Only this connection can use this credential to read its import status and originals; no existing athlete ride-history access is added. Already stored files continue processing under current workspace, athlete and privacy restrictions after connection revocation. No ZIP archive support.
| Parameter | Location | Details |
|---|---|---|
athlete_id |
path · required |
Body: JSON. See the OpenAPI contract for required fields and AI tools for the builder workflow.
| HTTP | Response |
|---|---|
200 |
Replayed import session |
201 |
New import session |
400 |
Invalid bounded input |
401 |
Invalid proof |
402 |
Subscription required |
403 |
Current permission denies access |
404 |
Project or operation unavailable |
409 |
State changed or preparation incomplete |
413 |
Package too large |
429 |
Workspace or release limit |
503 |
Storage unavailable |
Read this connection’s import items and states#
GET /v1/workspace-builder/athletes/{athlete_id}/imports/{session_id}
| Parameter | Location | Details |
|---|---|---|
athlete_id |
path · required | |
session_id |
path · required |
| HTTP | Response |
|---|---|
200 |
Import session and items |
400 |
Invalid bounded input |
401 |
Invalid proof |
402 |
Subscription required |
403 |
Current permission denies access |
404 |
Project or operation unavailable |
409 |
State changed or preparation incomplete |
413 |
Package too large |
429 |
Workspace or release limit |
503 |
Storage unavailable |
Upload original file bytes matching the admitted item hash and size#
PUT /v1/workspace-builder/athletes/{athlete_id}/imports/{session_id}/items/{item_id}
| Parameter | Location | Details |
|---|---|---|
athlete_id |
path · required | |
session_id |
path · required | |
item_id |
path · required |
Body: raw FIT bytes, maximum 4 MiB. Content-Type: application/vnd.ant.fit or application/octet-stream.
| HTTP | Response |
|---|---|
200 |
Previously stored item |
202 |
Stored and queued |
400 |
Invalid bounded input |
401 |
Invalid proof |
402 |
Subscription required |
403 |
Current permission denies access |
404 |
Project or operation unavailable |
409 |
State changed or preparation incomplete |
413 |
Package too large |
415 |
Send application/octet-stream |
429 |
Workspace or release limit |
503 |
Storage unavailable |
Explicitly retry an eligible processing failure#
POST /v1/workspace-builder/athletes/{athlete_id}/imports/{session_id}/items/{item_id}/retry
| Parameter | Location | Details |
|---|---|---|
athlete_id |
path · required | |
session_id |
path · required | |
item_id |
path · required |
| HTTP | Response |
|---|---|
202 |
Queued for processing |
400 |
Invalid bounded input |
401 |
Invalid proof |
402 |
Subscription required |
403 |
Current permission denies access |
404 |
Project or operation unavailable |
409 |
State changed or preparation incomplete |
413 |
Package too large |
429 |
Workspace or release limit |
503 |
Storage unavailable |
Download this connection’s exact stored original#
GET /v1/workspace-builder/athletes/{athlete_id}/imports/{session_id}/items/{item_id}/original
| Parameter | Location | Details |
|---|---|---|
athlete_id |
path · required | |
session_id |
path · required | |
item_id |
path · required |
| HTTP | Response |
|---|---|
200 |
Private original bytes |
400 |
Invalid bounded input |
401 |
Invalid proof |
402 |
Subscription required |
403 |
Current permission denies access |
404 |
Project or operation unavailable |
409 |
State changed or preparation incomplete |
413 |
Package too large |
429 |
Workspace or release limit |
503 |
Storage unavailable |
List up to 50 Projects currently granted to this connection#
GET /v1/workspace-builder/projects
| HTTP | Response |
|---|---|
200 |
Selected Projects only |
400 |
Invalid bounded input |
401 |
Invalid proof |
402 |
Subscription required |
403 |
Current permission denies access |
404 |
Project or operation unavailable |
409 |
State changed or preparation incomplete |
413 |
Package too large |
429 |
Workspace or release limit |
503 |
Storage unavailable |
Create an internal Project and grant this connection access#
POST /v1/workspace-builder/projects
Uses the canonical paid creation transition. Reuse the same request_key and payload for retries. Up to 50 workspace setup records. Does not call a model, provision external hosting, buy infrastructure or publish. Removing Project access prevents a creation replay from restoring it.
Body: JSON. See the OpenAPI contract for required fields and AI tools for the builder workflow.
| HTTP | Response |
|---|---|
200 |
Replayed Project |
201 |
Created Project |
202 |
Saved; preparation needs attention |
400 |
Invalid bounded input |
401 |
Invalid proof |
402 |
Subscription required |
403 |
Current permission denies access |
404 |
Project or operation unavailable |
409 |
State changed or preparation incomplete |
413 |
Package too large |
429 |
Workspace or release limit |
503 |
Storage unavailable |
Inspect Project state and allowed operations#
GET /v1/workspace-builder/projects/{project_id}/inspect
| Parameter | Location | Details |
|---|---|---|
project_id |
path · required |
| HTTP | Response |
|---|---|
200 |
Project-scoped result |
400 |
Invalid bounded input |
401 |
Invalid proof |
402 |
Subscription required |
403 |
Current permission denies access |
404 |
Project or operation unavailable |
409 |
State changed or preparation incomplete |
413 |
Package too large |
429 |
Workspace or release limit |
503 |
Storage unavailable |
Read the active source#
GET /v1/workspace-builder/projects/{project_id}/source
| Parameter | Location | Details |
|---|---|---|
project_id |
path · required |
| HTTP | Response |
|---|---|
200 |
Project-scoped result |
400 |
Invalid bounded input |
401 |
Invalid proof |
402 |
Subscription required |
403 |
Current permission denies access |
404 |
Project or operation unavailable |
409 |
State changed or preparation incomplete |
413 |
Package too large |
429 |
Workspace or release limit |
503 |
Storage unavailable |
Read the selected working source#
GET /v1/workspace-builder/projects/{project_id}/working-source
| Parameter | Location | Details |
|---|---|---|
project_id |
path · required |
| HTTP | Response |
|---|---|
200 |
Project-scoped result |
400 |
Invalid bounded input |
401 |
Invalid proof |
402 |
Subscription required |
403 |
Current permission denies access |
404 |
Project or operation unavailable |
409 |
State changed or preparation incomplete |
413 |
Package too large |
429 |
Workspace or release limit |
503 |
Storage unavailable |
List saved versions#
GET /v1/workspace-builder/projects/{project_id}/releases
| Parameter | Location | Details |
|---|---|---|
project_id |
path · required |
| HTTP | Response |
|---|---|
200 |
Project-scoped result |
400 |
Invalid bounded input |
401 |
Invalid proof |
402 |
Subscription required |
403 |
Current permission denies access |
404 |
Project or operation unavailable |
409 |
State changed or preparation incomplete |
413 |
Package too large |
429 |
Workspace or release limit |
503 |
Storage unavailable |
Read saved-version review evidence#
GET /v1/workspace-builder/projects/{project_id}/review/{version}
| Parameter | Location | Details |
|---|---|---|
project_id |
path · required | |
version |
path · required |
| HTTP | Response |
|---|---|
200 |
Project-scoped result |
400 |
Invalid bounded input |
401 |
Invalid proof |
402 |
Subscription required |
403 |
Current permission denies access |
404 |
Project or operation unavailable |
409 |
State changed or preparation incomplete |
413 |
Package too large |
429 |
Workspace or release limit |
503 |
Storage unavailable |
Read a saved private candidate#
GET /v1/workspace-builder/projects/{project_id}/release-source/{version}
| Parameter | Location | Details |
|---|---|---|
project_id |
path · required | |
version |
path · required |
| HTTP | Response |
|---|---|
200 |
Project-scoped result |
400 |
Invalid bounded input |
401 |
Invalid proof |
402 |
Subscription required |
403 |
Current permission denies access |
404 |
Project or operation unavailable |
409 |
State changed or preparation incomplete |
413 |
Package too large |
429 |
Workspace or release limit |
503 |
Storage unavailable |
Save a private static candidate for owner review#
PUT /v1/workspace-builder/projects/{project_id}/stage
Same limits and immutable release validation as app-specific stage. Never publishes. Reuses a stable release_id for retries. Existing live and working versions must match.
| Parameter | Location | Details |
|---|---|---|
project_id |
path · required | |
If-Match |
header · required | |
If-Working-Match |
header · required | Working version UUID followed by colon and generation |
Body: JSON. See the OpenAPI contract for required fields and AI tools for the builder workflow.
| HTTP | Response |
|---|---|
200 |
Saved version and private preview URL |
400 |
Invalid bounded input |
401 |
Invalid proof |
402 |
Subscription required |
403 |
Current permission denies access |
404 |
Project or operation unavailable |
409 |
State changed or preparation incomplete |
413 |
Package too large |
429 |
Workspace or release limit |
503 |
Storage unavailable |
Response schemas#
See the data model for field meanings and the OpenAPI JSON for complete machine-readable response schemas. The downloadable contract includes only implemented server endpoints.