Organization and people

Read your organization, its athletes with their sport profile, coaches and teams. Create, update and delete athletes and teams, and choose which athletes each coach sees.

Athletes and coaches are users with a membership in your organization. Athletes carry the ids of their teams, and a team carries the ids of its athletes. Resolve ids with the matching detail endpoint.

The POST, PATCH, PUT and DELETE endpoints need your organization's own API key and follow the write rules.

Get your organization

GET/organization

Returns the organization that owns the API key. Use it to confirm a key works and which organization it is scoped to.

Request

curl "https://api-next.vitruve.fit/v1/organization" \
  -H "X-API-Key: YOUR_API_KEY"

Response 200

{
  "ok": true,
  "timestamp": 1738247125207,
  "data": {
    "id": "7d3f8a52-1c0e-4b8e-9f4a-2e6b1d9c5a10",
    "name": "Northgate Performance",
    "category": "professional-team",
    "measurementSystem": "metric",
    "phoneNumber": null,
    "createdAt": "2025-06-10T09:00:00.000Z",
    "updatedAt": "2026-01-21T15:40:12.000Z",
    "deletedAt": null
  }
}

Response fields

iduuid
Organization id.
namestring
Organization name.
categorystring
Organization category chosen at sign-up.
measurementSystemstring
The organization’s default measurement system.

Failures are described in error codes.

List athletes

GET/athletes

Active athletes of your organization, ordered by surname, then name. Each athlete carries their membership and the ids of their teams.

Request

curl "https://api-next.vitruve.fit/v1/athletes?limit=2&teamId=9a4f6d13-8b25-4c7e-93a0-1f5d2e8b7c64" \
  -H "X-API-Key: YOUR_API_KEY"

Response 200

{
  "ok": true,
  "timestamp": 1738247125207,
  "data": [
    {
      "id": "3b9c1e24-6f7a-4d2b-8c15-a40e9d7f1b62",
      "name": "Marta",
      "surname": "Ibáñez",
      "email": "marta.ibanez@example.com",
      "isVerified": true,
      "profession": "athlete",
      "gender": "female",
      "measurementSystem": "metric",
      "avatarPath": null,
      "height": 172,
      "weight": 64,
      "birthDate": "1998-04-12T00:00:00.000Z",
      "dominantSide": "right",
      "createdAt": "2025-09-02T08:14:31.402Z",
      "updatedAt": "2026-03-18T10:22:05.117Z",
      "deletedAt": null,
      "organizationsToUsers": [
        {
          "id": "0d2f6b8e-5a17-4c93-b4e1-93a7c0d58f21",
          "userId": "3b9c1e24-6f7a-4d2b-8c15-a40e9d7f1b62",
          "organizationId": "7d3f8a52-1c0e-4b8e-9f4a-2e6b1d9c5a10",
          "roleId": "dc82d01f-1136-4fcb-97dc-11a8b2203d98",
          "createdAt": "2025-09-02T08:14:31.402Z",
          "updatedAt": "2025-09-02T08:14:31.402Z",
          "deletedAt": null
        }
      ],
      "teams": [
        {
          "id": "9a4f6d13-8b25-4c7e-93a0-1f5d2e8b7c64"
        }
      ]
    }
  ],
  "meta": {
    "limit": 2,
    "hasMore": true,
    "nextCursor": "ZTU2M2ZlYzMtM2IxYy00…"
  }
}

Query parameters

searchstring
Case-insensitive. Every word must match the name, surname or email, so a full name such as Ana García works.
teamIduuid
Only athletes in this team.
limitintegerdefault 50
Page size, 1–100.
cursorstring
meta.nextCursor from the previous page. Omit it to get the first page.

Response fields

iduuid
Athlete id. Pass it as userId to the workout, metric and wellness endpoints.
namestring
First name.
surnamestring
Last name.
emailstringnullable
Email address, if the athlete has one.
isVerifiedboolean
Whether the athlete has verified their email.
genderstringnullable
Gender as entered in the athlete profile.
birthDatedatetimenullable
Date of birth, serialized as a UTC timestamp at midnight.
heightintegernullable
Height in cm, whatever the athlete’s measurementSystem: convert for display.
weightintegernullable
Body weight in kg, whatever the athlete’s measurementSystem: convert for display.
dominantSidestringnullable
Dominant side, left or right.
measurementSystemstringnullable
The athlete’s preferred measurement system.
organizationsToUsers[]object[]
The athlete’s membership in your organization. roleId is always the Athlete role.
teams[].iduuid
Teams the athlete belongs to. Resolve with GET /teams/{id}.

Failures are described in error codes.

Get an athlete

