Product · Roles & permissions

The right people, the right access.

Four built-in roles ship on every tier. Define your own custom roles on Business. Scope permissions to a workspace, an ontology, or a single scheme. Map your IdP groups straight to Semlify roles via SAML. Decide who can read, edit, tag, invite — and audit all of it from one screen.

Why it matters

A taxonomy is a shared artefact. Access shouldn't be a free-for-all.

The same workspace hosts the AI engineer who indexes against the graph, the taxonomist who curates it, the governance lead who approves changes, and the auditor who reads but never edits. Without roles, every action is a free-for-all — and every "who changed this?" question becomes an investigation.

Roles aren't the audit log; the audit log says what happened. Roles say what's allowed to happen. Together they're the smallest possible governance posture that survives a procurement review.

Level 1 · Every tier

Four built-in roles cover most teams.

Owner, Admin, Editor, Viewer. The four roles each correspond to a real lifecycle position — founder, trusted maintainer, day-to-day curator, read-only consumer. They ship on every tier from Free upward, with no setup. Most workspaces never need anything else.

  • Owner — full control, including billing and member removal
  • Admin — everything except billing; can invite and tag releases
  • Editor — read and write concepts, schemes, relations; cannot tag or invite
  • Viewer — read-only access for auditors and downstream consumers

Level 2 · Business tier

Custom roles for the 5% who need them.

When the four built-ins don't fit, design your own. A role is a name plus a set of granted permissions across the seven action categories: read, write, tag, deprecate, export, invite, billing. Build a 'Tagger' role that can read and tag but not edit. Build a 'Junior curator' that can write to drafts but not publish. Roles live at the workspace level and apply to every member granted them.

  • Granular permissions across seven action categories
  • Compose roles from primitives — no hidden inheritance gotchas
  • Built-in roles remain available alongside custom ones
  • Edit a role and every member with it inherits the change instantly
Custom role · Junior Curator
json
{
  "id":         "role_junior_curator",
  "name":       "Junior Curator",
  "tier":       "custom",
  "permissions": {
    "concept.read":       true,
    "concept.write":      true,
    "concept.deprecate":  false,
    "scheme.read":        true,
    "scheme.write":       false,
    "tag.create":         false,
    "export.run":         true,
    "member.invite":      false,
    "billing.view":       false
  },
  "createdBy":  "valentin@example.com",
  "createdAt":  "2026-04-12T11:08:33Z"
}

Level 3 · Business tier

Permissions scope to the resource.

A role isn't always 'everywhere in the workspace.' Mixed-sensitivity workspaces — say, a public Cars ontology alongside a regulated Compliance ontology — need finer scoping. Grant a user Editor on `ont_cars` and Viewer on `ont_compliance`. The same person, the same workspace, two different postures, automatically enforced.

  • Scope each role grant to: workspace · ontology · scheme
  • A user can hold different roles in different ontologies of the same workspace
  • Per-scheme grants for shared ontologies with mixed sensitivity
  • Validation panel and exports respect the active grant — no leakage
Role grants for one user
json
[
  {
    "userEmail":   "claire@example.com",
    "role":        "editor",
    "scope":       { "kind": "ontology", "ontologyId": "ont_cars" }
  },
  {
    "userEmail":   "claire@example.com",
    "role":        "viewer",
    "scope":       { "kind": "ontology", "ontologyId": "ont_compliance" }
  },
  {
    "userEmail":   "claire@example.com",
    "role":        "role_junior_curator",
    "scope":       { "kind": "scheme",
                     "ontologyId": "ont_cars",
                     "schemeId":  "cs_body_styles" }
  }
]

Level 4 · Business tier

SAML SSO with IdP-group → role mapping.

Your identity provider already knows who's a Senior Curator and who's a New Hire. Don't rebuild that knowledge in Semlify — map it. Connect Okta, Entra, JumpCloud, or any SAML 2.0 IdP. Map a group claim like `engineering-data` to the Editor role, or to a custom role you've defined. Just-in-time provisioning means new hires land in the right role on first sign-in, no manual invite step.

  • SAML 2.0 — works with Okta, Entra ID, JumpCloud, Google Workspace
  • Map SAML group attributes to Semlify roles, declaratively
  • Just-in-time provisioning · first sign-in lands in the mapped role
  • Group changes in your IdP propagate on the next sign-in
SSO group mapping
yaml
# Maps the IdP "groups" SAML claim to Semlify roles.
# First match wins. Users without a match cannot sign in.

mappings:
  - claim:    "groups"
    contains: "semlify-owners"
    role:     "owner"

  - claim:    "groups"
    contains: "data-platform-admins"
    role:     "admin"

  - claim:    "groups"
    contains: "engineering-data"
    role:     "editor"

  - claim:    "groups"
    contains: "compliance-readonly"
    role:     "viewer"
    scope:    { kind: "ontology", ontologyId: "ont_compliance" }

  - claim:    "groups"
    contains: "junior-curators"
    role:     "role_junior_curator"

Every tier

API tokens carry their own role.

Generate an API token from any workspace; it inherits a role at creation time. Most pipelines only need to read, so the default is the most restrictive role that works. A leaked Viewer token can't write, can't delete, can't see other workspaces. Revoke from the dashboard at any time; the change propagates within seconds. Every token also has a last-used timestamp and IP — spot a leaked token before the auditor does.

  • Pick the role at creation · same primitives as user roles, including custom
  • One token = one workspace = one scope = one role
  • Last-used timestamp and IP exposed in the dashboard
  • Revoke is immediate · removed members lose every token they issued
Reading with a Viewer token
bash
# A Viewer token can read but not write
curl https://api.semlify.com/v1/ontologies/cars/concepts \
  -H "Authorization: Bearer ont_pat_viewer_abc123"

# Same token cannot write
curl -X POST https://api.semlify.com/v1/ontologies/cars/concepts \
  -H "Authorization: Bearer ont_pat_viewer_abc123"
# 403 Forbidden  ·  role 'viewer' lacks 'concept.write'

# Token scoped to a single ontology cannot reach another
curl https://api.semlify.com/v1/ontologies/compliance/concepts \
  -H "Authorization: Bearer ont_pat_viewer_abc123"
# 403 Forbidden  ·  token scope does not include 'ont_compliance'

Audit & visibility

Every grant is a record. Every record is queryable.

Role grants live in the same change history as concepts and tags. The Members view is a sortable list of every active grant; the audit log is the full history of who granted what to whom, when, and why.

  • Members view — sortable by role, scope, last-seen, granted-by
  • One-click revoke; one-click change-role; one-click extend access
  • Every grant emits a ChangeEvent — visible in the global audit log
  • Audit log API on Business+ — pipe role events into your own SIEM
  • Quarterly access review export — auditors download a CSV in seconds

By tier

What unlocks where.

Capability Free Team Business Enterprise
Four built-in roles
Scoped API tokens
Workspace-scoped permissions
Members view + audit history
Custom roles
Per-ontology / per-scheme grants
SAML SSO with group mapping
Audit log export over API
Custom role-attribute policies (ABAC)
Identity-provider SCIM provisioning

Further out

On the radar, not on a date.

  • Just-in-time access — request a role grant for the next four hours, with auto-expiry
  • Audit-only role with cryptographic read receipts for regulated environments
  • Approval workflows on grants — second pair of eyes before a role is created
  • Attribute-based access control — predicates over concept properties (e.g. 'department=R&D')

Stop debating who can edit what.

Built-in roles on every tier. Custom roles, per-resource grants, and SAML on Business. Free workspace, no credit card.