# Start a meeting for a non-logged in or API user > The code on this page works with either the **default UI** or the **custom UI**. After getting the [Zoom Access Key (ZAK) token](/docs/api/users/#tag/users/get/users/me/zak), pass it to start meetings with either a meeting number or a vanity ID. ## Start with a meeting number To start a meeting with meeting number, first get a `ZoomSDKMeetingService` instance from `ZoomSDK`. ```swift guard let meetingService = ZoomSDK.shared().getMeetingService() else { return } ``` ```objectivec ZoomSDKMeetingService *meetingService = [[ZoomSDK sharedSDK] getMeetingService]; if (!meetingService) { return; } ``` Then, prepare `ZoomSDKStartMeetingUseZakElements`. ```swift let params = ZoomSDKStartMeetingUseZakElements() ``` ```objectivec ZoomSDKStartMeetingUseZakElements *params = [[ZoomSDKStartMeetingUseZakElements alloc] init]; ``` Store the Zoom Access Key (`zak`), display name, and meeting number in the `ZoomSDKStartMeetingUseZakElements` instance, and start the meeting by calling `startMeetingWithZAK` method. ```swift params.userType = SDKUserType_APIUser // SDKUserType class params.zak = "ZAK" // ZAK of the local user params.displayName = "DISPLAY_NAME" params.meetingNumber = 123456789 let result = meetingService.startMeeting(withZAK: params) ``` ```objectivec params.userType = SDKUserType_APIUser; params.zak = @"ZAK"; // ZAK of the local user params.displayName = @"DISPLAY_NAME"; params.meetingNumber = 123456789; ZoomSDKError result = [meetingService startMeetingWithZAK:params]; ``` ## Start with a vanity ID A **vanity ID** is a special and personalized ID that uniquely belongs to a user. To start a meeting with a vanity ID, the process is almost the same as starting a meeting with a meeting number. Just store the `vanityID` inside the `ZoomSDKStartMeetingUseZakElements` instance instead of the `meetingNumber`. ```swift params.userType = SDKUserType_APIUser // SDKUserType class params.zak = "ZAK" // ZAK of the local user params.displayName = "DISPLAY_NAME" params.vanityID = "123456789" let result = meetingService.startMeeting(withZAK: params) ``` ```objectivec params.userType = SDKUserType_APIUser; params.zak = @"ZAK"; // ZAK of the local user params.displayName = @"DISPLAY_NAME"; params.vanityID = @"123456789"; ZoomSDKError result = [meetingService startMeetingWithZAK:params]; ``` ## Start meeting status To know whether the start meeting action succeeded, didn't succeed, or resulted in an error, listen to the `onMeetingStatusChange` callback under `ZoomSDKMeetingServiceDelegate`. ```swift guard let meetingService = ZoomSDK.shared().getMeetingService() else { return } meetingService.delegate = self extension ViewController: ZoomSDKMeetingServiceDelegate { func onMeetingStatusChange(_ state: ZoomSDKMeetingStatus, meetingError error: ZoomSDKMeetingError, end reason: EndMeetingReason) { } } ``` ```objectivec // In your .h file @interface TestWindow : NSWindowController { } // In your .m file ZoomSDKMeetingService *meetingService = [[ZoomSDK sharedSDK] getMeetingService]; if (!meetingService) { return; } meetingService.delegate = self; - (void)onMeetingStatusChange:(ZoomSDKMeetingStatus)state meetingError:(ZoomSDKMeetingError)error EndReason:(EndMeetingReason)reason { } ``` ---