GET/athletes/{id}

One athlete of your organization.

Request

curl "https://api-next.vitruve.fit/v1/athletes/3b9c1e24-6f7a-4d2b-8c15-a40e9d7f1b62" \
  -H "X-API-Key: YOUR_API_KEY"

Response 200

{
  "ok": true,
  "timestamp": 1738247125207,
  "data": {
    "id": "3b9c1e24-6f7a-4d2b-8c15-a40e9d7f1b62",
    "name": "Marta",
    "surname": "Ibáñez",
    "email": "marta.ibanez@example.com",
    "isVerified": true,
    "profession": "athlete",
    "gender": "female",
    "measurementSystem": "metric",
    "avatarPath": null,
    "height": 172,
    "weight": 64,
    "birthDate": "1998-04-12T00:00:00.000Z",
    "dominantSide": "right",
    "createdAt": "2025-09-02T08:14:31.402Z",
    "updatedAt": "2026-03-18T10:22:05.117Z",
    "deletedAt": null,
    "organizationsToUsers": [
      {
        "id": "0d2f6b8e-5a17-4c93-b4e1-93a7c0d58f21",
        "userId": "3b9c1e24-6f7a-4d2b-8c15-a40e9d7f1b62",
        "organizationId": "7d3f8a52-1c0e-4b8e-9f4a-2e6b1d9c5a10",
        "roleId": "dc82d01f-1136-4fcb-97dc-11a8b2203d98",
        "createdAt": "2025-09-02T08:14:31.402Z",
        "updatedAt": "2025-09-02T08:14:31.402Z",
        "deletedAt": null
      }
    ],
    "teams": [
      {
        "id": "9a4f6d13-8b25-4c7e-93a0-1f5d2e8b7c64"
      }
    ]
  }
}

Path parameters

iduuidrequired
Resource id.

Response fields

iduuid
Athlete id. Pass it as userId to the workout, metric and wellness endpoints.
namestring
First name.
surnamestring
Last name.
emailstringnullable
Email address, if the athlete has one.
isVerifiedboolean
Whether the athlete has verified their email.
genderstringnullable
Gender as entered in the athlete profile.
birthDatedatetimenullable
Date of birth, serialized as a UTC timestamp at midnight.
heightintegernullable
Height in cm, whatever the athlete’s measurementSystem: convert for display.
weightintegernullable
Body weight in kg, whatever the athlete’s measurementSystem: convert for display.
dominantSidestringnullable
Dominant side, left or right.
measurementSystemstringnullable
The athlete’s preferred measurement system.
organizationsToUsers[]object[]
The athlete’s membership in your organization. roleId is always the Athlete role.
teams[].iduuid
Teams the athlete belongs to. Resolve with GET /teams/{id}.

Failures are described in error codes.

Get an athlete’s sport profile

GET/athletes/{id}/profile

The athlete’s sport profile with its dated versions. The version with validTo: null is the current one.

Request

curl "https://api-next.vitruve.fit/v1/athletes/3b9c1e24-6f7a-4d2b-8c15-a40e9d7f1b62/profile" \
  -H "X-API-Key: YOUR_API_KEY"

Response 200

{
  "ok": true,
  "timestamp": 1738247125207,
  "data": {
    "id": "6e0b9d41-c2a8-4f35-8b17-d5a3e92c0f68",
    "userId": "3b9c1e24-6f7a-4d2b-8c15-a40e9d7f1b62",
    "organizationId": "7d3f8a52-1c0e-4b8e-9f4a-2e6b1d9c5a10",
    "revision": 2,
    "createdAt": "2025-09-02T08:20:00.000Z",
    "updatedAt": "2026-02-01T09:00:00.000Z",
    "deletedAt": null,
    "versions": [
      {
        "id": "b3a8d5f0-71e2-4c69-90a4-e1c7f2d83b56",
        "profileId": "6e0b9d41-c2a8-4f35-8b17-d5a3e92c0f68",
        "validFrom": "2026-02-01T00:00:00.000Z",
        "validTo": null,
        "sport": "basketball",
        "position": "guard",
        "competitionLevel": "professional",
        "squad": "first-team",
        "strengthTrainingStartedYear": 2016,
        "recordedAt": "2026-02-01T09:00:00.000Z",
        "recordedByUserId": "5e2a7b90-4c13-4f8d-a6b1-d93f0e8c2a47"
      }
    ]
  }
}

Path parameters

iduuidrequired
Resource id.

Response fields

