3 operations. Every schema and example on this page is generated from the platform contract.
Merchant views everyone with access to the store, the owner plus any scoped staff, each with their fine-grained permission grants (manage classes, process payments, view reports, and so on). Owners are flagged and hold every permission implicitly. Gated on the gym-management entitlement.
Store whose staff to list (also authorises the merchant).
curl -G "https://www.membber.com/api/v1/staff/permissions" \
-H "Authorization: Bearer $MEMBBER_TOKEN" \
--data-urlencode "store_id=6659c139-0000-4000-8000-d0c500000066"import { createMembberClient } from "@membber/sdk-ts";
const membber = createMembberClient({
getAccessToken: () => process.env.MEMBBER_TOKEN,
});
const { data, error } = await membber.raw.GET("/api/v1/staff/permissions", {
params: { query: { store_id: "6659c139-0000-4000-8000-d0c500000066" } },
});
if (error) {
// Typed error envelope: { error: { code, message, requestId } }
throw new Error(`${error.error.code}: ${error.error.message}`);
}
console.log(data);import MembberSwift
let client = MembberClient(
serverURL: MembberClient.productionServerURL,
tokenProvider: { session.accessToken }
)
let response = try await client.api.listStaffPermissions(
query: .init(storeId: "6659c139-0000-4000-8000-d0c500000066")
).ok.body.json
print(response){
"staff": [
{
"user_id": "f73aee0f-0000-4000-8000-d0c5000000f7",
"email": "alex@example.com",
"full_name": "Alex Example",
"permissions": {
"can_manage_classes": true,
"can_manage_memberships": true,
"can_process_payments": true,
"can_waive_penalties": true,
"can_override_booking": true,
"can_view_reports": true,
"can_manage_staff": true,
"can_manage_events": true,
"can_manage_config": true,
"can_message_customers": true
},
"is_owner": true,
"has_explicit_grants": true
}
]
}Returns which screen the app opens on for this person and how their Diary is framed. Reads your own preference by default; pass target_user_id (with can_manage_staff) to read a colleague's. The preference is stored against the person, so it follows them to any device they sign in on.
Store the preference belongs to (also authorises the merchant).
Read a COLLEAGUE's preference instead of your own. Requires can_manage_staff.
False when this person has never chosen, the values are then defaults, not a decision. Clients use this to tell "never chose" from "deliberately chose My day".
Which screen the app opens on for this person: their day, or the full diary.
my_dayfull_diaryHow the Diary frames classes: mine first with others dimmed, everyone's, or mine only.
mine_first_dimmedeveryonemine_onlyThe row was last written by someone else (an owner setting it from the Staff detail).
curl -G "https://www.membber.com/api/v1/staff/view-prefs" \
-H "Authorization: Bearer $MEMBBER_TOKEN" \
--data-urlencode "store_id=6659c139-0000-4000-8000-d0c500000066"import { createMembberClient } from "@membber/sdk-ts";
const membber = createMembberClient({
getAccessToken: () => process.env.MEMBBER_TOKEN,
});
const { data, error } = await membber.raw.GET("/api/v1/staff/view-prefs", {
params: { query: { store_id: "6659c139-0000-4000-8000-d0c500000066" } },
});
if (error) {
// Typed error envelope: { error: { code, message, requestId } }
throw new Error(`${error.error.code}: ${error.error.message}`);
}
console.log(data);import MembberSwift
let client = MembberClient(
serverURL: MembberClient.productionServerURL,
tokenProvider: { session.accessToken }
)
let response = try await client.api.getStaffViewPrefs(
query: .init(storeId: "6659c139-0000-4000-8000-d0c500000066")
).ok.body.json
print(response){
"is_set": true,
"prefs": {
"start_screen": "my_day",
"calendar_mode": "mine_first_dimmed"
},
"updated_at": "<updated_at>",
"set_by_other": true
}Sets which screen the app opens on for this person and how their Diary is framed. Sets your own by default; pass target_user_id (with can_manage_staff) to set a colleague's, which takes effect on their device. Idempotent, one row per (person, store), replaced in place.
Store the preference belongs to (also authorises the merchant).
Set a COLLEAGUE's preference instead of your own. Requires can_manage_staff.
Which screen the app opens on for this person: their day, or the full diary.
my_dayfull_diaryHow the Diary frames classes: mine first with others dimmed, everyone's, or mine only.
mine_first_dimmedeveryonemine_onlyWhich screen the app opens on for this person: their day, or the full diary.
my_dayfull_diaryHow the Diary frames classes: mine first with others dimmed, everyone's, or mine only.
mine_first_dimmedeveryonemine_onlycurl -X PUT "https://www.membber.com/api/v1/staff/view-prefs" \
-H "Authorization: Bearer $MEMBBER_TOKEN" \
-H "Idempotency-Key: 1f0e2d3c-4b5a-4678-9abc-def012345678" \
-H "Content-Type: application/json" \
-d '{
"store_id": "6659c139-0000-4000-8000-d0c500000066",
"start_screen": "my_day",
"calendar_mode": "mine_first_dimmed"
}'import { createMembberClient } from "@membber/sdk-ts";
const membber = createMembberClient({
getAccessToken: () => process.env.MEMBBER_TOKEN,
});
const { data, error } = await membber.raw.PUT("/api/v1/staff/view-prefs", {
body: {
store_id: "6659c139-0000-4000-8000-d0c500000066",
start_screen: "my_day",
calendar_mode: "mine_first_dimmed"
},
headers: { "Idempotency-Key": crypto.randomUUID() },
});
if (error) {
// Typed error envelope: { error: { code, message, requestId } }
throw new Error(`${error.error.code}: ${error.error.message}`);
}
console.log(data);import MembberSwift
let client = MembberClient(
serverURL: MembberClient.productionServerURL,
tokenProvider: { session.accessToken }
)
let response = try await client.api.setStaffViewPrefs(
body: .json(.init(
storeId: "6659c139-0000-4000-8000-d0c500000066",
startScreen: .myDay,
calendarMode: .mineFirstDimmed
))
).ok.body.json
print(response){
"prefs": {
"start_screen": "my_day",
"calendar_mode": "mine_first_dimmed"
}
}