# 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 Token` and the `Zoom Access Token`, pass these tokens to start meetings with meeting number. ## Start a meeting with a meeting number To start a meeting with meeting number, retrieve a `MobileRTCMeetingService` instance from `MobileRTC`. ```swift MobileRTCMeetingService *ms = [[MobileRTC sharedRTC] getMeetingService]; if (ms) { #if 0 //customize meeting title [ms customizeMeetingTitle:@"Sample Meeting Title"]; #endif } ``` Then, get the [Zoom Access Key (ZAK) token](/docs/api/users/#tag/users/GET/users/me/zak). ```swift //Sample for Start Param interface MobileRTCMeetingStartParam * param = nil; //Sample: How to get ZAK via RestAPI NSString * ZAK = [self requestTokenOrZAKWithType:MobileRTCSampleTokenType_ZAK]; ``` See [Get a user's ZAK](/docs/api/users/#tag/users/GET/users/me/zak) and [SDK Authentication](/docs/meeting-sdk/auth/) for more details about ZAK tokens. After that, store this value to the `MobileRTCMeetingStartParam4WithoutLoginUser` object and pass the object to `startMeetingWithStartParam` function to start a meeting. ```swift MobileRTCMeetingStartParam4WithoutLoginUser * user = [[[MobileRTCMeetingStartParam4WithoutLoginUser alloc]init] autorelease]; user.userType = MobileRTCUserType_APIUser; user.meetingNumber = kSDKMeetNumber; user.userName = kSDKUserName; user.userID = kSDKUserID; user.isAppShare = appShare; user.zak = ZAK; param = user; MobileRTCMeetError ret = [ms startMeetingWithStartParam:param]; NSLog(@"onMeetNow ret:%d", ret); return; ``` ## Start meeting status To discover whether the start meeting action is successful, or to get the error message, implement the `onMeetingStatusChange` method: ```swift - (void)onMeetingStateChange:(MobileRTCMeetingState)state; { NSLog(@"onMeetingStateChange:%d", state); // ... } ```