revisioninteger
Increments every time the profile changes.
versions[]object[]
Profile history, newest validFrom first.
versions[].validFromdatetime
First day this version applies.
versions[].validTodatetimenullable
null for the current version.
versions[].recordedByUserIduuid
Who recorded the version: the athlete themselves, or a staff member. Resolve with GET /athletes/{id} or GET /coaches/{id}.

Failures are described in error codes.

Create an athlete

POST/athletes

Creates an athlete in your organization and answers it in the shape of GET /athletes/{id}.

Request

curl -X POST "https://api-next.vitruve.fit/v1/athletes" \
  -H "X-API-Key: YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: YOUR_OPERATION_ID" \
  -d '{
    "name": "Lucas",
    "surname": "Moreau",
    "email": "lucas.moreau@example.com",
    "gender": "male",
    "birthDate": "2003-07-21",
    "dominantSide": "left",
    "measurementSystem": "metric",
    "height": 184,
    "weight": 81,
    "teamIds": [
      "9a4f6d13-8b25-4c7e-93a0-1f5d2e8b7c64"
    ]
  }'

Response 200

{
  "ok": true,
  "timestamp": 1738247125207,
  "data": {
    "id": "6d2b8f14-a9c3-4e57-8b06-f31c7a5d9e42",
    "name": "Lucas",
    "surname": "Moreau",
    "email": "lucas.moreau@example.com",
    "isVerified": false,
    "profession": "athlete",
    "gender": "male",
    "measurementSystem": "metric",
    "avatarPath": null,
    "height": 184,
    "weight": 81,
    "birthDate": "2003-07-21T00:00:00.000Z",
    "dominantSide": "left",
    "createdAt": "2026-10-13T09:30:12.418Z",
    "updatedAt": "2026-10-13T09:30:12.418Z",
    "deletedAt": null,
    "organizationsToUsers": [
      {
        "id": "a4c81e3f-0b67-4d29-95f2-6e1d7b3c08a5",
        "userId": "6d2b8f14-a9c3-4e57-8b06-f31c7a5d9e42",
        "organizationId": "7d3f8a52-1c0e-4b8e-9f4a-2e6b1d9c5a10",
        "roleId": "dc82d01f-1136-4fcb-97dc-11a8b2203d98",
        "createdAt": "2026-10-13T09:30:12.418Z",
        "updatedAt": "2026-10-13T09:30:12.418Z",
        "deletedAt": null
      }
    ],
    "teams": [
      {
        "id": "9a4f6d13-8b25-4c7e-93a0-1f5d2e8b7c64"
      }
    ]
  }
}

Headers

Idempotency-Keystring
Request header. 1 to 255 visible ASCII characters you choose per operation, such as a UUID or your own record’s id. A retry with the same key and the same request returns the first answer instead of creating again.

Body

namestringrequired
First name, up to 255 characters.
surnamestringrequired
Last name, up to 255 characters.
emailstringnullable
Email address, stored as sent. Another user with the same email, in any letter case, answers 409.
gendermale | female | othernullable
Gender.
birthDatedatenullable
Date of birth: YYYY-MM-DD or an ISO 8601 datetime with an offset. Not in the future.
dominantSideleft | rightnullable
Dominant side.
measurementSystemmetric | imperialnullable
Preferred measurement system.
heightintegernullable
Height in cm, 0–300.
weightintegernullable
Body weight in kg, 0–500.
teamIdsuuid[]
Teams of your organization to add the athlete to, at most 100.

Notes

  • 403 when the plan’s athlete limit is reached. Pending athlete invitations count toward it, and so do creates running at the same time.
  • 409 when the email belongs to another user, in any letter case.
  • 400 when a teamIds entry is not a team of your organization.
  • Send an Idempotency-Key header to retry the create safely after a timeout: a retry with the same key and body answers the first result instead of creating again.

Failures are described in error codes.

Update an athlete

Request body: any of the create fields except teamIds, at least one. Send null to clear an optional field. Teams are changed on the team, with PATCH /teams/{id} or PUT /teams/{id}/athletes/{athleteId}.

PATCH/athletes/{id}

Changes only the fields sent, and answers the updated athlete. null clears an optional field.

Request

curl -X PATCH "https://api-next.vitruve.fit/v1/athletes/6d2b8f14-a9c3-4e57-8b06-f31c7a5d9e42" \
  -H "X-API-Key: YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "weight": 83,
    "dominantSide": "right"
  }'

Response 200

