Menu

API reference · Profile

Slug

profile · slug · 2 operations

GET/v1/profile/slug/availability

Check whether a slug is available

profile.slug.check

ReadIdempotentSince 2026-11-01

Says whether a slug can be used by this organization: available true when it is free or is already this organization's slug (current true), or available false with reason and message: required, too_short, too_long, format (3 to 48 lowercase letters, digits and hyphens, not starting or ending with a hyphen), reserved (words MB Suite uses in its own addresses) or taken (another organization has it: slugs are unique across MB Suite). It changes nothing. Use it before profile.slug.update. Requires view access to the Profile module.

Scope
profile:read
Permission
View the module
MCP tool
profile_slug_checkOn the full surface; on the compact one, mb_execute_operation with id: "profile.slug.check".

Declared cost: up to 2 reads and 0 writes per call (they count against the daily quota).

Parameters

slugstringqueryrequired

The slug: 3 to 48 lowercase letters, digits and hyphens, not starting or ending with a hyphen.

Response

slugstring
availableboolean
currentboolean

true when it is already this organization's slug.

reasonenum | null

Values: required, too_short, too_long, format, reserved, taken

messagestring | null

Errors

Example

curl "https://api.mb-suite.com/v1/profile/slug/availability?slug=SLUG" \
  -H "Authorization: Bearer $MB_API_KEY"

Try it with your test API key

With a test API key the request always goes to your practice organization: example data you can reset.

curl "https://api.mb-suite.com/v1/profile/slug/availability?slug=SLUG" \
  -H "Authorization: Bearer $MB_TEST_KEY"
POST/v1/profile/slug

Change the organization's slug

profile.slug.update

WriteIdempotentSince 2026-11-01

Changes the organization's slug, its identifier in the app's addresses (mb-suite.com/<slug>/…) and in the public booking pages of the main domain (mb-suite.com/book/<slug>/…). Every link with the old slug stops working and the old slug becomes available to other organizations; custom domains keep working. Validates like the screen: 400 invalid_slug with details.reason (required, too_short, too_long, format, reserved) and 409 slug_taken when another organization uses it; the uniqueness check and the change are atomic. Sending the current slug changes nothing (changed false). dry_run=true runs the same validations and says what would change without changing it; its preview says needs_confirmation false: running it does not need the confirm_token the dry run returns. Fires profile.slug.changed. Returns slug, previous_slug and changed. Owners and admins only (of the organization or, on an Account, of its workspace).

Instructions for agents

Confirm the change with the person first: every link with the old slug (app bookmarks, public booking links on mb-suite.com) stops working and someone else can take the old slug.

Scope
profile:write
Permission
Edit in the module · Only owner, admin
MCP tool
profile_slug_updateOn the full surface; on the compact one, mb_execute_operation with id: "profile.slug.update".
Events it can emit
profile.slug.changed

Declared cost: up to 4 reads and 3 writes per call (they count against the daily quota).

Parameters

slugstringbodyrequired

The slug: 3 to 48 lowercase letters, digits and hyphens, not starting or ending with a hyphen.

Response

slugstring
previous_slugstring
changedboolean

Errors

Example

curl -X POST "https://api.mb-suite.com/v1/profile/slug" \
  -H "Authorization: Bearer $MB_API_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: $(uuidgen)" \
  -d '{
  "slug": "SLUG"
}'

Try it with your test API key

With a test API key the request always goes to your practice organization: example data you can reset.

curl -X POST "https://api.mb-suite.com/v1/profile/slug" \
  -H "Authorization: Bearer $MB_TEST_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: $(uuidgen)" \
  -d '{
  "slug": "SLUG"
}'