Partner integrations
For S&C platforms that connect to Vitruve on behalf of shared customers: read each customer's people, workouts and measurements with their key and your partner secret.
This documentation is for developers at integration partners: established platforms in strength and conditioning, such as TeamBuildr, FYTT or RockDaisy, that bring their customers' Vitruve training data into their own product.
As a partner you never hold an account in your customers' organizations. Each customer connects your platform from their Vitruve settings and hands you a key that opens their data to you, and only to you.
| Property | Value |
|---|---|
| Base URL | https://api-integrations-next.vitruve.fit/v1 |
| Credentials | The customer's integration key (X-API-Key) and your partner secret (X-Partner-Secret), on every request |
| Network | Requests must come from the IP addresses you registered with Vitruve |
| Methods | GET only. Any other method answers 405: a partner never changes customer data |
| Data | The organization, its people, workouts and catalogs. See the reference |
| History | What the customer's plan includes. See Plans and history |
| Rate limit | 30 requests per minute per customer key |
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"])Hosts and the 2027-01-31 date
- Now: the
/v1partner endpoints answer athttps://api-integrations-next.vitruve.fit/v1. Every new integration uses it. - From 2027-01-31: they also answer on
https://api-integrations.vitruve.fit, at the same/v1paths.https://api-integrations-next.vitruve.fitkeeps working after that date, so nothing you build on it has to change. - Existing integrations: the pre-v1 endpoints (
GET /vbt-workouts,GET /usersandGET /legacy-idsonhttps://api-integrations.vitruve.fit) keep working exactly as they do today, before and after 2027-01-31: same keys, parameters and responses, with no partner secret, registered address or rate limit. You don't need to change anything. See Existing integrations and /v1.
How it fits together
Vitruve Your customer You (the partner)
─────── ───────────── ─────────────────
approves you, issues ──▶ partner secret
a partner secret bound + registered IPs
to your egress IPs
Settings → Integrations
→ Export → your platform
creates an integration key ──▶ customer key
/v1 checks every request: GET /v1/…
key ✓ secret ✓ IP ✓ plan ✓ endpoint ✓ ◀────── X-API-Key: <customer key>
X-Partner-Secret: <secret>- Vitruve approves your platform and issues you one partner secret, bound to the IP addresses your servers call from. You do this once. See Becoming a partner.
- Each customer creates a key for you in the Vitruve app and gives it to you. See Connecting customers.
- You call the API with that customer's key and your secret. Each key opens exactly one organization's data.
An integration key is useless without your secret, and your secret only works from your registered addresses. A key that leaks from your database cannot be used by anyone else, and a customer cannot use it as a general-purpose API key.
Not a partner?
To read or sync your own organization's data with your own tools, you don't need any of this. Use the Vitruve API with a key from Settings → API Access.