{
  "ok": true,
  "timestamp": 1738247125207,
  "data": {
    "id": "6d2b8f14-a9c3-4e57-8b06-f31c7a5d9e42",
    "name": "Lucas",
    "surname": "Moreau",
    "email": "lucas.moreau@example.com",
    "isVerified": false,
    "profession": "athlete",
    "gender": "male",
    "measurementSystem": "metric",
    "avatarPath": null,
    "height": 184,
    "weight": 83,
    "birthDate": "2003-07-21T00:00:00.000Z",
    "dominantSide": "right",
    "createdAt": "2026-10-13T09:30:12.418Z",
    "updatedAt": "2026-10-14T07:05:40.220Z",
    "deletedAt": null,
    "organizationsToUsers": [
      {
        "id": "a4c81e3f-0b67-4d29-95f2-6e1d7b3c08a5",
        "userId": "6d2b8f14-a9c3-4e57-8b06-f31c7a5d9e42",
        "organizationId": "7d3f8a52-1c0e-4b8e-9f4a-2e6b1d9c5a10",
        "roleId": "dc82d01f-1136-4fcb-97dc-11a8b2203d98",
        "createdAt": "2026-10-13T09:30:12.418Z",
        "updatedAt": "2026-10-13T09:30:12.418Z",
        "deletedAt": null
      }
    ],
    "teams": [
      {
        "id": "9a4f6d13-8b25-4c7e-93a0-1f5d2e8b7c64"
      }
    ]
  }
}

Path parameters

iduuidrequired
Resource id.

Body

namestring
First name, up to 255 characters.
surnamestring
Last name, up to 255 characters.
emailstringnullable
Email address, stored as sent. Another user with the same email, in any letter case, answers 409.
gendermale | female | othernullable
Gender.
birthDatedatenullable
Date of birth: YYYY-MM-DD or an ISO 8601 datetime with an offset. Not in the future.
dominantSideleft | rightnullable
Dominant side.
measurementSystemmetric | imperialnullable
Preferred measurement system.
heightintegernullable
Height in cm, 0–300.
weightintegernullable
Body weight in kg, 0–500.

Notes

  • 403 when the athlete has claimed their own Vitruve account: they manage their profile themselves.
  • Once the athlete is verified, birthDate and dominantSide are theirs only: sending either answers 403.
  • Teams are changed on the team: PATCH /teams/{id}, PUT /teams/{id}/athletes/{athleteId}.

Failures are described in error codes.

Delete an athlete

DELETE/athletes/{id}

Removes an athlete from your organization and answers the athlete as it was before.

Request

curl -X DELETE "https://api-next.vitruve.fit/v1/athletes/6d2b8f14-a9c3-4e57-8b06-f31c7a5d9e42" \
  -H "X-API-Key: YOUR_API_KEY"

Response 200

{
  "ok": true,
  "timestamp": 1738247125207,
  "data": {
    "id": "6d2b8f14-a9c3-4e57-8b06-f31c7a5d9e42",
    "name": "Lucas",
    "surname": "Moreau",
    "email": "lucas.moreau@example.com",
    "isVerified": false,
    "profession": "athlete",
    "gender": "male",
    "measurementSystem": "metric",
    "avatarPath": null,
    "height": 184,
    "weight": 83,
    "birthDate": "2003-07-21T00:00:00.000Z",
    "dominantSide": "right",
    "createdAt": "2026-10-13T09:30:12.418Z",
    "updatedAt": "2026-10-14T07:05:40.220Z",
    "deletedAt": null,
    "organizationsToUsers": [
      {
        "id": "a4c81e3f-0b67-4d29-95f2-6e1d7b3c08a5",
        "userId": "6d2b8f14-a9c3-4e57-8b06-f31c7a5d9e42",
        "organizationId": "7d3f8a52-1c0e-4b8e-9f4a-2e6b1d9c5a10",
        "roleId": "dc82d01f-1136-4fcb-97dc-11a8b2203d98",
        "createdAt": "2026-10-13T09:30:12.418Z",
        "updatedAt": "2026-10-13T09:30:12.418Z",
        "deletedAt": null
      }
    ],
    "teams": [
      {
        "id": "9a4f6d13-8b25-4c7e-93a0-1f5d2e8b7c64"
      }
    ]
  }
}

Path parameters

iduuidrequired
Resource id.

Notes

  • A profile your organization manages (never verified, never claimed, and never held by another organization or role) is deleted for good with its training history. Its email is free again.
  • Any other athlete, one with their own Vitruve account or one another organization holds or held, only leaves your organization and its teams. Their account and history stay.

Failures are described in error codes.

List coaches

GET/coaches

Owners and coaches of your organization, with their membership.

Request

curl "https://api-next.vitruve.fit/v1/coaches?limit=25" \
  -H "X-API-Key: YOUR_API_KEY"

Response 200

