# Organization management

Use Clerk's iOS Organization APIs to create and manage Organizations, switch the Active Organization, 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.

```swift
import ClerkKit

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

## Active Organization

The Active Organization is stored on `Session.lastActiveOrganizationId` for the current session. Use [clerk.organization](https://clerk.com/docs/ios/reference/native-mobile/clerk.md#access-the-active-organization-state) 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 Active Organization for a session. Pass `sessionId` and `organizationId` to select an Organization, or omit `organizationId` (or pass `nil`) to select the user's Personal Account. The latter isn't allowed when `clerk.environment?.organizationSettings.forceOrganizationSelection` is `true`.

### Select an Organization

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

try await clerk.auth.setActive(
  sessionId: sessionId,
  organizationId: "org_123"
)
```

### Select the Personal Account

```swift
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

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

let existingOrganization = try await clerk.organizations.get(id: "org_123")
```

### Update an Organization

```swift
let updatedOrganization = try await organization.update(
  name: "Acme, Inc.",
  slug: "acme-inc"
)
```

### Delete an Organization

```swift
let deletedObject = try await organization.destroy()
```

### Manage the Organization logo

```swift
let updatedOrganization = try await organization.setLogo(imageData: imageData)
let organizationWithoutLogo = try await organization.deleteLogo()
```

### List Roles

```swift
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

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

let memberships = response.data
```

### Create or remove a membership

```swift
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.

```swift
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](https://clerk.com/docs/guides/organizations/control-access/roles-and-permissions.md?sdk=ios#system-permissions):

- `canManageProfile`
- `canDeleteOrganization`
- `canReadMemberships`
- `canManageMemberships`
- `canReadDomains`
- `canManageDomains`
- `canReadBilling`
- `canManageBilling`
- `canReadAPIKeys`
- `canManageAPIKeys`

```swift
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:

```swift
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

```swift
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
```

### Bulk-create invitations

```swift
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.

```swift
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

```swift
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.

```swift
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

```swift
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
```

### Get or delete a domain

```swift
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:)](https://clerk.com/docs/ios/reference/native-mobile/organizations.md#get-or-delete-a-domain) first, then call `delete()` on the result.

```swift
let deletedObject = try await domain.delete()
```

### Prepare or attempt affiliation verification

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

let verifiedDomain = try await preparedDomain.attemptAffiliationVerification(
  code: "123456"
)
```

### Send and verify a domain email code

```swift
let preparedDomain = try await domain.sendEmailCode(
  affiliationEmailAddress: "admin@acme.com"
)

let verifiedDomain = try await preparedDomain.verifyCode("123456")
```

### Update a domain's enrollment mode

```swift
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

```swift
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.

```swift
let acceptedInvitation = try await userOrganizationInvitation.accept()
```

### List Organization suggestions

```swift
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.

```swift
let acceptedSuggestion = try await organizationSuggestion.accept()
```

### List Organization memberships

```swift
let membershipResponse = try await user.getOrganizationMemberships(
  page: 1,
  pageSize: 20
)

let memberships = membershipResponse.data
```

### Get Organization creation defaults

```swift
let creationDefaults = try await user.getOrganizationCreationDefaults()
```

### Leave an Organization

```swift
let deletedObject = try await user.leaveOrganization(organizationId: "org_123")
```

---

## Sitemap

[Overview of all docs pages](https://clerk.com/docs/llms.txt)
