Partner quickstart
From your partner secret to your first customer's athletes and workouts, with both credentials.
You need a partner secret and registered addresses first. See Becoming a partner.
Get a customer key
A customer who owns a Vitruve organization on an eligible plan opens Settings → Integrations → Export, selects Create next to your platform, and copies the key. Ask them to paste it into your platform's settings. See Connecting customers.
Store the key encrypted, linked to that customer's account on your side.
Make your first request
Call GET /organization with both headers, from a registered address, to check everything works and learn which organization the key belongs to.
curl "https://api-integrations-next.vitruve.fit/v1/organization" \
-H "X-API-Key: CUSTOMER_INTEGRATION_KEY" \
-H "X-Partner-Secret: YOUR_PARTNER_SECRET"// One integration key per customer, one partner secret for all of them.
async function vitruve(customerKey, path) {
const response = await fetch(`https://api-integrations-next.vitruve.fit/v1${path}`, {
headers: {
'X-API-Key': customerKey,
'X-Partner-Secret': process.env.VITRUVE_PARTNER_SECRET
}
})
const body = await response.json()
if (!response.ok) throw new Error(`${response.status}: ${body.message}`)
return body
}
const { data: organization } = await vitruve(customer.vitruveKey, '/organization')
console.log(organization.name)import os
import requests
def vitruve(customer_key, path, **params):
response = requests.get(
f"https://api-integrations-next.vitruve.fit/v1{path}",
params=params,
headers={
"X-API-Key": customer_key,
"X-Partner-Secret": os.environ["VITRUVE_PARTNER_SECRET"],
},
timeout=30,
)
body = response.json()
if not response.ok:
raise RuntimeError(f"{response.status_code}: {body['message']}")
return body
organization = vitruve(customer.vitruve_key, "/organization")["data"]
print(organization["name"])A 200 with the organization in data means the key, your secret and your address are all accepted. Otherwise:
| Status | message | Check |
|---|---|---|
401 | Partner credentials required | Send X-Partner-Secret. |
401 | Invalid partner credentials | The secret is wrong, revoked, or the key was created for a different platform. |
401 | Invalid API key | The customer key was mistyped or revoked. |
403 | Request origin not allowed for this integration | You called from an address you did not register. |
403 | Your plan no longer includes API access | The customer's plan does not include export integrations. |
Read the data
List the customer's athletes, then their completed workouts:
curl "https://api-integrations-next.vitruve.fit/v1/athletes?limit=100" \
-H "X-API-Key: $CUSTOMER_KEY" -H "X-Partner-Secret: $VITRUVE_PARTNER_SECRET"
curl "https://api-integrations-next.vitruve.fit/v1/workouts?from=2026-10-01&limit=100" \
-H "X-API-Key: $CUSTOMER_KEY" -H "X-Partner-Secret: $VITRUVE_PARTNER_SECRET"The workout list has no content: fetch each one with GET /workouts/{id} to get its sets and repetitions. See the workout data model.
Next
- Keep every customer in sync: Syncing many customers
- Handle plan changes and revoked keys: Plans and history, Connecting customers
- Every endpoint and field: Reference
Becoming a partner
Get your platform approved, register the IP addresses your servers call from, and receive the partner secret that authenticates you for every customer.
Partner authentication
Every partner request sends the customer's integration key and your partner secret, from a registered IP address. The checks, their errors, and rotation.