{
  "ok": true,
  "timestamp": 1738247125207,
  "data": [
    {
      "id": "5e2a7b90-4c13-4f8d-a6b1-d93f0e8c2a47",
      "name": "Daniel",
      "surname": "Okafor",
      "email": "daniel.okafor@northgate.example",
      "isVerified": true,
      "profession": "coach",
      "organizationsToUsers": [
        {
          "id": "9c4e1a73-d085-4b2f-a6e8-31f7b5d02c94",
          "userId": "5e2a7b90-4c13-4f8d-a6b1-d93f0e8c2a47",
          "organizationId": "7d3f8a52-1c0e-4b8e-9f4a-2e6b1d9c5a10",
          "roleId": "ef736bad-c98e-410e-bf26-af834332153b",
          "deletedAt": null
        }
      ]
    }
  ],
  "meta": {
    "limit": 25,
    "hasMore": true,
    "nextCursor": "ZTU2M2ZlYzMtM2IxYy00…"
  }
}

Query parameters

searchstring
Case-insensitive. Every word must match the name, surname or email, so a full name such as Ana García works.
roleIduuid
Only owners (4aa018e6-8b22-40b1-8d07-ab4f1af51330) or only coaches (ef736bad-c98e-410e-bf26-af834332153b).
limitintegerdefault 50
Page size, 1–100.
cursorstring
meta.nextCursor from the previous page. Omit it to get the first page.

Response fields

iduuid
Coach id. Matches createdBy and, when a staff member recorded it, recordedByUserId on other resources.
organizationsToUsers[].roleIduuid
Owner or Coach role id.

Failures are described in error codes.

Get a coach

GET/coaches/{id}

One owner or coach of your organization.

Request

curl "https://api-next.vitruve.fit/v1/coaches/5e2a7b90-4c13-4f8d-a6b1-d93f0e8c2a47" \
  -H "X-API-Key: YOUR_API_KEY"

Response 200

{
  "ok": true,
  "timestamp": 1738247125207,
  "data": {
    "id": "5e2a7b90-4c13-4f8d-a6b1-d93f0e8c2a47",
    "name": "Daniel",
    "surname": "Okafor",
    "email": "daniel.okafor@northgate.example",
    "isVerified": true,
    "profession": "coach",
    "organizationsToUsers": [
      {
        "userId": "5e2a7b90-4c13-4f8d-a6b1-d93f0e8c2a47",
        "organizationId": "7d3f8a52-1c0e-4b8e-9f4a-2e6b1d9c5a10",
        "roleId": "ef736bad-c98e-410e-bf26-af834332153b"
      }
    ]
  }
}

Path parameters

iduuidrequired
Resource id.

Failures are described in error codes.

List a coach's athletes

GET/coaches/{id}/athletes

The ids of the athletes a coach is assigned to: every athlete of your organization except those unassigned from them. The owner’s id answers every athlete: the owner is never unassigned.

Request

curl "https://api-next.vitruve.fit/v1/coaches/5e2a7b90-4c13-4f8d-a6b1-d93f0e8c2a47/athletes" \
  -H "X-API-Key: YOUR_API_KEY"

Response 200

{
  "ok": true,
  "timestamp": 1738247125207,
  "data": {
    "athleteIds": [
      "3b9c1e24-6f7a-4d2b-8c15-a40e9d7f1b62",
      "c81d5f07-92ab-4e63-b0d4-7a3e6c1f9e28"
    ]
  }
}

Path parameters

iduuidrequired
Resource id.

Response fields

athleteIdsuuid[]
Resolve with GET /athletes/{id}.

Failures are described in error codes.

Replace a coach's athletes

A coach sees every athlete of your organization unless unassigned from them. Coaches join through an invitation from the Vitruve app: the API changes which athletes they see and removes them, but doesn't add them.

PUT/coaches/{id}/athletes

Sets the athletes a coach is assigned to: every other athlete of your organization is unassigned from them. Answers the new athleteIds, sorted.

Request

curl -X PUT "https://api-next.vitruve.fit/v1/coaches/5e2a7b90-4c13-4f8d-a6b1-d93f0e8c2a47/athletes" \
  -H "X-API-Key: YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "athleteIds": [
      "6d2b8f14-a9c3-4e57-8b06-f31c7a5d9e42",
      "3b9c1e24-6f7a-4d2b-8c15-a40e9d7f1b62"
    ]
  }'

Response 200

{
  "ok": true,
  "timestamp": 1738247125207,
  "data": {
    "athleteIds": [
      "3b9c1e24-6f7a-4d2b-8c15-a40e9d7f1b62",
      "6d2b8f14-a9c3-4e57-8b06-f31c7a5d9e42"
    ]
  }
}

Path parameters

iduuidrequired
Resource id.

