# Room (SIP) Video SDK offers the ability to call out to conference room devices using the H.323/SIP [Conference Room Connector](https://support.zoom.com/hc/en/article?id=zm_kb&sysparm_article=KB0060661). _H.323 and Session Initiation Protocol (SIP) are protocols for sending media online._ ## Prerequisites - [Video SDK Account](https://zoom.us/pricing/developer). - [Conference Room Connector Plan](https://zoom.us/billing). - **The session must exist** - there must be at least one user in the session before you can use call in or call out. ## Check whether CRC is available Use `isCRCEnabled()` on `ZoomVideoSDKCRCHelper` to see if CRC is available for this user. ```swift if let crcHelper = ZoomVideoSDK.shareInstance()?.getCRCHelper() { let isEnabled = crcHelper.isCRCEnabled() } ``` ```objectivec ZoomVideoSDKCRCHelper *crcHelper = [[ZoomVideoSDK shareInstance] getCRCHelper]; BOOL isEnabled = [crcHelper isCRCEnabled]; ``` ## Dial out Use `callCRCDevice` on `ZoomVideoSDKCRCHelper` to call out to a Cloud Room Connector (CRC) device to join a session. ```swift if let crcHelper = ZoomVideoSDK.shareInstance()?.getCRCHelper() { crcHelper.callCRCDevice("7357@test.plcm.vc", protocol: ZoomVideoSDKCRCProtocol_SIP) } ``` ```objectivec ZoomVideoSDKCRCHelper *crcHelper = [[ZoomVideoSDK shareInstance] getCRCHelper]; [crcHelper callCRCDevice:@"7357@test.plcm.vc" protocol:ZoomVideoSDKCRCProtocol_SIP]; ``` ### Cancel room device call Cancel the CRC call with `cancelCallCRCDevice` if you need to cancel the call out request before it is complete. ```swift if let crcHelper = ZoomVideoSDK.shareInstance()?.getCRCHelper() { crcHelper.cancelCallCRCDevice() } ``` ```objectivec ZoomVideoSDKCRCHelper *crcHelper = [[ZoomVideoSDK shareInstance] getCRCHelper]; [crcHelper cancelCallCRCDevice]; ``` ### Callback for call status Listen for CRC device call state changes with the `onCallCRCDeviceStatusChanged` callback under `ZoomVideoSDKDelegate`. States include `ZoomVideoSDKCRCCallStatus_Busy`, `ZoomVideoSDKCRCCallStatus_Decline`, `ZoomVideoSDKCRCCallStatus_Failed`, `ZoomVideoSDKCRCCallStatus_Ring`, `ZoomVideoSDKCRCCallStatus_Success`, and `ZoomVideoSDKCRCCallStatus_Timeout`. ```swift func onCallCRCDeviceStatusChanged(_ state: ZoomVideoSDKCRCCallStatus) { print("CRC call status: \(state)") } ``` ```objectivec - (void)onCallCRCDeviceStatusChanged:(ZoomVideoSDKCRCCallStatus)state { NSLog(@"CRC call status: %lu", (unsigned long)state); } ``` ### Webhooks Use the following webhooks to get notified of the call out status. - [`session.user_room_system_callout_accepted`](/docs/api/video-sdk/events/#tag/session/POSTsession.user_phone_callout_accepted) - [`session.user_room_system_callout_failed`](/docs/api/video-sdk/events/#tag/session/POSTsession.user_room_system_callout_failed) - [`session.user_room_system_callout_missed`](/docs/api/video-sdk/events/#tag/session/POSTsession.user_phone_callout_missed) - [`session.user_room_system_callout_rejected`](/docs/api/video-sdk/events/#tag/session/POSTsession.user_phone_callout_rejected) - [`session.user_room_system_callout_ringing`](/docs/api/video-sdk/events/#tag/session/POSTsession.user_room_system_callout_ringing) ## Dial-in To dial in to a Video SDK session, append the session number to `@zoomcrc.com`, for example `{SESSION_NUMBER}.{PASSCODE}@zoomcrc.com`, and provide the passcode when prompted. You can obtain these values using an SDK function or API endpoints. ### Reserve a session to set up dial-in access To enable dial-in, you must reserve a session ID in advance using the [Create a session API](/docs/api/video-sdk/#tag/sessions/post/videosdk/sessions). This reserves the session for up to 24 hours for your specified session name. When you start and join the session with that session name during the reservation period, dial-in users will be able to access it. ### Get dial-in information Get dial-in details using either the SDK function or API endpoints. #### Using an SDK function To retrieve dial-in information with the `getSessionSIPAddress` function, the returned value will be in this format: `{SESSION_NUMBER}.{PASSCODE}@global.zoomcrc.com` For example: ```swift if let crcHelper = ZoomVideoSDK.shareInstance()?.getCRCHelper() { let sipAddress = crcHelper.getSessionSIPAddress() } ``` ```objectivec ZoomVideoSDKCRCHelper *crcHelper = [[ZoomVideoSDK shareInstance] getCRCHelper]; NSString *sipAddress = [crcHelper getSessionSIPAddress]; ``` #### Using API endpoints Get dial-in information using either the [Create a session](/docs/api/video-sdk/#tag/sessions/post/videosdk/sessions) or [Get session details](/docs/api/video-sdk/#tag/sessions/get/videosdk/sessions/{sessionId}) APIs. **Sample request** ```javascript var sipDialInAddress = responseBody.session_number + "@zoomcrc.com"; var sipDialInPasscode = responseBody.session_password; ``` **Sample response** ```json { "session_id": "sfk/aOFJSJSYhGwk1hnxgw==", "session_number": 97763643886, "session_name": "My session", "session_password": "123456", "passcode": "123456", "created_at": "2022-03-25T07:29:29Z", "settings": { "auto_recording": "cloud", "global_dial_in_countries": [ //... ], "global_dial_in_numbers": [ //... ] } } ``` ## Custom welcome message You can customize the welcome message that H.323/SIP participants hear when they join a session. See [H.323/SIP Conferencing](/docs/build/account/#h323sip-conferencing) in the account settings documentation for details. ## More SIP features For the full set of SIP features, see [ZoomVideoSDKCRCHelper in the Video SDK Reference](https://marketplacefront.zoom.us/sdk/custom/ios/interface_zoom_video_s_d_k_c_r_c_helper.html).