Facebook Pixel
Fit'DistanceDocumentation
Open the app
On this page

Scopes

What each scope opens: families and kinds, sensitive scopes, team, and the rule that ties Delete to Write.

A scope is a permission you tick on a key. It is written <family>:<kind>, for example students:read. A key does only what its scopes allow: without the right one, the API answers 403 SCOPE_MISSING.

Families and kinds

Your data is organized in families. Each family has three kinds: Read (:read), Write (:write) and Delete (:delete), check-ins included, although they have no delete operation. These are the boxes of Settings › Integrations › API keys. The table shows what each family opens through the API.

FamilyIdentifierRead routesOperations
Studentsstudentsyes (/students, /students/<id>, /students/departures)read, write, delete (student tags included)
Trainingtrainingyes (/programs, /workouts, /workouts/<id>, /workout-feedbacks, /set-results, /students/<id>/records)read, write, delete
Check-insbilansyes (/bilans, /bilans/<id>)read, write
Formsformsyes (/forms/assignments, /forms/submissions, /forms/submissions/<id>)read, write, delete
Messagesmessagingyes (/threads, /messages)read, write, delete
Nutritionnutritionyes (/meal-plans, /daily-meals, /macros/daily)read, write, delete
Habitshabitsyes (/habits, /habits/entries)read, write, delete
Appointmentsappointmentsyes (/appointments)read, write, delete
Coursescoursesyes (/courses/progress)read, write, delete (revoking a student's access)
Documentsdocumentsnoread, write, delete
Workspaceworkspacenoread, write, delete
Prospectsprospectsnoread, write, delete
Webhookswebhooksnoread, write, delete (your webhooks and their deliveries)

activity:read (read only, not a family) opens /coaching-timeline.

webhooks:read reads your webhooks and their deliveries, and opens every event type; webhooks:write creates, updates, changes the secret, tests and redelivers; webhooks:delete deletes. A key manages only the webhooks whose events it can all read: without webhooks:read, each type requires the read scope of its family, for example bilans:read for bilan.submitted. GET /events is free and returns only the types the key reads: all of them with webhooks:read, else those of the families it reads. Everything is detailed in Webhooks.

POST /operations/<name> runs every operation of GET /operations, in every family; three stay specific to the MCP: programs.assign and mealplans.assign (they consume their source), bilans.photo (an image). GET /operations gives each one its kind (kind) and its scope (scope).

Delete requires Write

:delete requires :write of the same family. When you tick Delete, the app ticks Write for you, and it refuses a key that holds one without the other (400 INVALID_SCOPE). A key that writes (:write or :delete) also needs you to have accepted the current version of the terms of use.

If your plan does not include writes, the API answers 403 WRITE_NOT_ALLOWED, even with the right scope.

Sensitive scopes

A scope is sensitive when it opens personal or health data, or changes your account. The app marks it "sensitive": tick only what the tool needs. Every write and delete scope is sensitive, and so are these reads:

ScopeWhat it opens
students.contact:readThe email and the phone of students, and the email and the contactHandle of prospects (the handle, the phone or WhatsApp number, or the e-mail address, according to the channel), in every response. Without it, these fields are missing and the call still goes through, except for the four student operations that require it.
bilans.medical:readThe health of the initial check-in (history, allergies, medical notes) and the comments exchanged under a check-in.
forms.answers:readThe content of the answers: GET /forms/submissions/<id> and the operations that read answers.
messaging:readThe text of messages.
media:readThe photos and videos of students, through the operations that return their addresses. No read route serves them: they only give their count.

For an operation, GET /operations lists these scopes in sensitive: the key needs them in addition to scope, whatever the arguments. So students.read, students.list, students.get and students.requests require students.contact:read, while GET /students answers without it, with no email or phone. The other operations answer without it, but with no e-mail address and no phone number: a messaging thread or a program names the student without their contact details, and a prospect record comes without email or contactHandle. prospects.read with view=search then answers 400 VALIDATION, because the search also matches email and contactHandle. prospects.invite answers 400 VALIDATION too, unless the call passes the address in email.

Team

team:read widens the read routes of every family to the data of the active trainers of the teams you own. The coach_id of each student names the coach. It is accepted only for the owner of a team.

When a scope is missing

The API answers 403 SCOPE_MISSING, and details.scope names the scope to add:

{
  "error": {
    "name": "PARTNER_API",
    "message": "SCOPE_MISSING",
    "details": { "scope": "students:write" }
  }
}

A 403 costs no credit. Since you do not edit a key, add this scope on a new key. Writes are detailed in Writes and idempotency.

Next pagePaginationRead a list page by page with limit and cursor, reread only the changes with since, and handle deleted objects.