Body

athleteIdsuuid[]required
Every athlete the coach is assigned to, at most 3,000. [] unassigns them all.

Notes

  • Assignments that don’t change are left as they are.
  • 400 when an id is not an athlete of your organization.
  • Only coaches: the owner sees every athlete and is never unassigned, so the owner’s id answers 404.
  • A coach sees every athlete unless unassigned from them, so athletes created later are assigned to every coach.

Failures are described in error codes.

Assign an athlete to a coach

PUT/coaches/{id}/athletes/{athleteId}

Assigns one athlete to a coach. An athlete already assigned stays assigned.

Request

curl -X PUT "https://api-next.vitruve.fit/v1/coaches/5e2a7b90-4c13-4f8d-a6b1-d93f0e8c2a47/athletes/c81d5f07-92ab-4e63-b0d4-7a3e6c1f9e28" \
  -H "X-API-Key: YOUR_API_KEY"

Response 200

{
  "ok": true,
  "timestamp": 1738247125207,
  "data": {
    "coachId": "5e2a7b90-4c13-4f8d-a6b1-d93f0e8c2a47",
    "athleteId": "c81d5f07-92ab-4e63-b0d4-7a3e6c1f9e28",
    "isAssigned": true
  }
}

Path parameters

iduuidrequired
Resource id.
athleteIduuidrequired
Athlete id.

Notes

  • Only coaches: the owner’s id answers 404.

Response fields

coachIduuid
The coach.
athleteIduuid
The athlete.
isAssignedboolean
Whether the coach is now assigned to the athlete.

Failures are described in error codes.

Unassign an athlete from a coach

DELETE/coaches/{id}/athletes/{athleteId}

Unassigns one athlete from a coach, who stops seeing them. An athlete already unassigned stays unassigned.

Request

curl -X DELETE "https://api-next.vitruve.fit/v1/coaches/5e2a7b90-4c13-4f8d-a6b1-d93f0e8c2a47/athletes/c81d5f07-92ab-4e63-b0d4-7a3e6c1f9e28" \
  -H "X-API-Key: YOUR_API_KEY"

Response 200

{
  "ok": true,
  "timestamp": 1738247125207,
  "data": {
    "coachId": "5e2a7b90-4c13-4f8d-a6b1-d93f0e8c2a47",
    "athleteId": "c81d5f07-92ab-4e63-b0d4-7a3e6c1f9e28",
    "isAssigned": false
  }
}

Path parameters

iduuidrequired
Resource id.
athleteIduuidrequired
Athlete id.

Notes

  • Only coaches: the owner is never unassigned, and their id answers 404.

Response fields

coachIduuid
The coach.
athleteIduuid
The athlete.
isAssignedboolean
Whether the coach is now assigned to the athlete.

Failures are described in error codes.

Remove a coach

DELETE/coaches/{id}

Removes a coach from your organization and answers the coach as they were. Their account and athlete assignments are kept, so a coach added back sees the same athletes.

Request

curl -X DELETE "https://api-next.vitruve.fit/v1/coaches/5e2a7b90-4c13-4f8d-a6b1-d93f0e8c2a47" \
  -H "X-API-Key: YOUR_API_KEY"

Response 200

{
  "ok": true,
  "timestamp": 1738247125207,
  "data": {
    "id": "5e2a7b90-4c13-4f8d-a6b1-d93f0e8c2a47",
    "name": "Daniel",
    "surname": "Okafor",
    "email": "daniel.okafor@northgate.example",
    "isVerified": true,
    "profession": "coach",
    "organizationsToUsers": [
      {
        "userId": "5e2a7b90-4c13-4f8d-a6b1-d93f0e8c2a47",
        "organizationId": "7d3f8a52-1c0e-4b8e-9f4a-2e6b1d9c5a10",
        "roleId": "ef736bad-c98e-410e-bf26-af834332153b"
      }
    ]
  }
}

Path parameters

iduuidrequired
Resource id.

Notes

  • The organization’s owner can’t be removed: 403.
  • Coaches join through an invitation from the Vitruve app. The API doesn’t add them.

Failures are described in error codes.

List teams

GET/teams

Teams of your organization, ordered by name, each with the ids of its athletes.

Request

curl "https://api-next.vitruve.fit/v1/teams?limit=10" \
  -H "X-API-Key: YOUR_API_KEY"

Response 200

