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
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"const response = await fetch(
'https://api-next.vitruve.fit/v1/organization',
{ headers: { 'X-API-Key': process.env.VITRUVE_API_KEY } }
)
const body = await response.json()
if (!response.ok) throw new Error(`${response.status}: ${body.message}`)
console.log(body.data)import os
import requests
response = requests.get(
"https://api-next.vitruve.fit/v1/organization",
headers={"X-API-Key": os.environ["VITRUVE_API_KEY"]},
timeout=30,
)
response.raise_for_status()
print(response.json()["data"])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
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"const response = await fetch(
'https://api-next.vitruve.fit/v1/athletes?limit=2&teamId=9a4f6d13-8b25-4c7e-93a0-1f5d2e8b7c64',
{ headers: { 'X-API-Key': process.env.VITRUVE_API_KEY } }
)
const body = await response.json()
if (!response.ok) throw new Error(`${response.status}: ${body.message}`)
console.log(body.data)import os
import requests
response = requests.get(
"https://api-next.vitruve.fit/v1/athletes?limit=2&teamId=9a4f6d13-8b25-4c7e-93a0-1f5d2e8b7c64",
headers={"X-API-Key": os.environ["VITRUVE_API_KEY"]},
timeout=30,
)
response.raise_for_status()
print(response.json()["data"])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íaworks. teamIduuid- Only athletes in this team.
limitintegerdefault50- Page size, 1–100.
cursorstringmeta.nextCursorfrom the previous page. Omit it to get the first page.
Response fields
iduuid- Athlete id. Pass it as
userIdto 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,
leftorright. measurementSystemstringnullable- The athlete’s preferred measurement system.
organizationsToUsers[]object[]- The athlete’s membership in your organization.
roleIdis 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
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"const response = await fetch(
'https://api-next.vitruve.fit/v1/athletes/3b9c1e24-6f7a-4d2b-8c15-a40e9d7f1b62',
{ headers: { 'X-API-Key': process.env.VITRUVE_API_KEY } }
)
const body = await response.json()
if (!response.ok) throw new Error(`${response.status}: ${body.message}`)
console.log(body.data)import os
import requests
response = requests.get(
"https://api-next.vitruve.fit/v1/athletes/3b9c1e24-6f7a-4d2b-8c15-a40e9d7f1b62",
headers={"X-API-Key": os.environ["VITRUVE_API_KEY"]},
timeout=30,
)
response.raise_for_status()
print(response.json()["data"])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
userIdto 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,
leftorright. measurementSystemstringnullable- The athlete’s preferred measurement system.
organizationsToUsers[]object[]- The athlete’s membership in your organization.
roleIdis 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
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"const response = await fetch(
'https://api-next.vitruve.fit/v1/athletes/3b9c1e24-6f7a-4d2b-8c15-a40e9d7f1b62/profile',
{ headers: { 'X-API-Key': process.env.VITRUVE_API_KEY } }
)
const body = await response.json()
if (!response.ok) throw new Error(`${response.status}: ${body.message}`)
console.log(body.data)import os
import requests
response = requests.get(
"https://api-next.vitruve.fit/v1/athletes/3b9c1e24-6f7a-4d2b-8c15-a40e9d7f1b62/profile",
headers={"X-API-Key": os.environ["VITRUVE_API_KEY"]},
timeout=30,
)
response.raise_for_status()
print(response.json()["data"])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
validFromfirst. versions[].validFromdatetime- First day this version applies.
versions[].validTodatetimenullablenullfor the current version.versions[].recordedByUserIduuid- Who recorded the version: the athlete themselves, or a staff member. Resolve with
GET /athletes/{id}orGET /coaches/{id}.
Failures are described in error codes.
Create an athlete
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"
]
}'const response = await fetch(
'https://api-next.vitruve.fit/v1/athletes',
{
method: 'POST',
headers: {
'X-API-Key': process.env.VITRUVE_API_KEY,
'Content-Type': 'application/json',
'Idempotency-Key': 'YOUR_OPERATION_ID'
},
body: JSON.stringify({
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'
]
})
}
)
const body = await response.json()
if (!response.ok) throw new Error(`${response.status}: ${body.message}`)
console.log(body.data)import os
import requests
response = requests.request(
"POST",
"https://api-next.vitruve.fit/v1/athletes",
headers={
"X-API-Key": os.environ["VITRUVE_API_KEY"],
"Idempotency-Key": "YOUR_OPERATION_ID",
},
json={
"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",
],
},
timeout=30,
)
response.raise_for_status()
print(response.json()["data"])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-DDor 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
403when the plan’s athlete limit is reached. Pending athlete invitations count toward it, and so do creates running at the same time.409when the email belongs to another user, in any letter case.400when ateamIdsentry is not a team of your organization.- Send an
Idempotency-Keyheader 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}.
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"
}'const response = await fetch(
'https://api-next.vitruve.fit/v1/athletes/6d2b8f14-a9c3-4e57-8b06-f31c7a5d9e42',
{
method: 'PATCH',
headers: {
'X-API-Key': process.env.VITRUVE_API_KEY,
'Content-Type': 'application/json'
},
body: JSON.stringify({
weight: 83,
dominantSide: 'right'
})
}
)
const body = await response.json()
if (!response.ok) throw new Error(`${response.status}: ${body.message}`)
console.log(body.data)import os
import requests
response = requests.request(
"PATCH",
"https://api-next.vitruve.fit/v1/athletes/6d2b8f14-a9c3-4e57-8b06-f31c7a5d9e42",
headers={"X-API-Key": os.environ["VITRUVE_API_KEY"]},
json={
"weight": 83,
"dominantSide": "right",
},
timeout=30,
)
response.raise_for_status()
print(response.json()["data"])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-DDor 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
403when the athlete has claimed their own Vitruve account: they manage their profile themselves.- Once the athlete is verified,
birthDateanddominantSideare theirs only: sending either answers403. - Teams are changed on the team:
PATCH /teams/{id},PUT /teams/{id}/athletes/{athleteId}.
Failures are described in error codes.
Delete an athlete
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"const response = await fetch(
'https://api-next.vitruve.fit/v1/athletes/6d2b8f14-a9c3-4e57-8b06-f31c7a5d9e42',
{
method: 'DELETE',
headers: {
'X-API-Key': process.env.VITRUVE_API_KEY
}
}
)
const body = await response.json()
if (!response.ok) throw new Error(`${response.status}: ${body.message}`)
console.log(body.data)import os
import requests
response = requests.request(
"DELETE",
"https://api-next.vitruve.fit/v1/athletes/6d2b8f14-a9c3-4e57-8b06-f31c7a5d9e42",
headers={"X-API-Key": os.environ["VITRUVE_API_KEY"]},
timeout=30,
)
response.raise_for_status()
print(response.json()["data"])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
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"const response = await fetch(
'https://api-next.vitruve.fit/v1/coaches?limit=25',
{ headers: { 'X-API-Key': process.env.VITRUVE_API_KEY } }
)
const body = await response.json()
if (!response.ok) throw new Error(`${response.status}: ${body.message}`)
console.log(body.data)import os
import requests
response = requests.get(
"https://api-next.vitruve.fit/v1/coaches?limit=25",
headers={"X-API-Key": os.environ["VITRUVE_API_KEY"]},
timeout=30,
)
response.raise_for_status()
print(response.json()["data"])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íaworks. roleIduuid- Only owners (
4aa018e6-8b22-40b1-8d07-ab4f1af51330) or only coaches (ef736bad-c98e-410e-bf26-af834332153b). limitintegerdefault50- Page size, 1–100.
cursorstringmeta.nextCursorfrom the previous page. Omit it to get the first page.
Response fields
iduuid- Coach id. Matches
createdByand, when a staff member recorded it,recordedByUserIdon other resources. organizationsToUsers[].roleIduuid- Owner or Coach role id.
Failures are described in error codes.
Get a coach
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"const response = await fetch(
'https://api-next.vitruve.fit/v1/coaches/5e2a7b90-4c13-4f8d-a6b1-d93f0e8c2a47',
{ headers: { 'X-API-Key': process.env.VITRUVE_API_KEY } }
)
const body = await response.json()
if (!response.ok) throw new Error(`${response.status}: ${body.message}`)
console.log(body.data)import os
import requests
response = requests.get(
"https://api-next.vitruve.fit/v1/coaches/5e2a7b90-4c13-4f8d-a6b1-d93f0e8c2a47",
headers={"X-API-Key": os.environ["VITRUVE_API_KEY"]},
timeout=30,
)
response.raise_for_status()
print(response.json()["data"])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
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"const response = await fetch(
'https://api-next.vitruve.fit/v1/coaches/5e2a7b90-4c13-4f8d-a6b1-d93f0e8c2a47/athletes',
{ headers: { 'X-API-Key': process.env.VITRUVE_API_KEY } }
)
const body = await response.json()
if (!response.ok) throw new Error(`${response.status}: ${body.message}`)
console.log(body.data)import os
import requests
response = requests.get(
"https://api-next.vitruve.fit/v1/coaches/5e2a7b90-4c13-4f8d-a6b1-d93f0e8c2a47/athletes",
headers={"X-API-Key": os.environ["VITRUVE_API_KEY"]},
timeout=30,
)
response.raise_for_status()
print(response.json()["data"])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.
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"
]
}'const response = await fetch(
'https://api-next.vitruve.fit/v1/coaches/5e2a7b90-4c13-4f8d-a6b1-d93f0e8c2a47/athletes',
{
method: 'PUT',
headers: {
'X-API-Key': process.env.VITRUVE_API_KEY,
'Content-Type': 'application/json'
},
body: JSON.stringify({
athleteIds: [
'6d2b8f14-a9c3-4e57-8b06-f31c7a5d9e42',
'3b9c1e24-6f7a-4d2b-8c15-a40e9d7f1b62'
]
})
}
)
const body = await response.json()
if (!response.ok) throw new Error(`${response.status}: ${body.message}`)
console.log(body.data)import os
import requests
response = requests.request(
"PUT",
"https://api-next.vitruve.fit/v1/coaches/5e2a7b90-4c13-4f8d-a6b1-d93f0e8c2a47/athletes",
headers={"X-API-Key": os.environ["VITRUVE_API_KEY"]},
json={
"athleteIds": [
"6d2b8f14-a9c3-4e57-8b06-f31c7a5d9e42",
"3b9c1e24-6f7a-4d2b-8c15-a40e9d7f1b62",
],
},
timeout=30,
)
response.raise_for_status()
print(response.json()["data"])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.
400when 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
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"const response = await fetch(
'https://api-next.vitruve.fit/v1/coaches/5e2a7b90-4c13-4f8d-a6b1-d93f0e8c2a47/athletes/c81d5f07-92ab-4e63-b0d4-7a3e6c1f9e28',
{
method: 'PUT',
headers: {
'X-API-Key': process.env.VITRUVE_API_KEY
}
}
)
const body = await response.json()
if (!response.ok) throw new Error(`${response.status}: ${body.message}`)
console.log(body.data)import os
import requests
response = requests.request(
"PUT",
"https://api-next.vitruve.fit/v1/coaches/5e2a7b90-4c13-4f8d-a6b1-d93f0e8c2a47/athletes/c81d5f07-92ab-4e63-b0d4-7a3e6c1f9e28",
headers={"X-API-Key": os.environ["VITRUVE_API_KEY"]},
timeout=30,
)
response.raise_for_status()
print(response.json()["data"])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
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"const response = await fetch(
'https://api-next.vitruve.fit/v1/coaches/5e2a7b90-4c13-4f8d-a6b1-d93f0e8c2a47/athletes/c81d5f07-92ab-4e63-b0d4-7a3e6c1f9e28',
{
method: 'DELETE',
headers: {
'X-API-Key': process.env.VITRUVE_API_KEY
}
}
)
const body = await response.json()
if (!response.ok) throw new Error(`${response.status}: ${body.message}`)
console.log(body.data)import os
import requests
response = requests.request(
"DELETE",
"https://api-next.vitruve.fit/v1/coaches/5e2a7b90-4c13-4f8d-a6b1-d93f0e8c2a47/athletes/c81d5f07-92ab-4e63-b0d4-7a3e6c1f9e28",
headers={"X-API-Key": os.environ["VITRUVE_API_KEY"]},
timeout=30,
)
response.raise_for_status()
print(response.json()["data"])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
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"const response = await fetch(
'https://api-next.vitruve.fit/v1/coaches/5e2a7b90-4c13-4f8d-a6b1-d93f0e8c2a47',
{
method: 'DELETE',
headers: {
'X-API-Key': process.env.VITRUVE_API_KEY
}
}
)
const body = await response.json()
if (!response.ok) throw new Error(`${response.status}: ${body.message}`)
console.log(body.data)import os
import requests
response = requests.request(
"DELETE",
"https://api-next.vitruve.fit/v1/coaches/5e2a7b90-4c13-4f8d-a6b1-d93f0e8c2a47",
headers={"X-API-Key": os.environ["VITRUVE_API_KEY"]},
timeout=30,
)
response.raise_for_status()
print(response.json()["data"])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
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"const response = await fetch(
'https://api-next.vitruve.fit/v1/teams?limit=10',
{ headers: { 'X-API-Key': process.env.VITRUVE_API_KEY } }
)
const body = await response.json()
if (!response.ok) throw new Error(`${response.status}: ${body.message}`)
console.log(body.data)import os
import requests
response = requests.get(
"https://api-next.vitruve.fit/v1/teams?limit=10",
headers={"X-API-Key": os.environ["VITRUVE_API_KEY"]},
timeout=30,
)
response.raise_for_status()
print(response.json()["data"])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.
limitintegerdefault50- Page size, 1–100.
cursorstringmeta.nextCursorfrom 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
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"const response = await fetch(
'https://api-next.vitruve.fit/v1/teams/9a4f6d13-8b25-4c7e-93a0-1f5d2e8b7c64',
{ headers: { 'X-API-Key': process.env.VITRUVE_API_KEY } }
)
const body = await response.json()
if (!response.ok) throw new Error(`${response.status}: ${body.message}`)
console.log(body.data)import os
import requests
response = requests.get(
"https://api-next.vitruve.fit/v1/teams/9a4f6d13-8b25-4c7e-93a0-1f5d2e8b7c64",
headers={"X-API-Key": os.environ["VITRUVE_API_KEY"]},
timeout=30,
)
response.raise_for_status()
print(response.json()["data"])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
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"
]
}'const response = await fetch(
'https://api-next.vitruve.fit/v1/teams',
{
method: 'POST',
headers: {
'X-API-Key': process.env.VITRUVE_API_KEY,
'Content-Type': 'application/json',
'Idempotency-Key': 'YOUR_OPERATION_ID'
},
body: JSON.stringify({
name: 'U23 squad',
athleteIds: [
'c81d5f07-92ab-4e63-b0d4-7a3e6c1f9e28'
]
})
}
)
const body = await response.json()
if (!response.ok) throw new Error(`${response.status}: ${body.message}`)
console.log(body.data)import os
import requests
response = requests.request(
"POST",
"https://api-next.vitruve.fit/v1/teams",
headers={
"X-API-Key": os.environ["VITRUVE_API_KEY"],
"Idempotency-Key": "YOUR_OPERATION_ID",
},
json={
"name": "U23 squad",
"athleteIds": [
"c81d5f07-92ab-4e63-b0d4-7a3e6c1f9e28",
],
},
timeout=30,
)
response.raise_for_status()
print(response.json()["data"])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
400when an id inathleteIdsis not an athlete of your organization.- Send an
Idempotency-Keyheader 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.
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"
]
}'const response = await fetch(
'https://api-next.vitruve.fit/v1/teams/e3a7c915-4b2d-4f68-9a0e-7c5b1d83f264',
{
method: 'PATCH',
headers: {
'X-API-Key': process.env.VITRUVE_API_KEY,
'Content-Type': 'application/json'
},
body: JSON.stringify({
athleteIds: [
'c81d5f07-92ab-4e63-b0d4-7a3e6c1f9e28',
'6d2b8f14-a9c3-4e57-8b06-f31c7a5d9e42'
]
})
}
)
const body = await response.json()
if (!response.ok) throw new Error(`${response.status}: ${body.message}`)
console.log(body.data)import os
import requests
response = requests.request(
"PATCH",
"https://api-next.vitruve.fit/v1/teams/e3a7c915-4b2d-4f68-9a0e-7c5b1d83f264",
headers={"X-API-Key": os.environ["VITRUVE_API_KEY"]},
json={
"athleteIds": [
"c81d5f07-92ab-4e63-b0d4-7a3e6c1f9e28",
"6d2b8f14-a9c3-4e57-8b06-f31c7a5d9e42",
],
},
timeout=30,
)
response.raise_for_status()
print(response.json()["data"])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
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"const response = await fetch(
'https://api-next.vitruve.fit/v1/teams/9a4f6d13-8b25-4c7e-93a0-1f5d2e8b7c64/athletes/6d2b8f14-a9c3-4e57-8b06-f31c7a5d9e42',
{
method: 'PUT',
headers: {
'X-API-Key': process.env.VITRUVE_API_KEY
}
}
)
const body = await response.json()
if (!response.ok) throw new Error(`${response.status}: ${body.message}`)
console.log(body.data)import os
import requests
response = requests.request(
"PUT",
"https://api-next.vitruve.fit/v1/teams/9a4f6d13-8b25-4c7e-93a0-1f5d2e8b7c64/athletes/6d2b8f14-a9c3-4e57-8b06-f31c7a5d9e42",
headers={"X-API-Key": os.environ["VITRUVE_API_KEY"]},
timeout=30,
)
response.raise_for_status()
print(response.json()["data"])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
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"const response = await fetch(
'https://api-next.vitruve.fit/v1/teams/9a4f6d13-8b25-4c7e-93a0-1f5d2e8b7c64/athletes/c81d5f07-92ab-4e63-b0d4-7a3e6c1f9e28',
{
method: 'DELETE',
headers: {
'X-API-Key': process.env.VITRUVE_API_KEY
}
}
)
const body = await response.json()
if (!response.ok) throw new Error(`${response.status}: ${body.message}`)
console.log(body.data)import os
import requests
response = requests.request(
"DELETE",
"https://api-next.vitruve.fit/v1/teams/9a4f6d13-8b25-4c7e-93a0-1f5d2e8b7c64/athletes/c81d5f07-92ab-4e63-b0d4-7a3e6c1f9e28",
headers={"X-API-Key": os.environ["VITRUVE_API_KEY"]},
timeout=30,
)
response.raise_for_status()
print(response.json()["data"])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
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"const response = await fetch(
'https://api-next.vitruve.fit/v1/teams/e3a7c915-4b2d-4f68-9a0e-7c5b1d83f264',
{
method: 'DELETE',
headers: {
'X-API-Key': process.env.VITRUVE_API_KEY
}
}
)
const body = await response.json()
if (!response.ok) throw new Error(`${response.status}: ${body.message}`)
console.log(body.data)import os
import requests
response = requests.request(
"DELETE",
"https://api-next.vitruve.fit/v1/teams/e3a7c915-4b2d-4f68-9a0e-7c5b1d83f264",
headers={"X-API-Key": os.environ["VITRUVE_API_KEY"]},
timeout=30,
)
response.raise_for_status()
print(response.json()["data"])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.