Skip to main content

Organization management

Use Clerk's iOS Organization APIs to create and manage Organizations, switch the , and build custom Organization flows. Organization methods use Swift concurrency and throw when a request fails, so call them with try await from an async context.

import ClerkKit

do {
  let organization = try await Clerk.shared.organizations.create(
    name: "Acme",
    slug: "acme"
  )
} catch {
  // Show an error state.
}

Active Organization

The is stored on Session.lastActiveOrganizationId for the current session. Use clerk.organization to read the Active Organization and clerk.organizationMembership to read the signed-in user's Active Organization membership.

Use clerk.auth.setActive() to switch the for a session. Pass sessionId and organizationId to select an Organization, or omit organizationId (or pass nil) to select the user's . The latter isn't allowed when clerk.environment?.organizationSettings.forceOrganizationSelection is true.

Select an Organization

guard let sessionId = clerk.session?.id else { return }

try await clerk.auth.setActive(
  sessionId: sessionId,
  organizationId: "org_123"
)
guard let sessionId = clerk.session?.id else { return }

try await clerk.auth.setActive(sessionId: sessionId)

Organization

Organization represents a Clerk Organization and provides helpers for profile, role, membership, invitation, request, and domain management.

Create or get an Organization

let organization = try await clerk.organizations.create(
  name: "Acme",
  slug: "acme"
)

let existingOrganization = try await clerk.organizations.get(id: "org_123")
let updatedOrganization = try await organization.update(
  name: "Acme, Inc.",
  slug: "acme-inc"
)
let deletedObject = try await organization.destroy()
let updatedOrganization = try await organization.setLogo(imageData: imageData)
let organizationWithoutLogo = try await organization.deleteLogo()
let response = try await organization.getRoles(page: 1, pageSize: 20)
let roles = response.data
let totalCount = response.totalCount

Memberships

Use membership APIs to list members, add members, update Roles, remove members, leave an Organization, and check Organization Permissions.

List memberships

let response = try await organization.getMemberships(
  query: "jane",
  role: ["org:member"],
  page: 1,
  pageSize: 20
)

let memberships = response.data
let membership = try await organization.addMember(
  userId: userId,
  role: "org:member"
)

let removedMembership = try await organization.removeMember(userId: userId)

Update or delete a membership

OrganizationMembership also provides helpers for updating a member's role in the Organization and deleting the membership.

let updatedMembership = try await organizationMembership.update(role: "org:admin")
let deletedMembership = try await organizationMembership.destroy()

Check membership Permissions

OrganizationMembership provides the hasPermission() method, along with the convenience properties below for checking Clerk System Permissions:

  • canManageProfile
  • canDeleteOrganization
  • canReadMemberships
  • canManageMemberships
  • canReadDomains
  • canManageDomains
  • canReadBilling
  • canManageBilling
  • canReadAPIKeys
  • canManageAPIKeys
if organizationMembership.canManageMemberships {
  // Show member management actions.
}

if organizationMembership.hasPermission("org:sys_domains:manage") {
  // Show domain management actions.
}

You can also use the typed OrganizationSystemPermission enum:

if organizationMembership.hasPermission(.manageDomains) {
  // Show domain management actions.
}

Invitations

Use invitation APIs to invite users to an Organization, list invitations, bulk-create invitations, and revoke invitations.

Create or list invitations

let invitation = try await organization.inviteMember(
  emailAddress: "new@acme.com",
  role: "org:member"
)

let response = try await organization.getInvitations(
  page: 1,
  pageSize: 20,
  status: ["pending"]
)

let invitations = response.data
let invitations = try await organization.inviteMembers(
  emailAddresses: ["one@acme.com", "two@acme.com"],
  role: "org:member"
)

Revoke an invitation

OrganizationInvitation also provides a helper for revoking an invitation.

let revokedInvitation = try await invitation.revoke()

Membership Requests

Use Membership Request APIs to list, accept, and reject requests to join an Organization.

List Membership Requests

let response = try await organization.getMembershipRequests(
  page: 1,
  pageSize: 20,
  status: "pending"
)

let membershipRequests = response.data

Accept or reject a Membership Request

OrganizationMembershipRequest also provides helpers for accepting and rejecting Membership Requests.

let acceptedRequest = try await membershipRequest.accept()
let rejectedRequest = try await membershipRequest.reject()

Domains

Use Organization domain APIs to create, list, retrieve, verify, update, and delete Verified Domains.

Create or list domains

let domain = try await organization.createDomain(domainName: "acme.com")

let response = try await organization.getDomains(
  page: 1,
  pageSize: 20,
  enrollmentMode: .automaticInvitation
)

let domains = response.data
let domain = try await organization.getDomain(domainId: domainId)
let deletedObject = try await domain.delete()

OrganizationDomain also provides helpers for deleting a domain, verifying affiliation, and updating the enrollment mode.

  • domain.delete()
  • domain.prepareAffiliationVerification(affiliationEmailAddress:)
  • domain.attemptAffiliationVerification(code:)
  • domain.sendEmailCode(affiliationEmailAddress:)
  • domain.verifyCode(_:)
  • domain.updateEnrollmentMode(_:deletePending:)

Delete a domain

Use domain.delete() when you already have an OrganizationDomain instance. To delete a domain by ID, fetch it with organization.getDomain(domainId:) first, then call delete() on the result.

let deletedObject = try await domain.delete()
let preparedDomain = try await domain.prepareAffiliationVerification(
  affiliationEmailAddress: "admin@acme.com"
)

let verifiedDomain = try await preparedDomain.attemptAffiliationVerification(
  code: "123456"
)
let preparedDomain = try await domain.sendEmailCode(
  affiliationEmailAddress: "admin@acme.com"
)

let verifiedDomain = try await preparedDomain.verifyCode("123456")
let updatedDomain = try await verifiedDomain.updateEnrollmentMode(
  .automaticInvitation,
  deletePending: false
)

User Organization helpers

User also provides helpers for listing Organization invitations, suggestions, memberships, and creation defaults.

List Organization invitations

let invitationResponse = try await user.getOrganizationInvitations(
  page: 1,
  pageSize: 20,
  status: ["pending"]
)

let invitations = invitationResponse.data

UserOrganizationInvitation also provides a helper for accepting an invitation.

let acceptedInvitation = try await userOrganizationInvitation.accept()
let suggestionResponse = try await user.getOrganizationSuggestions(
  page: 1,
  pageSize: 20,
  status: ["pending"]
)

let suggestions = suggestionResponse.data

OrganizationSuggestion also provides a helper for accepting a suggestion.

let acceptedSuggestion = try await organizationSuggestion.accept()
let membershipResponse = try await user.getOrganizationMemberships(
  page: 1,
  pageSize: 20
)

let memberships = membershipResponse.data
let creationDefaults = try await user.getOrganizationCreationDefaults()
let deletedObject = try await user.leaveOrganization(organizationId: "org_123")

Feedback

What did you think of this content?

Last updated on