{
  "ok": true,
  "timestamp": 1738247125207,
  "data": [
    {
      "id": "9a4f6d13-8b25-4c7e-93a0-1f5d2e8b7c64",
      "name": "First team",
      "avatarPath": null,
      "organizationId": "7d3f8a52-1c0e-4b8e-9f4a-2e6b1d9c5a10",
      "createdAt": "2025-09-01T10:00:00.000Z",
      "updatedAt": "2025-09-01T10:00:00.000Z",
      "deletedAt": null,
      "users": [
        {
          "id": "3b9c1e24-6f7a-4d2b-8c15-a40e9d7f1b62"
        },
        {
          "id": "c81d5f07-92ab-4e63-b0d4-7a3e6c1f9e28"
        }
      ]
    }
  ],
  "meta": {
    "limit": 10,
    "hasMore": true,
    "nextCursor": "ZTU2M2ZlYzMtM2IxYy00…"
  }
}

Query parameters

searchstring
Case-insensitive match on the team name.
limitintegerdefault 50
Page size, 1–100.
cursorstring
meta.nextCursor from the previous page. Omit it to get the first page.

Response fields

users[].iduuid
Athletes in the team. Resolve with GET /athletes/{id}.

Failures are described in error codes.

Get a team

GET/teams/{id}

One team with the ids of its athletes.

Request

curl "https://api-next.vitruve.fit/v1/teams/9a4f6d13-8b25-4c7e-93a0-1f5d2e8b7c64" \
  -H "X-API-Key: YOUR_API_KEY"

Response 200

{
  "ok": true,
  "timestamp": 1738247125207,
  "data": {
    "id": "9a4f6d13-8b25-4c7e-93a0-1f5d2e8b7c64",
    "name": "First team",
    "avatarPath": null,
    "organizationId": "7d3f8a52-1c0e-4b8e-9f4a-2e6b1d9c5a10",
    "users": [
      {
        "id": "3b9c1e24-6f7a-4d2b-8c15-a40e9d7f1b62"
      },
      {
        "id": "c81d5f07-92ab-4e63-b0d4-7a3e6c1f9e28"
      }
    ]
  }
}

Path parameters

iduuidrequired
Resource id.

Failures are described in error codes.

Create a team

POST/teams

Creates a team, with its athletes if you send them, and answers it in the shape of GET /teams/{id}.

Request

curl -X POST "https://api-next.vitruve.fit/v1/teams" \
  -H "X-API-Key: YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: YOUR_OPERATION_ID" \
  -d '{
    "name": "U23 squad",
    "athleteIds": [
      "c81d5f07-92ab-4e63-b0d4-7a3e6c1f9e28"
    ]
  }'

Response 200

{
  "ok": true,
  "timestamp": 1738247125207,
  "data": {
    "id": "e3a7c915-4b2d-4f68-9a0e-7c5b1d83f264",
    "name": "U23 squad",
    "avatarPath": null,
    "organizationId": "7d3f8a52-1c0e-4b8e-9f4a-2e6b1d9c5a10",
    "createdAt": "2026-10-13T09:32:05.104Z",
    "updatedAt": "2026-10-13T09:32:05.104Z",
    "deletedAt": null,
    "users": [
      {
        "id": "c81d5f07-92ab-4e63-b0d4-7a3e6c1f9e28"
      }
    ]
  }
}

Headers

Idempotency-Keystring
Request header. 1 to 255 visible ASCII characters you choose per operation, such as a UUID or your own record’s id. A retry with the same key and the same request returns the first answer instead of creating again.

Body

namestringrequired
Team name, up to 255 characters.
athleteIdsuuid[]
Athletes of your organization in the team, at most 3,000.

Notes

  • 400 when an id in athleteIds is not an athlete of your organization.
  • Send an Idempotency-Key header to retry the create safely after a timeout: a retry with the same key and body answers the first result instead of creating again.

Failures are described in error codes.

Update a team

Request body: name, athleteIds or both. athleteIds replaces the team's athletes; staff members the app added to the team stay.

PATCH/teams/{id}

Renames a team or replaces its athletes, and answers the team.

Request

curl -X PATCH "https://api-next.vitruve.fit/v1/teams/e3a7c915-4b2d-4f68-9a0e-7c5b1d83f264" \
  -H "X-API-Key: YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "athleteIds": [
      "c81d5f07-92ab-4e63-b0d4-7a3e6c1f9e28",
      "6d2b8f14-a9c3-4e57-8b06-f31c7a5d9e42"
    ]
  }'

Response 200

{
  "ok": true,
  "timestamp": 1738247125207,
  "data": {
    "id": "e3a7c915-4b2d-4f68-9a0e-7c5b1d83f264",
    "name": "U23 squad",
    "avatarPath": null,
    "organizationId": "7d3f8a52-1c0e-4b8e-9f4a-2e6b1d9c5a10",
    "createdAt": "2026-10-13T09:32:05.104Z",
    "updatedAt": "2026-10-14T07:06:11.532Z",
    "deletedAt": null,
    "users": [
      {
        "id": "c81d5f07-92ab-4e63-b0d4-7a3e6c1f9e28"
      },
      {
        "id": "6d2b8f14-a9c3-4e57-8b06-f31c7a5d9e42"
      }
    ]
  }
}

Path parameters

iduuidrequired
Resource id.

Body

namestring
Team name, up to 255 characters.
athleteIdsuuid[]
The team’s athletes, at most 3,000. Replaces the current ones; staff members the app added to the team stay.

Failures are described in error codes.

Add an athlete to a team

PUT/teams/{id}/athletes/{athleteId}

Adds one athlete to a team and answers the team. An athlete already in it stays.

Request

curl -X PUT "https://api-next.vitruve.fit/v1/teams/9a4f6d13-8b25-4c7e-93a0-1f5d2e8b7c64/athletes/6d2b8f14-a9c3-4e57-8b06-f31c7a5d9e42" \
  -H "X-API-Key: YOUR_API_KEY"

Response 200

{
  "ok": true,
  "timestamp": 1738247125207,
  "data": {
    "id": "9a4f6d13-8b25-4c7e-93a0-1f5d2e8b7c64",
    "name": "First team",
    "avatarPath": null,
    "organizationId": "7d3f8a52-1c0e-4b8e-9f4a-2e6b1d9c5a10",
    "createdAt": "2025-09-01T10:00:00.000Z",
    "updatedAt": "2026-10-13T09:35:48.009Z",
    "deletedAt": null,
    "users": [
      {
        "id": "3b9c1e24-6f7a-4d2b-8c15-a40e9d7f1b62"
      },
      {
        "id": "c81d5f07-92ab-4e63-b0d4-7a3e6c1f9e28"
      },
      {
        "id": "6d2b8f14-a9c3-4e57-8b06-f31c7a5d9e42"
      }
    ]
  }
}

Path parameters

iduuidrequired
Resource id.
athleteIduuidrequired
Athlete id.

Failures are described in error codes.

Remove an athlete from a team

DELETE/teams/{id}/athletes/{athleteId}

Removes one athlete from a team and answers the team. The athlete stays in your organization.

Request

curl -X DELETE "https://api-next.vitruve.fit/v1/teams/9a4f6d13-8b25-4c7e-93a0-1f5d2e8b7c64/athletes/c81d5f07-92ab-4e63-b0d4-7a3e6c1f9e28" \
  -H "X-API-Key: YOUR_API_KEY"

Response 200

{
  "ok": true,
  "timestamp": 1738247125207,
  "data": {
    "id": "9a4f6d13-8b25-4c7e-93a0-1f5d2e8b7c64",
    "name": "First team",
    "avatarPath": null,
    "organizationId": "7d3f8a52-1c0e-4b8e-9f4a-2e6b1d9c5a10",
    "createdAt": "2025-09-01T10:00:00.000Z",
    "updatedAt": "2026-10-13T09:36:20.771Z",
    "deletedAt": null,
    "users": [
      {
        "id": "3b9c1e24-6f7a-4d2b-8c15-a40e9d7f1b62"
      }
    ]
  }
}

Path parameters

iduuidrequired
Resource id.
athleteIduuidrequired
Athlete id.

Notes

  • Only athletes: a staff member on the team answers 404.

Failures are described in error codes.

Delete a team

DELETE/teams/{id}

Deletes a team for good and answers it as it was. Its athletes stay in your organization.

Request

curl -X DELETE "https://api-next.vitruve.fit/v1/teams/e3a7c915-4b2d-4f68-9a0e-7c5b1d83f264" \
  -H "X-API-Key: YOUR_API_KEY"

Response 200

{
  "ok": true,
  "timestamp": 1738247125207,
  "data": {
    "id": "e3a7c915-4b2d-4f68-9a0e-7c5b1d83f264",
    "name": "U23 squad",
    "avatarPath": null,
    "organizationId": "7d3f8a52-1c0e-4b8e-9f4a-2e6b1d9c5a10",
    "createdAt": "2026-10-13T09:32:05.104Z",
    "updatedAt": "2026-10-14T07:06:11.532Z",
    "deletedAt": null,
    "users": [
      {
        "id": "c81d5f07-92ab-4e63-b0d4-7a3e6c1f9e28"
      },
      {
        "id": "6d2b8f14-a9c3-4e57-8b06-f31c7a5d9e42"
      }
    ]
  }
}

Path parameters

iduuidrequired
Resource id.

Failures are described in error codes.

On this page