RingCentral Connect Platform
Transcription
RingCentral Connect Platform
RingCentral Connect Platform Developer's Guide RingCentral Connect Platform: Developer's Guide Rev.1.0.16.a.[79434afda268+] Publication date Apr 14, 2015 (API version 1.0.16, Service version 7.1) Copyright © 2012-2015 RingCentral, Inc. All rights reserved. RingCentral is a registered trademark of RingCentral, Inc. CONFIDENTIAL ii Rev.1.0.16.a.[79434afda268+] Preface ............................................................................................................................. v I. Developing with RingCentral Connect Platform .................................................................... 1 1. REST Overview ..................................................................................................... 2 Resources and Parameters .................................................................................... 2 HTTP Methods .................................................................................................. 4 Object Representation ......................................................................................... 5 User Agent Identification ..................................................................................... 6 Languages Support ............................................................................................. 7 HTTP Status Codes ............................................................................................ 7 Logical Error Codes ............................................................................................ 9 Batch Requests ................................................................................................. 11 2. API Usage Plans ................................................................................................... 14 What is Usage Plan .......................................................................................... 14 Default Usage Plan & Organization .................................................................... 14 Usage Plan Details ........................................................................................... 14 3. Authentication ...................................................................................................... 15 OAuth 2.0 Authorization .................................................................................... 15 Tokens ............................................................................................................ 15 Two-legged Authorization Flow .......................................................................... 16 Token Revocation ............................................................................................. 19 Application Permissions ..................................................................................... 20 4. Exploring Account and Extension Settings ................................................................. 21 Account and Extension Information ..................................................................... 21 5. Accessing Call Log ............................................................................................... 25 Call Log Access Rules ...................................................................................... 25 Commonly Used Call Actions and Results ............................................................ 25 6. Working with Messages ......................................................................................... 28 Message Attributes ........................................................................................... 28 Message Availability and Life Cycle .................................................................... 29 SMS and Pager Messages .................................................................................. 30 Fax Messages ................................................................................................... 32 7. RingOut ............................................................................................................... 38 Two-Legged RingOut Call ................................................................................. 38 8. Notifications and Subscriptions ................................................................................ 41 Subscription Flow ............................................................................................. 41 Notifications Transport ...................................................................................... 44 PubNub ................................................................................................... 44 9. Dictionary: Getting Static Data ................................................................................ 46 II. API Reference .............................................................................................................. 50 10. Common Data Types and Structures ....................................................................... 51 Data Types ...................................................................................................... 51 Resource Identification Properties ........................................................................ 52 Common Collection Properties ............................................................................ 52 Generic Path Parameters .................................................................................... 53 Common Query Parameters in Collection Resources ............................................... 53 Caller Info ....................................................................................................... 54 Standard Error Response .................................................................................... 55 11. Authentication ..................................................................................................... 56 Get Token ....................................................................................................... 56 Resource Owner Password Credentials Flow .................................................. 56 Refresh Token Flow .................................................................................. 58 Revoke Token .................................................................................................. 59 12. API Versioning ................................................................................................... 60 Get API Versions ............................................................................................. 60 CONFIDENTIAL iii Rev.1.0.16.a.[79434afda268+] RingCentral Connect Platform Get Version Info ............................................................................................... 61 13. Account and Extension Information ........................................................................ 63 Get Account Info .............................................................................................. 63 Get Extension Info ............................................................................................ 65 Get Extension List ............................................................................................ 74 14. Call Log ............................................................................................................ 76 Get Call Log Record ......................................................................................... 76 Get Call Log Records by Filter ........................................................................... 79 Get Active Calls ............................................................................................... 83 15. Messaging .......................................................................................................... 86 Get Message .................................................................................................... 86 Get Message List .............................................................................................. 91 Update Message ............................................................................................... 93 Delete Message ................................................................................................ 95 Delete Messages in a Thread .............................................................................. 96 Get Message Attachment Data ............................................................................ 97 Create SMS Message ......................................................................................... 98 Create Fax Message .......................................................................................... 99 Create Pager Message ...................................................................................... 102 16. RingOut ........................................................................................................... 105 Make RingOut Call ......................................................................................... 105 Get Status of RingOut Call ............................................................................... 107 Cancel RingOut Call ........................................................................................ 108 17. Presence ........................................................................................................... 109 Get Extension Presence Status ........................................................................... 109 18. Notifications: Subscription API ............................................................................ 112 Create Subscription ......................................................................................... 112 Get Subscription ............................................................................................. 116 Renew Subscription ......................................................................................... 117 Modify Event Filters ........................................................................................ 118 Cancel Subscription ......................................................................................... 119 Notifications Event Types ................................................................................. 120 Messages Event ...................................................................................... 120 Presence Event ....................................................................................... 121 Detailed Presence Event ........................................................................... 122 Presence Line Event ............................................................................... 124 19. Dictionary ......................................................................................................... 126 Get Single Country .......................................................................................... 126 Get Countries ................................................................................................. 127 Get Single State .............................................................................................. 128 Get States of a Country .................................................................................... 129 Get All Locations ............................................................................................ 131 Get Single Timezone ....................................................................................... 133 Get All Timezones .......................................................................................... 134 Get Language List ........................................................................................... 136 Get Single Language ....................................................................................... 137 CONFIDENTIAL iv Rev.1.0.16.a.[79434afda268+] Preface This guide is intended to help developers build applications using the RingCentral API. The API allows development of customized software solutions based on the RingCentral business phone service. What is RingCentral? RingCentral provides a cloud-based virtual business phone system that is connected to the Public Switched Telephone Network (PSTN), the traditional global telephone network. RingCentral clients can access and configure their phone system on a Service Web, and also via free mobile apps running on tablets and smartphones. No additional phone hardware is required as the clients can use RingCentral softphones or redirect calls to their existing phones. All phones are connected through a single corporate phone number provided by RingCentral, or through an existing phone, thus unifying all phone communication services. This enables companies to be more responsive to their customers and facilitate internal communication. A call to a client is usually processed as follows: 1. The caller is greeted by an auto-attendant reporting company name and available extensions. 2. The call may be forwarded to an extension the caller has selected from a directory. 3. If the extension user does not pick up the phone, the call may be forwarded to the user's home or mobile phone (if the time is appropriate, as defined by the user). 4. If the call is not picked up, the caller will be asked to record a voicemail message. 5. The caller's number will be logged in the system even if the caller hangs up the phone without leaving a message. Thus the companies are able to stay in touch with their customers, even if the employees are out of office. The service is flexible and provides nearly limitless possible configurations. RingCentral clients are typically small and medium size companies, or individuals who require a professional but low-cost business communications solution. These businesses have highly diverse requirements and not all of them can be met by RingCentral standard web and mobile services. The Purpose of the RingCentral API. RingCentral API was created to cover additional business requirements and improve customer experience. The API is a powerful yet simple interface allowing development of customized and integrated solutions including web, mobile, and desktop applications with full access to the RingCentral phone service. Organization. This Developer's Guide is organized into two major parts: Developing with RingCentral Connect Platform and API Reference. • Part 1: Developing with RingCentral Connect Platform This part will introduce you to the RingCentral REST API. It starts with the REST architecture basics and its usage in terms of RingCentral API. The next chapter provides information on API Authorization using OAuth. The other chapters describe basic principles of the RingCentral API; its functionality is demonstrated by a few examples. • Part 2: API Reference The sections in this part describe in detail every API endpoint with path and query parameters, their possible values, and examples of requests and responses. CONFIDENTIAL v Rev.1.0.16.a.[79434afda268+] Part I. Developing with RingCentral Connect Platform CONFIDENTIAL 1 Rev.1.0.16.a.[79434afda268+] Chapter 1. REST Overview The RingCentral API is based on the Representational State Transfer (REST) architecture. REST is not a standard but an architectural style, and it uses the following standards: • HTTP • URL • XML/HTML/GIF/JPEG/etc. (resource representations) • text/xml, text/html, application/json, image/jpeg, etc. (MIME types) REST allows you to access the API in the same way you would access a web server. Whenever you want to access any API service, send a standard HTTP command to a particular resource that represents the required functionality. Every API service is represented by a specific endpoint that is accessed by its own URI via sending standard requests using HTTP methods (GET, POST, PUT, DELETE). One of the key advantages of REST architecture is simplicity. You can build your application on the fly without any additional tools, development kits or specifications. If you know how to interact with a simple web server, then you are ready to use the RingCentral API. Resources and Parameters Every entity in the RingCentral API is represented with a certain resource identified by a specific URI. The structure of each resource URI is similar to that of the web page URL. The URI syntax is represented by the following scheme: <protocol> :// <hostname> [: <port>] / <path> [? <query>] [# <fragment>] • protocol indicates a networking protocol (http or https protocols are generally used in REST). • hostname is a part of the URI that contains server network address information. • port is a TCP port where server listens for incoming requests. If omitted, the default value is used for a given protocol. • path is a resource identification hierarchical by nature. • query is an optional part separated by a question mark (?) and contains additional identification information that is not hierarchical in nature. The query string syntax is commonly organized as a sequence of key=value pairs separated by an ampersand. In the case of the RingCentral API, key is a name of query parameter, while value is its value. Not all API resources allow query parameters. • fragment is an optional part separated from the front parts by hash symbol (#), that contains additional information redirecting to a secondary resource; for example, a section heading of an article identified by the URI. The RingCentral REST API does not use fragments. Protocol, host and port altogether constitute the main entry point to access the API. RingCentral production servers are accessible on https://platform.ringcentral.com. Please note that for security reasons connection is allowed using only HTTPS protocol to the default HTTPS port 443, so the port can be omitted in the URI. CONFIDENTIAL 2 Rev.1.0.16.a.[79434afda268+] REST Overview Note If you plan to work with non-production servers you may be required to use other entry points. For example, RingCentral Sandbox environment is accessible via https:// platform.devtest.ringcentral.com base URI. If you are not sure what URI you should use for your environment, please contact RingCentral Technical Support to get proper connection settings. All of the API resources are organized in a hierarchical manner and presented in a tree-like structure. All resource paths are started from /restapi. Let's consider a typical API resource URI: https://platform.ringcentral.com/restapi/v1.0/account/159048008/extension/171857008/call-log? dateFrom=2012-08-26 The URI in the example above contains path parameters highlighted in bold. Path parameters are commonly used in the RingCentral API to identify a particular entity belonging to a given type by its unique key. Since most of the API resources represent some objects which are owned by particular a RingCentral account (company) or user, two basic path parameters are accountId and extensionId. They identify the account and extension of a RingCentral user, accordingly. Note RingCentral users associate an account with the company main phone number and an extension with the short extension number, but both accountId and extensionId are internal identifiers. At the same time the typical API usage scenario includes accessing particular resources on behalf of some user whose credentials (phone number, extension number and password) were passed on authentication phase. Thus in this case API enables the simplified syntax of specifying account and extension identifiers in the URI. The tilde symbol (~) can be used as a replacement for both accountId and extensionId if you are going to access data that belongs to account/extension that you are currently logged in to. Considering the example above, if the user successfully authenticated to work with account 159048008 and extension 171857008 the URI to retrieve the same resource may be written as follows: https://platform.ringcentral.com/restapi/v1.0/account/~/extension/~/call-log?dateFrom=2012-08-26 Apart from these two basic path parameters you will also meet the others while learning the API. They will be discussed further in this guide and are extensively described in the API Reference section. Another kind of parameter you will come across in the RingCentral API is a query parameter. Query parameters are generally used in object retrieval operations and let the consumer specify the filtering criteria, the desired level of details, etc. Query parameter values in the URL have to be encoded according to RFC-1738: Uniform Resource Locators [https://tools.ietf.org/html/rfc1738]. Query parameters support setting multiple values. It is possible to specify several values for a single query parameter, and filtering results will cover all of them. For example, this functionality is applied to retrieve or remove lists of messages and records. Let's consider the examples below to illustrate the API resources and parameters. For simplicity reasons, we will exclude protocol and host values from the URIs in the examples. • Get service plan information for RingCentral customer account (accountId will be automatically determined from authentication data): CONFIDENTIAL 3 Rev.1.0.16.a.[79434afda268+] REST Overview /restapi/v1.0/account/~/service-info • Get all SMS messages from a mailbox of account user (extensionId is specified explicitly): /restapi/v1.0/account/~/extension/171857008/message-store?messageType=SMS • Get all SMS and Pager messages from a mailbox of account user: /restapi/v1.0/account/~/extension/~/message-store?messageType=SMS&messageType=Pager HTTP Methods In the RingCentral API, as in any REST API, the resources are accessible by standard HTTP methods: GET, POST, PUT and DELETE. These methods form a uniform CRUD interface expanded as "create, retrieve, update and delete". • GET method is idempotent and retrieves the object represented by the resource that is specified in the request body. It may be the call log information for an extension, the address book with contacts, etc. • POST method creates a new object represented by the resource that is specified in the request. In the response body the server sends the representation of the created object, as if there is an immediate GET request for it. • PUT method modifies the already existing object represented by the resource that is specified in the request body. If the object was successfully modified, the server responds with the representation of the changed resource in the response body. The request body may contain only the modified properties of the resource. The response returns the entire resource representation with all of the properties, as in case of the GET request. • DELETE method removes the object represented by the resource that is specified in the request body. Note The majority of API resources do not support all of the four methods. In order to find out which resources support a particular method, please refer to API Reference. Let's consider a simple example of a GET method — retrieving the version of the RingCentral REST API. GET /restapi/v1.0 HTTP/1.1 Accept: application/json Authorization: Bearer UExBMDFUMDRQV1MwMnzpdvtYYNWMSJ7CL8h0zM6q6a9ntw HTTP/1.1 200 OK Content-Type: application/json { "uri" : "https.../restapi/", "apiVersions" : [ { "uri" : "https.../restapi/v1.0", "versionString" : "1.0.9", "releaseDate" : "2013-12-01T00:00:00.000Z", "uriString" : "v1.0" } ], "serverVersion" : "6.1.0.846", "serverRevision" : "294476" } CONFIDENTIAL 4 Rev.1.0.16.a.[79434afda268+] REST Overview Sometimes, due to different technical limitations, API clients cannot issue all HTTP methods. In the most severe case a client may be restricted to GET and POST methods only. To work around this situation the RingCentral API provides a mechanism for tunneling PUT and DELETE methods through POST. This can be achieved in two ways: 1. X-HTTP-Method-Override header Using X-HTTP-Method-Override the client instructs the server to override the actual value of the HTTP method by one passed in this header. For example, the following request: DELETE /restapi/v1.0/account/~/extension/~/message-store/4084362008 HTTP/1.1 can be alternatively sent as: POST /restapi/v1.0/account/~/extension/~/message-store/4084362008 HTTP/1.1 X-HTTP-Method-Override: DELETE 2. _method query parameter In really unfortunate circumstances some clients do not even support HTTP headers. The API allows overriding the method name using _method query parameter. See the example below which demonstrates this approach. POST /restapi/v1.0/account/~/extension/~/message-store/4084362008?_method=DELETE HTTP/1.1 If both the override header and query parameter are specified in the HTTP request and contain different values, the server returns HTTP 400 Bad Request error. Important Tunneling HTTP methods is a last resort that should be used only when no other workaround is available. Each HTTP method has its own characteristics, such as how it is cached, which HTTP clients and intermediaries expect. When tunneling these methods through HTTP POST, those expectations can no longer be met. Object Representation Whenever you need to send or retrieve a particular piece of data — for example, a call log record, information on an extension, etc. — it will be embedded in the HTTP request or response. The RingCentral API allows you to explicitly define a representation format by using the following HTTP headers. • Content-Type header defines the MIME type of the request body. The server will expect the request body to contain data in the specified format. • Accept header indicates desired MIME type of the response body. The server will return response data in this format (if possible) and will set the Content-Type response header accordingly. CONFIDENTIAL 5 Rev.1.0.16.a.[79434afda268+] REST Overview Note The API server accepts and returns all string values in UTF-8 encoding and does not support other character sets. It is not required to explicitly specify charset in ContentType and Accept HTTP headers. But a client has to implement proper encoding/decoding of character strings passed in HTTP requests/responses. Supported Representation Formats Format MIME type JSON application/ json HTML Form Data application/ (only for token request body as governed by OAuth 2.0 specification) HTTP request/response body example { "uri": "https://platform.ringcentral.com/restapi/ v1.0", "versionString": "1.0.0", "releaseDate": "2012-06-14T00:00:00.000Z", "uriString": "v1.0" } grant_type=password&username=18887776655&password=987654 x-www-formurlencoded Note The RingCentral API uses JSON as the default representation format. It means that if the Accept header is not set, the server will return results in JSON. And, consequently, all of the examples in this guide are given in JSON. However, Content-Type header is mandatory for all requests which have body (namely requests with POST and PUT HTTP methods). Also for such requests client is required to provide Content-Length header containing the length of the request body in bytes. User Agent Identification It is strongly recommended that client applications provide the User-Agent HTTP header with every request, which should contain the key information about the requesting application, including application name, version, OS/platform name and version, etc. For browser-based (JavaScript) applications it is usually not possible to override the user agent string which is sent by browser. But other types of applications (desktop, mobile and server-side) can easily follow this recommendation. There are three main rules: • Client should send User-Agent value with each request • Particular application instance should send exactly the same user agent string in all API requests • The format of user agent value should follow the convention described below. We recommend using a short application name and version delimited by forward slash character and optionally followed by additional details about this client instance in parentheses (e.g. operating system name, version, revision number, etc.). CONFIDENTIAL 6 Rev.1.0.16.a.[79434afda268+] REST Overview Look at the examples below: User-Agent: RCMobile/3.6.0 (RingCentral; Android/2.6; rev.12345) User-Agent: RCMobile/3.6.1 (OfficeAtHand; iOS/6.0; rev.987654) User-Agent: Softphone/6.2.0.11632 The User-Agent string format is described in RFC-1945 [https://tools.ietf.org/html/rfc1945] and RFC-2068 [https://tools.ietf.org/html/rfc2068]. Languages Support In most cases the content returned by RingCentral API is not localized because it is assumed to be machine-readable, not human readable. So all constants, enumerated values, error codes are in US English. However there are some API methods which return localized content. In this case client application can pass the preferred language (locale) code in the Accept-Language HTTP header. If this header is omitted, incorrect or contains unsupported language code, the server returns localized content in the language which is configured in user extension's regional settings (by default, en-US for RingCentral US and Canada accounts, en-GB for RingCentral UK accounts). The server returns the language code in the Content-Language header in response. For example, if one needs to get the localized content in English (UK variant): GET /restapi/v1.0/.... HTTP/1.1 Authorization: Bearer U0pDMDFQMDFQQVMwMnxBQUFWZmY4ZXoxM Accept-Language: en-GB Accept: application/json HTTP/1.1 200 OK Content-Type: application/json Content-Language: en-GB {...} HTTP Status Codes The RingCentral API uses standard HTTP response status codes. Following the standard REST principles, the API preserves the general meaning of the HTTP codes as described in RFC-2616 [https://tools.ietf.org/ html/rfc2616]. The most frequently used codes are given in the table below. Response Status Codes HTTP Status Code Description Meaning in terms of RingCentral API 2xx Success Any successfully completed operation 200 OK Response to most of operations that return data 201 Created New resource has been created, specified by the server in the Location header field. 204 No Content Response to operations that do not return data (for example, DELETE) 207 Multi-status Response to successful batch operations (see the section called Batch Requests) CONFIDENTIAL 7 Rev.1.0.16.a.[79434afda268+] REST Overview HTTP Status Code Description Meaning in terms of RingCentral API 4xx Client Error Improper use of API 400 Bad Request The request could not be understood by the server due to malformed syntax 401 Unauthorized Request credentials are invalid, expired, or compromised/ revoked earlier 403 Forbidden Access to given resource requires additional rights and cannot be granted 404 Not Found The requested resource cannot be found 405 Method Not Allowed Endpoint does not support the requested HTTP method 406 Not Acceptable Request came with the unsupported Accept header 408 Request Timeout The server timed out waiting for the request. The client did not produce a request within the time that the server was prepared to wait. The client may repeat the request without modifications at any time later 409 Conflict Request cannot be implemented due to resource conflict. For example, it may appear when the client attempts to add a new record violating the unique constraint 413 Request Entity Too Large The request is larger than the server is willing or able to process 415 Unsupported Media Type Entity of the request is of unsupported content type 429 Too Many Requests The number of requests is exceeded. It typically means that the client is throttled by the server due to too high request rate. Specific retry period in seconds may be specified in Retry-After response header 5xx Server Error Various server errors 500 Internal Server Error Server is unable to process the request due to internal error 502 Bad Gateway Server is unable to process the request due to overload or maintenance 503 Service Unavailable Server is unable to process the request due to overload or maintenance. Specific retry period in seconds may be specified in Retry-After response header 504 Gateway Timeout Server is unable to process the request due to overload or maintenance For example: HTTP/1.1 200 OK Content-Type: application/json In the case of an error response the server can also return a text description of an error in response body, in the message field. Let's consider the example: HTTP/1.1 403 Forbidden Content-Type: application/json CONFIDENTIAL 8 Rev.1.0.16.a.[79434afda268+] REST Overview { "message" : "Attempt to access another extension." } It may also contain logical error code (see Logical Error Codes) and other attributes which simplify the understanding of the error reason. Logical Error Codes The API uses specific logical error codes to make error processing for client applications more simple and effective. The client application should use startsWith comparison mode when comparing documented error codes with actual value. In the future error code names may contain suffixes for more granularity of error codes. Authorization Errors Codes. The following logical error codes can be returned in error responses for authorization requests. Authorization logical error codes appear only along with the error 401 Unauthorized. Logical Error Code Description TokenExpired Access/refresh token passed in the request has already expired. Access token expiration can also be caused by the user's password change on the service site. TokenInvalid Session associated with access/refresh token has been invalidated either because of being compromised by inappropriate access by another application, or because of user deletion/migration/ deactivation InsufficientPermissions Application tries to access a feature which requires special API permission that it does not have. Key reasons may be the following: application does not have the permission for registration, application explicitly requested access token without such permission, or the user explicitly denied such permission at application authorization step. The additional field 'Permission' containing the missing permission may be introduced into the response AuthorizationRevoked User explicitly revoked authorization for the application Let's see the example below: HTTP/1.1 401 Unauthorized Content-Type: application/json { ... "errorCode": "InsufficientPermissions", ... } Error Codes in Regular API Calls. The following logical codes can be returned as a part of error responses in different API calls. Logical Error Code RejectedByRecipient CONFIDENTIAL Description The recipient cannot accept text/pager message and explicitly rejects it 9 HTTP Code 400 Bad Request Rev.1.0.16.a.[79434afda268+] REST Overview Logical Error Code Description HTTP Code InternationalProhibited Sending messages or calling to international 403 Forbidden numbers is not allowed for this extension/ account InsufficientFunds The account balance is insufficient for performing the action 403 Forbidden FeatureNotAvailable The account does not support the feature. Extension is forbidden to send/receive messages 403 Forbidden InvalidParameter One or more request parameters are invalid. 400 Bad Request Additional attributes parameterName and parameterValue can be provided in response InvalidContent The request body content is invalid (empty, too long, syntactically malformed, etc.) MaintenanceMode The system is under maintenance. Request 503 Service may be retried. Specific retry period in Unavailable seconds is specified in Retry-After response header OldThreadReply Text message reply is forbidden for old message threads 403 Forbidden OutOfThreadReply Text message reply is denied for this user, who is no longer a conversation thread participant 403 Forbidden 400 Bad Request, 415 Unsupported Media Type Let's see the example below: HTTP/1.1 400 Bad Request Content-Type: application/json { "message": "Parameter [to] is invalid [no phone number]", "errorCode": "InvalidParameter", "parameterName": "to", "description": "no phone number" } Batch Request Error Codes. The following logical error codes can be returned in error responses for batch (multipart, bulk) requests. Logical Error Code InvalidMultipartRequest Description Batch request is incorrect, refer to error message HTTP Code 400 Bad Request Let's see the example below: GET /restapi/v1.0/account/~/ extension/400426991001,400426927002,400426975003,400426927004,400426927005, 400426927006,400426927007,400426927008,400426927009,400426927010,400426927011, 400426927012,400426927013,400426927014,400426927015,400426927016,400426927017, 400426927018,400426927019,400426927020,400426927021,400426927022,400426927023, 400426927024,400426927025,400426927026,400426927027,400426927028,400426927029, 400426927030,400426927031/presence HTTP/1.1 Accept: application/json Authorization: Bearer U0pDMDFQMDFKV1MwMXzoIqjx7VtLOXOxQt1j8rswGMt-LA CONFIDENTIAL 10 Rev.1.0.16.a.[79434afda268+] REST Overview HTTP/1.1 400 Bad Request Content-Type: application/json { "message" : "Extension Presence Info multipart request is limited to 30 extensions", "errorCode" : "InvalidMultipartRequest" } Batch Requests One of the commonly used REST practices is the support of batch operations to retrieve multiple homogeneous resources by their key using a single request. The RingCentral API supports batch requests for a number of endpoints, for example messages, call records, blocked numbers, presence etc. They are implemented via the methods GET, DELETE and PUT with all their features. Batch operations are not transaction-atomic. Each resource in a batch is processed separately from the others, making it possible to receive different success/failure results for different resources wrapped in a multipart response object. The HTTP status code 207 Multi-status (Multi-Status [http:// restpatterns.org/HTTP_Status_Codes/207_-_Multi-Status]) is returned in every multipart response object and indicates a batch request. Note The 207 Multi-status code is not returned in response body in case of error accessing the endpoint. For example, if the requested endpoint does not exist at all, 404 Not Found status code is returned. If there is a server error, 5xx status code is returned. In batch DELETE operations (if all resources are deleted successfully) the server returns the 204 No content instead of multi-status (since all parts would be identical in this case). In case of at least one failure the server returns the 207 Multi-status. Apart from the top-level special status code in case of success, a multipart response object contains status codes in each part, representing a particular requested resource. This status specifies an individual result for each requested resource out of the batch. Let's consider the examples of batch request below. 1. Batch request via GET method: GET /restapi/v1.0/account/~/extension/~/message-store/2447722008,2416832008 HTTP/1.1 Accept: application/json HTTP/1.1 207 Multi-Status Content-Type: multipart/mixed --Boundary_20_32057915_1351669531796 Content-Type: application/json { "response" : [ { "href" : ".../account/154364008/extension/154364008/message-store/2447722008", "status" : 200, "responseDescription" : "OK" }, { "href" : "...1/restapi/v1.0/account/154364008/extension/154364008/message-store/2416832008", "status" : 200, "responseDescription" : "OK" } ] } --Boundary_20_32057915_1351669531796 Content-Type: application/json CONFIDENTIAL 11 Rev.1.0.16.a.[79434afda268+] REST Overview { "uri" : ".../restapi/v1.0/account/154364008/extension/154364008/message-store/2447722008", "id" : 2447722008, "to" : [ { "phoneNumber" : "18559100010" } ], "from" : { "phoneNumber" : "18559100010" }, "type" : "SMS", "creationTime" : "2012-10-29T15:36:04.000Z", "readStatus" : "Unread", "priority" : "Normal", "attachments" : [ { "id" : 1, "uri" : ".../restapi/v1.0/account/154364008/extension/154364008/message-store/2447722008/ content/1", "contentType" : "text/plain" } ], "direction" : "Inbound", "availability" : "Alive", "subject" : "verificationMessage", "messageStatus" : "Received", "conversationId" : 5717224681082742945, "lastModifiedTime" : "2012-10-29T15:36:04.000Z" } --Boundary_20_32057915_1351669531796 Content-Type: application/json { "uri" : ".../restapi/v1.0/account/154364008/extension/154364008/message-store/2416832008", "id" : 2416832008, "to" : [ { "phoneNumber" : "18559100010" } ], "from" : { "phoneNumber" : "16509101086" }, "type" : "SMS", "creationTime" : "2012-10-29T13:09:54.000Z", "readStatus" : "Unread", "priority" : "Normal", "attachments" : [ { "id" : 1, "uri" : ".../restapi/v1.0/account/154364008/extension/154364008/message-store/2416832008/ content/1", "contentType" : "text/plain" } ], "direction" : "Inbound", "availability" : "Alive", "subject" : "Inbound SMS", "messageStatus" : "Received", "conversationId" : 141549019326272744, "lastModifiedTime" : "2012-10-29T13:09:54.000Z" } --Boundary_20_32057915_1351669531796-- 2. Batch request via PUT method: • The client has to specify the multipart/mixed content type and the boundary; • The client has to provide in request body modified fields for every single item which needs to be updated, separated by multipart boundaries. PUT /restapi/v1.0/account/~/extension/~/message-store/401654758008,401642088008 HTTP/1.1 Accept: application/json Authorization: Bearer U0pDMDFQMDFKV1MwMXz6Z7EkpZfJjToT_z4CVUwdekt9Iw Content-Type: multipart/mixed; boundary=Boundary_1_15567762_1355833573664 --Boundary_1_15567762_1355833573664 Content-Type: application/json {"readStatus": "Read"} CONFIDENTIAL 12 Rev.1.0.16.a.[79434afda268+] REST Overview --Boundary_1_15567762_1355833573664 Content-Type: application/json {"readStatus": "Read"} --Boundary_1_15567762_1355833573664-HTTP/1.1 207 Multi-Status Content-Type: multipart/mixed; boundary=Boundary_1_15567762_1355833573664 --Boundary_1_15567762_1355833573664 Content-Type: application/json { "response" : [ { "href" : ".../account/400129284008/extension/400129284008/message-store/401654758008", "status" : 200, "responseDescription" : "OK" }, { "href" : ".../account/400129284008/extension/400129284008/message-store/401642088008", "status" : 200, "responseDescription" : "OK" } ] } --Boundary_1_15567762_1355833573664 Content-Type: application/json { "uri" : ".../account/400129284008/extension/400129284008/message-store/401654758008", "id" : 401654758008, "to" : [ { "phoneNumber" : "18559100010" } ], "type" : "Fax", "creationTime" : "2013-07-11T12:05:43.000Z", "readStatus" : "Read", "priority" : "Normal", "attachments" : [ { "id" : 1, "uri" : ".../account/400129284008/extension/400129284008/message-store/401654758008/ content/1", "contentType" : "image/tiff" } ], "direction" : "Outbound", "availability" : "Alive", "messageStatus" : "SendingFailed", "faxResolution" : "Low", "faxPageCount" : 0, "lastModifiedTime" : "2013-07-11T12:26:24.000Z" } --Boundary_1_15567762_1355833573664 Content-Type: application/json { "uri" : ".../account/400129284008/extension/400129284008/message-store/401642088008", "id" : 401642088008, "to" : [ { "phoneNumber" : "77653287256446" } ], "type" : "Fax", "creationTime" : "2013-07-11T08:45:57.000Z", "readStatus" : "Read", "priority" : "Normal", "attachments" : [ { "id" : 1, "uri" : ".../account/400129284008/extension/400129284008/message-store/401642088008/ content/1", "contentType" : "image/tiff" } ], "direction" : "Outbound", "availability" : "Alive", "messageStatus" : "SendingFailed", "faxResolution" : "Low", "faxPageCount" : 0, "lastModifiedTime" : "2013-07-11T12:26:52.000Z" } --Boundary_1_15567762_1355833573664-- CONFIDENTIAL 13 Rev.1.0.16.a.[79434afda268+] Chapter 2. API Usage Plans What is Usage Plan The Usage Plan is a scheme specifying limits of using the API resources. Applying usage plans enables consistent load allocation through correct interaction with RingCentral Connect Platform. Default Usage Plan & Organization The Organization is a company enabled to create several API based client applications. The usage plan for each Organization is specified by RingCentral Connect Platform administrator. The API usage plan for each next client application developed by the Organization is the same by default. If you need to change the usage plan you should apply to administartors and request it. Usage Plan Details Each usage plan features rates specifying how many requests to each API group are allowed. Currently four API groups are distiguished: • Light • Medium • Heavy • Auth That means all the requests are characterized by their processing as light, medium or heavy. There are also authorization requests, that form a separate group - auth. Each request in API Reference is marked as heavy, medium, light or auth under the header Usage Plan Group. Your Usage Plan details are displayed as shown in the table below. It informs you how many requests of each API group the usage plan supports and what is the time frame in seconds for every request. Rate Limits (Example) API group Request limit Heavy 10 requests/60 seconds Medium 40 requests/60 seconds Light 50 requests/60 seconds Auth 5 requests/60 seconds Let's consider the given rate limits. Within the presented usage plan your client application is allowed to send 10 heavy, 40 medium, 50 light and 5 authtorization requests per minute. If you exceed these limitations the server returns the 429 Too Many Requests HTTP error code. It means that the client is throttled by the server due to high request rate. Specific retry period in seconds, after which the requests can be sent, is specified in Retry-After response header. CONFIDENTIAL 14 Rev.1.0.16.a.[79434afda268+] Chapter 3. Authentication Your application and its users must be authorized by RingCentral in order to eliminate any possibility of abuse. The RingCentral API uses OAuth 2.0 protocol for authentication and authorization, which is widely supported by the majority of cloud API providers. For more details see OAuth 2.0 protocol specification [http://oauth.net/2/]. According to OAuth 2.0 the following is to be ensured: • The API client must be authenticated as a legitimate application registered at RingCentral. • If the application accesses some data on behalf of the RingCentral customer, the user of your application must be authenticated at RingCentral. • The application must be authorized by the user to perform the required actions (to access the messages of this user, to perform calls on his behalf, etc.) OAuth 2.0 Authorization OAuth 2.0 offers various ways (authorization flows) in which an application may be authorized to access required resources. Once an authorization flow has been successfully passed, your application is provided with the token which is required to access API resources. Basically each authorization flow includes the following roles and steps: • Application supplies its credentials and provides a way for the user (Resource Owner) to supply his/ her credentials to Authorization Server. • Resource owner (the user of your application) is authenticated as a RingCentral user and authorizes the application, provided with the access grant. • Authorization Server authenticates the users and the applications and provides tokens which regulate authorization flow and should be used further to access API resources. • Resource Server provides the Application with access to API resources (including resources that serve as entry points for authorization facilities). Currently the RingCentral API supports the mobile application flow in which application itself will obtain the user's credentials. Note In order to prevent eavesdropping and tampering, the RingCentral API requires Transport Layer Security. This means that API resources are accessible only through HTTPS connections. Tokens OAuth 2.0 protocol defines a number of tokens used to provide a context in each request for authorization or authentication. It is important to understand distinctions between token types: • Access token is a special token issued by authorization server and used by the application to make requests to all endpoints which require authentication. CONFIDENTIAL 15 Rev.1.0.16.a.[79434afda268+] Authentication • Refresh token can be provided along with access token once your application successfully passes the authorization. It can be used only once to refresh short-lived access token. The refresh token itself cannot be used to access protected resources. To prevent possible abuse by means of intercepting tokens and using them illegally, access and refresh token lifetimes are limited. For instance, by default access token is expired in one hour. Refresh token lifetime is typically limited to one week. Actual lifetimes of access and refresh tokens are returned in expires_in and refresh_token_expires_in attributes of a token endpoint response. The API requests which include expired access tokens are rejected with HTTP 401 Unauthorized response. So an application is forced to obtain a new access token using a refresh token or by passing the authorization flow once again. Both access and refresh tokens may also be revoked by the user at any time. In this case the application is required to pass the authorization flow again. If the user who authorized the OAuth session changes his/her credentials (using RingCentral Service Web, Mobile Web or Admin Interface sites), all issued tokens are invalidated immediately, and all established sessions are terminated. Two-legged Authorization Flow This is the simplest OAuth 2.0 authorization flow. It is mostly applicable for native mobile and desktop applications. Typically the user enters credentials in the form which is provided by the application itself (instead of being redirected to the RingCentral website to enter credentials through Web Browser). Such native applications are considered to be more trustworthy because users themselves install them on their devices and provide the required permissions. Furthermore, user credentials will not be stored on a thirdparty website, but on the device owned by the user. Please note that this flow is considered to be less secure and requires an additional level of trust between you and the application. Two-legged authorization flow uses Resource Owner Password Credentials OAuth grant type. Refresh Token grant type can be used to refresh a previously issued pair of tokens. Two steps are required for this flow: 1. The application by itself obtains user credentials from the user. 2. The application supplies user credentials and application credentials in a request to a token endpoint. Once the credentials are successfully verified, the application receives the access token and the refresh token in HTTP response. Once the access token has expired, your application will not be able to use it to access the RingCentral API resources. Even though token lifetime is enough to perform tasks, your application may still require additional time. In order to extend time for accessing RingCentral API resources without going through authorization flow once again, you may use the refresh token to obtain a new access token. Here is an example and complete step-by-step instructions on how to perform two-legged authorization using the RingCentral API. 1. You have to implement a way of obtaining user credentials from the users of your application. Note that you must provide adequate security measures since your application will be dealing with user credentials directly. 2. Once your application has obtained credentials from the user, it can send a specific request to token endpoint in order to receive the access token. This request must be in the application/x-wwwform-urlencoded format by passing the following parameters in the HTTP request body: CONFIDENTIAL 16 Rev.1.0.16.a.[79434afda268+] Authentication • grant_type Required. Must be set to password. • username Required. Login of RingCentral user (phone number in E.164 format with or without leading "+" sign). • extension Optional. Extension number to log in. This parameter can be omitted when logging in as system extension providing company phone number as the login name, or when providing an extension direct number as the login name. • password Required. Password of the RingCentral user. Each application that tries to perform requests to token endpoint must be authenticated. To authenticate the application we use an application key and an application secret issued during application registration. They are passed to the token endpoint as username and password using the HTTP Basic authentication scheme. For example you have obtained application key YourAppKey and application secret YourAppSecret. Combine them in a string with a colon YourAppKey:YourAppSecret and encode with Base64; thus you will get the following authorization token WW91ckFwcEtleTpZb3VyQXBwU2VjcmV0. POST /restapi/oauth/token HTTP/1.1 Host: platform.ringcentral.com Authorization: Basic WW91ckFwcEtleTpZb3VyQXBwU2VjcmV0 Content-Type: application/x-www-form-urlencoded;charset=UTF-8 grant_type=password&username=18887776655&extension=102&password=987654321 Example values are: • platform.ringcentral.com - name of the RingCentral API server • WW91ckFwcEtleTpZb3VyQXBwU2VjcmV0 - Base64 encoded HTTP Basic string generated from application credentials (application key and secret) • 18887776655 - RingCentral customer login (phone number) • 102 - particular extension number • 987654321 - password to log in as the extension 102 of the account 18887776655 If authentication has been passed successfully, you will get a response similar to the following: HTTP/1.1 200 OK Content-Type: application/json;charset=UTF-8 Cache-Control: no-store Pragma: no-cache { "access_token": "2YotnFZFEjr1zCsicMWpAA", "expires_in": 3600, "refresh_token": "tGzv3JOkF0XG5Qx2TlKWIA", "refresh_token_expires_in": 604800 CONFIDENTIAL 17 Rev.1.0.16.a.[79434afda268+] Authentication } Token response contains the following information: • 2YotnFZFEjr1zCsicMWpAA - access token to use for making API calls; • 3600 - access token lifetime in seconds; • tGzv3JOkF0XG5Qx2TlKWIA - refresh token which can be used to obtain a new access token. 3. Now your application should use the issued access token to perform the required actions. Each request must pass the access token using one of the following ways: • access_token query parameter with the issued access token specified as a value: GET /restapi/v1.0/account/1110475004/extension/1110475004/address-book/ contact/29874662828?access_token=2YotnFZFEjr1zCsicMWpAA Host: platform.ringcentral.com Accept: application/json Connection: keep-alive • Bearer authentication scheme followed by access token in the Authorization header. For example, to get a specific address-book entry, you need to perform the following request: GET /restapi/v1.0/account/1110475004/extension/1110475004/address-book/ contact/29874662828 Authorization: Bearer 2YotnFZFEjr1zCsicMWpAA Host: platform.ringcentral.com Accept: application/json Connection: keep-alive 4. Once the access token lifetime has expired, your application will no longer be able to use it to access RingCentral API resources. To prevent eavesdropping, token lifetime is limited by default. If your application is required to perform tasks longer than the token lifetime you may need to extend time for accessing RingCentral API resources. This can be done easily via token refreshment without going through the authorization flow once again. This request must be done using the application/x-www-form-urlencoded format by passing the following parameters in the HTTP request entity-body: • grant_type Required. Must be set to refresh_token. • refresh_token Required. Refresh token issued previously. Here is the sample of refresh token request: POST /restapi/oauth/token HTTP/1.1 Host: platform.ringcentral.com Authorization: Basic WW91ckFwcEtleTpZb3VyQXBwU2VjcmV0 Content-Type: application/x-www-form-urlencoded;charset=UTF-8 grant_type=refresh_token&refresh_token=tGzv3JOkF0XG5Qx2TlKWIA Where CONFIDENTIAL 18 Rev.1.0.16.a.[79434afda268+] Authentication • WW91ckFwcEtleTpZb3VyQXBwU2VjcmV0 - HTTP Basic string, Base64 encoded and generated from client credentials: the application key and secret ("userid" and "password" in terms of RFC-2617 [https://tools.ietf.org/html/rfc2617]) - AppKey:AppSecret. • tGzv3JOkF0XG5Qx2TlKWIA - refresh token, issued previously, together with the now expired access token. On success, the server responds with the new access token and refresh token which you may use for accessing resources and for refreshing the access token, respectively, for example: HTTP/1.1 200 OK Content-Type: application/json;charset=UTF-8 Cache-Control: no-store Pragma: no-cache { "access_token": "Ejr1zCsicM2YosdfFZFWpAA", "expires_in": 3600, "refresh_token": "ZJOkF0X2TlKWIAG5Gzv3Qx", "refresh_token_expires_in": 604800 } Where • Ejr1zCsicM2YosdfFZFWpAA - new (refreshed) access token to be used for making RingCentral API calls. • 3600 - token lifetime. • ZJOkF0X2TlKWIAG5Gzv3Qx - new refresh token to receive new access token after this one expires. Token Revocation There are some situations when the user may want to revoke the already granted access in order to stop application activity. To revoke access/refresh token the following request is used: POST/restapi/oauth/revoke HTTP/1.1 Content-Type: application/x-www-form-urlencoded Authorization: Basic WW91ckFwcEtleTpZb3VyQXBwU2VjcmV0 token=U0pDMDFQMDFKV1MwMXwJ_W7L1fG4eGXBW9Pp-otywzriCw HTTP/1.1 200 OK The request must contain HTTP Basic authorization string Base64 encoded and generated from client credentials: the application key ("userid" in terms of RFC-2617 [https://tools.ietf.org/html/rfc2617]) and application secret ("password" in terms of RFC-2617 [https://tools.ietf.org/html/rfc2617]). The request should contain the token form (preferred) or query parameter, which holds the value of an access or refresh token. The server returns HTTP 204 No Content when the request has been successfully processed. Please note that due to security reasons (to prevent eavesdropping) successful response is returned even if revocation was not successful (for instance if a token passed was issued to another application, expired, or by other means malformed. For additional details see RFC-7009: OAuth 2.0 Token Revocation [https:// tools.ietf.org/html/rfc7009]. CONFIDENTIAL 19 Rev.1.0.16.a.[79434afda268+] Authentication Application Permissions In order to work with particular RingCentral API resources the application should have the corresponding permissions. Required API permissions are generally declared at the stage of application registration and confirmed by the user on authentication stage. The following permissions are available: Permission Description Access Type Included Permissions EditMessages Viewing and updating user messages Read and Update ReadMessages Faxes Sending and receiving faxes Special operation ReadMessages InternalMessages Sending and receiving intra-company text messages Special operation ReadMessages ReadAccounts Viewing user account info (including name, Read Only business name, address and phone number/ account number) ReadCallLog Viewing user call logs Read Only ReadMessages Viewing user messages Read Only ReadPresence Getting user presence information Read Only RingOut Performing two-legged ring-out phone calls Special operation SMS Sending and receiving (SMS) text messages Special operation CONFIDENTIAL 20 ReadMessages Rev.1.0.16.a.[79434afda268+] Chapter 4. Exploring Account and Extension Settings The RingCentral service allows its customers to create and register an account that is usually associated with the customer's company. After registering the account with the company main number the user can create extensions of different types and functionality. The extensions can further be assigned with the phone numbers and phone devices. The account and its extensions can be configured in accordance with the user demands. Processing account and extensions requires certain permissions, different for each functionality. The permissions are listed so that each next includes the previous: 1. Retrieving account and extension data requires the "ReadAccounts" permission. 2. Modifying extension settings requires the "EditExtensions" permission. 3. Modifying account (including creating, modifying and deletion of extensions) requires the "EditAccounts" permission. 4. Creating new accounts requires the "Accounts" permission. This chapter provides general information on account/extension and describes the way to retrieve it. The description of other functionality is given in detail in further chapters (corresponding to the permissions list). A typical consumer application authenticates using credentials supplied by the RingCentral user to get access to the user's data. The application needs to know various details about the user account to function properly. Through the API the following account settings can be read: • Basic customer account information (main phone number, service plan, available features, etc.) • The list of extensions and each extension details • The list of assigned phone numbers (per extension or globally per account) Common access control rules are based on user credentials and are enforced in API as follows: • access is allowed only to the information related to the authenticated account; • any user may access public information about the account and all information about their own extension; • users with administrator rights may access all information about account and all of its extensions. Account and Extension Information Retrieving Account Data RingCentral API allows to retrieve information about a particular account. To retrieve the information about a particular account use the following request: CONFIDENTIAL 21 Rev.1.0.16.a.[79434afda268+] Exploring Account and Extension Settings GET /restapi/v1.0/account/{accountId} You may provide either explicit accountId or use simplified syntax with tilde (~). The examples of request and response are provided below. GET /restapi/v1.0/account/~ HTTP/1.1 Accept: application/json HTTP/1.1 200 OK Content-Type: application/json { "uri" : "https.../restapi/v1.0/account/401145624008", "id" : 401145624008, "serviceInfo" : { "uri" : "https.../restapi/v1.0/account/401145624008/service-info", "brand" : { "id" : "1210", "name" : "MyCompany Inc.", "homeCountry" : { "id" : "1", "uri" : "https.../restapi/v1.0/dictionary/country/1" } }, "servicePlan" : { "id" : "1216", "name" : "Professional" }, "billingPlan" : { "id" : "159", "name" : "Monthly - 14.99 - Pro 101503", "durationUnit" : "Month", "duration" : 1, "type" : "Regular" } }, "operator" : { "uri" : "https.../restapi/v1.0/account/401145624008/extension/401145624008", "id" : 401145624008, "extensionNumber" : "101" }, "mainNumber" : "18555440014", "status" : "Confirmed" } Retrieving Extension Data The RingCentral API allows retrieval of information on extensions that belong to a particular account. All types of extensions are supported, namely: • User ('User', 'Fax User','VirtualUser', 'DigitalUser') extension • Department extension • TakeMessageOnly (or Voicemail) extension • AnnouncementOnly extension • SharedLinesGroup extension • PagingOnlyGroup extension • IvrMenu extension • ApplicationExtension extension CONFIDENTIAL 22 Rev.1.0.16.a.[79434afda268+] Exploring Account and Extension Settings Extension types supported for a particular account depend on the service plan the account is subscribed to. RingCentral accounts differ depending on a service plan (tier) that they are subscribed to. Currently all the service plans are divided into UBP (User Based Pricing) and non-UBP. Major RingCentral nonUBP service plans are: Fax, Professional and Office. The following extension types are supported for the accounts subscribed to these service plans: User, Department, Take Messages Only (Voicemail) and Announcement Only. Unlike non-UBP service plans, UBP assumes support for distinctive and chargeable user extension types: FaxUser (Fax Only), VirtualUser (Fax/Calling) and DigitalUser (Fax/ Calling/Deskphones). The regular ‘User’ extension type is no longer supported for UBP service plans. In UBP service plans, non-chargeable Department, Take Message and Announcement Only extensions are still supported. As in the case of account ID, it is possible to use tilde (~) to refer to the currently logged-in extension instead of specifying its numeric ID. Here is an example of the API call. Please note that the response contains navigation links and standard collection metadata on paging. GET /restapi/v1.0/account/159048008/extension HTTP/1.1 Accept: application/json HTTP/1.1 200 OK Content-Type: application/json { "uri": ".../account/159048008/extension?page=1&perPage=100" "records": [ { "uri": ".../account/159048008/extension/159048008", "id": 159048008, "extensionNumber": "101", "name": "John Smith", "type": "User" "contact" : { "firstName" : "John" "lastName" : "Smith" "company" : "MyCompany Inc." "email" : "[email protected]" } "status": "Enabled" }, { "uri": ".../account/159048008/extension/1201056008", "id": 1201056008, "extensionNumber": "110", "name": "AO Ext", "type": "Announcement" "contact" : { "company" : "MyCompany" "email" : "[email protected]" "businessAddress" : { "country" : "USA" "city" : "Washington" } } ], "paging": { "page": 1, "totalPages": 1, "perPage": 100, "totalElements": 2, "pageStart": 0, "pageEnd": 1 }, "navigation": { "firstPage": {"uri": ".../account/159048008/extension?page=1}, "lastPage": {"uri": ".../account/159048008/extension?page=1} } } It is also possible to get the data about a particular extension. As well as in case of an account ID, you can use tilde (~) to refer to a currently logged-in extension instead of specifying its numeric ID, as follows: CONFIDENTIAL 23 Rev.1.0.16.a.[79434afda268+] Exploring Account and Extension Settings GET /restapi/v1.0/account/~/extension/~ Please refer to Extension Service Feature Info [68] for more details. Note Every RingCentral account has a special system extension. The user of this extension has full administrative rights for the given account. Due to internal reasons, the ID of a system extension is always the same as the ID of account itself. Please refer to Account and Extension Information in the API Reference section for a complete specification of these API endpoints. CONFIDENTIAL 24 Rev.1.0.16.a.[79434afda268+] Chapter 5. Accessing Call Log Every inbound and outbound call connected through the RingCentral service is logged in the database. Every extension on RingCentral account has an assigned Call Log that stores all inbound and outbound calls for the extension. Users are able to access all of their calls to get reliable information on callers' names, phone numbers, etc. The RingCentral API enables the developer's application to access account (for all account extensions) and extension (personal) call logs and perform the following: • Retrieve a filtered list of call log records for an extension or the whole account; • Retrieve an individual call log record; Each call log entry returned by the API contains a number of properties describing the call. Most of them are self-descriptive such as direction, startTime or duration. There are two important fields: action and result which have to be specially described. These values provide the detailed information on the call and may hold many different internally defined constant values (result depends on action). In the table below you can find the values which are returned in common cases. Call Log Access Rules Access to extension call-log is available for any user; access to account call-log is available for Admin user only. Account call log can be retrieved and deleted by Admin user via the following endpoints: GET/restapi/v1.0/account/{accountId}/call-log DELETE/restapi/v1.0/account/{accountId}/call-log If a user (without admin rights) tries to access the account call log, the 403 Forbidden error is returned. Extension call log can be got and deleted by any user (including Admin user) via the following endpoints: GET/restapi/v1.0/account/{accountId}/extension/{extensionId}/call-log DELETE/restapi/v1.0/account/{accountId}/extension/{extensionId}/call-log Commonly Used Call Actions and Results Call Actions Action Name Unknown Phone Call Phone Login Incoming Fax Accept Call CONFIDENTIAL 25 Rev.1.0.16.a.[79434afda268+] Accessing Call Log Action Name FindMe FollowMe Outgoing Fax Call Return Calling Card Ring Directly RingOut Web VoIP Call RingOut PC RingMe Transfer 411 Info Emergency E911 Update Support RingOut Mobile Call Results Result Name Unknown ResultInProgress Missed Call accepted Voicemail Rejected Reply Received Receive Error Fax on Demand Partial Receive Blocked Call #onnected No Answer International Disabled Busy Send Error Sent No fax machine CONFIDENTIAL 26 Rev.1.0.16.a.[79434afda268+] Accessing Call Log Result Name ResultEmpty Account Suspended Call Failed Call Failure Internal Error IP Phone offline Restricted Number Wrong Number Stopped Hang up Poor Line Quality Partially Sent International Disabled International Restriction Abandoned Declined Fax Receipt Error Fax Send Error CONFIDENTIAL 27 Rev.1.0.16.a.[79434afda268+] Chapter 6. Working with Messages A wide range of telecommunication tools are used by business today: cell phones, desk phones, laptops, PDAs, fax machines, voice mailboxes, etc. the RingCentral service functions as a unified messaging system and provides customers with a seamless interface to interact with various communication media. Using the API you can create applications enabled to work with all kinds of messages available to the RingCentral customers: • SMS — text messages sent via standard SMS communication technology; • Fax — facsimile messages sent via fax-rendering system; • Pager — text messages sent from one extension to another within a single RingCentral account; • Voicemail — audio messages recorded by the caller when the called party is temporary unavailable. Every RingCentral extension has an assigned mailbox that is used to store all the incoming and outgoing messages for this extension. You can access all messages available for a certain extension via the unified message store endpoint. In addition, for convenience there are endpoints available for specific types of messages: SMS, Faxes and Pager messages. Unified message-store endpoint allows: • retrieving a list of messages filtered by a specific criteria from an extension mailbox; • retrieving content and metadata of a message; • changing the status of a message (read/unread); • removing a message from an extension mailbox. Dedicated fax, sms and company-pager endpoints allow working with messages of the particular type including creating and sending new messages out. Message Attributes The message metadata retrieved through the API contains various information. Some metadata properties are returned for each message, others depend on message type and direction. One of the most important fields is status which can hold the following values: • Received — standard status for all inbound messages. • Queued — status for outbound fax and SMS messages, meaning the message was queued for sending. • Sent — status for all outbound messages, meaning the message was sent successfully. • SendingFailed — status for outbound fax and SMS messages, meaning the sending attempt has failed. • Delivered — status for outbound SMS messages, meaning the SMS was successfully delivered to the recipient's handset (not supported by the US mobile carriers). • DeliveryFailed — status for outbound SMS messages, meaning the SMS was not delivered to the recipient's handset by some reason (not supported by the US mobile carriers). Each message also has a readStatus property which may store Read or Unread value. This status indicates whether the user has already viewed or played a particular message. The convention is CONFIDENTIAL 28 Rev.1.0.16.a.[79434afda268+] Working with Messages that whenever the application supplies the message content to the user, it should update readStatus accordingly. Apart from common message attributes which can be returned for a message of any type, there are some specific properties which make sense only for particular types of messages. By convention such fields contain special prefixes in their names. • fax — appears only in Fax messages; example: faxResolution • vm — appears only in Voicemail messages; example: vmDuration • sms — appears only in SMS messages; example: smsDeliveryTime • pg — appears only in Pager messages; example: pgToDepartment See the API Reference section for the full list of supported message attributes. Let's consider the example request below. GET Message Info request allows retrieving the Message Info [86] object. In the example below the message type is SMS. The other message types: Fax, Pager, Voicemail and Text are retrieved via the same request with the corresponding type value. GET /restapi/v1.0/account/~/extension/~/message-store/320272588010 HTTP/1.1 Accept: application/json HTTP/1.1 200 OK Content-Type: application/json { "uri": ".../account/1346632010/extension/1346632010/message-store/320272588010", "id": 320272588010, "to": [{"phoneNumber": "18551003732"}], "from": {"phoneNumber": "18559100010"}, "type": "SMS", "creationTime": "2012-10-18T10:40:31.000Z", "readStatus": "Unread", "priority": "Normal", "attachments": [ { "id": 1, "uri": ".../account/1346632010/extension/1346632010/message-store/320272588010/content/1", "contentType": "text/plain" }], "direction": "Outbound", "availability": "Alive", "subject": "Test SMS message from Platform server", "messageStatus": "Delivered", "smsDeliveryTime": "2012-10-18T10:40:42.000Z", "conversationId": 4178398077955743750, "lastModifiedTime": "2012-10-18T10:40:42.000Z" } Message Availability and Life Cycle Every outbound or inbound message is created in the system in alive state. This state is tracked using the availability property, which is returned as a part of message metadata, and contains the Alive value by default. Once the message is deleted by the user, its availability is changed to Deleted, but it still remains in the extension mailbox and can be restored by the user. After being Deleted for a certain time (by default, 5 days) the system erases message data (attachments) and automatically switches its availability to Purged. Purged messages cannot be restored but their CONFIDENTIAL 29 Rev.1.0.16.a.[79434afda268+] Working with Messages metadata is stored in the system for some time (by default, 5 days). After that all information about such messages is physically removed from the system. There is a separate constraint defining the maximum number of messages which can be stored in a mailbox. If this threshold is exceeded the system will delete some old messages automatically. The user is able to filter out the messages by their availability. By default, unless a specific availability value is passed in the query, all message retrieval endpoints hide the deleted or purged messages. SMS and Pager Messages There are two types of short text messages supported by RingCentral: SMS and Pager. SMS messages can be received by the extension types: User and Take Messages Only (Voicemail). Pager messages can be received by the extension types: User, Take Messages Only (Voicemail) and Department. SMS/pager message length limitation is 160 symbols. SMS messages can be sent out to or received from the handsets operated by most mobile carriers (all major US carriers are currently supported). Each SMS is a peer-to-peer message from one phone number to another. There is a special sms API endpoint to create and send SMS messages. See example below. POST /restapi/v1.0/account/~/extension/~/sms HTTP/1.1 Content-Type: application/json Content-Length: ACTUAL_CONTENT_LENGTH_HERE { "to": [{"phoneNumber": "14151003732"}], "from": {"phoneNumber": "16509100010"}, "text": "Test SMS message" } HTTP/1.1 200 OK Content-Type: application/json { "uri": ".../account/1346632010/extension/1346632010/message-store/320270670010", "id": 320270670010, "to": [{"phoneNumber": "14151003732"}], "from": {"phoneNumber": "16509100010"}, "type": "SMS", "creationTime": "2012-10-16T06:34:58.000Z", "readStatus": "Unread", "priority": "Normal", "attachments": [ { "id": 1, "uri": ".../account/1346632010/extension/1346632010/message-store/320270670010/content/1", "contentType": "text/plain" }], "direction": "Outbound", "availability": "Alive", "subject": "Test SMS message", "messageStatus": "Sent", "conversationId": 4178398077955743750, "lastModifiedTime": "2012-10-16T06:34:59.000Z" } Pager messages are RingCentral specific types of text messages which can be sent between extensions of one account. Unlike SMS, pager messages can be sent to multiple recipients, so the API allows several extension numbers in the to field. Another difference from SMS is that the pager message that is sent to the department extension is automatically forwarded to all department members. This allows setting up CONFIDENTIAL 30 Rev.1.0.16.a.[79434afda268+] Working with Messages dedicated mailing lists within the organization. The endpoint company-pager is designed to handle pager messages. The example below demonstrates sending new pager messages via the API. POST /restapi/v1.0/account/~/extension/~/company-pager HTTP/1.1 Content-Type: application/json Content-Length: ACTUAL_CONTENT_LENGTH_HERE { "to": [{"extensionNumber": "102"}, {"extensionNumber": "103"}], "from": {"extensionNumber": "101"}, "text": "Hello!" } HTTP/1.1 200 OK Content-Type: application/json { "uri": ".../account/1346632010/extension/1346632010/message-store/320272670010", "id": 320272670010, "to": [ {"extensionNumber": "101"}, {"extensionNumber": "102"}, {"extensionNumber": "103"} ], "from": {"extensionNumber": "101"}, "type": "Pager", "creationTime": "2012-10-18T13:18:24.000Z", "readStatus": "Unread", "priority": "Normal", "attachments": [ { "id": 1, "uri": "http:.../restapi/v1.0/account/1346632010/extension/1346632010/messagestore/320272670010/content/1", "contentType": "text/plain" }], "direction": "Outbound", "availability": "Alive", "subject": "Hello!", "messageStatus": "Sent", "conversationId": 320272670010, "lastModifiedTime": "2012-10-18T13:18:24.000Z", "pgToDepartment": false } Sending SMS messages on behalf of Department extensions is allowed. To send an SMS message from the Department direct phone number, the user should be logged in as the department manager (with department credentials). When requesting a phone number list for a Department extension type, SmsSender flag set for department numbers is returned. Sending pager messages on behalf of a Department is not allowed; in the case of such an attempt, the department manager is notified that sending pages is not allowed for the Department extension type. Sending pager/SMS messages to Disabled and Frozen extension types is not allowed. When an SMS message is sent to a Disabled/Frozen extension, it is dropped. The dropped message is saved only in the sender's outbox. When the page is sent to a Disabled/Frozen extension or to the list of extensions containing at least one Disabled/Frozen extension, the server immediately responds with the 400 Bad Request error code and the explanatory message. But if the page is sent to a Department extension list containing any Disabled/Frozen extensions, the error is not returned, and this pager message is received only by active extensions of the Department. Pager Messaging Threads The API supports pager messaging threads for the User extensions, including Department extensions. Those internal message conversations are not accessible for reading or writing by users which were CONFIDENTIAL 31 Rev.1.0.16.a.[79434afda268+] Working with Messages removed from the explicit or implicit list of recipients in this conversation. For example, a user extension included in a Department extension is able to participate in the Department conversation, sending and receiving messages. Once this particular user is removed from the department, he/she is not able to reply to previous messages, nor send or receive new messages. It means that, when somebody posts a reply to a particular conversation (by indicating replyOn in API requests), the server checks if the user belongs to the actual list of recipients (implicitly, through Department membership, or explicitly). If the user does not belong to the recipient list, the server returns the 403 Forbidden error code with the appropriate logical code. Fax Messages RingCentral supports working with fax messages. Fax messages can be sent by User extensions only and can be received by all extension types. Phonenumber types that are available to send and receive Faxes are Fax Only, Voice And Fax. The system allows sending a fax immediately or scheduled for a specific time; and tracking the status of an outgoing message (Sent). The Fax API allows creating, sending and retrieving fax messages. The Fax general description in JSON format and the fax contents (attachments) are retrieved separately, by different requests. Send Fax The API allows sending a fax message with a multipart request, incorporating two or more parts. The first part of the request is a general fax message description in json format, including the following parameters: • to [phone number, name, location] Required. Fax message recipients, their names, numbers and locations • sendTime Optional. Schedule time, which is set if the fax is to be sent at a specific time • faxResolution Resolution of the fax message • coverIndex Optional. Cover page index. • coverPageText Optional. Text entered by the fax sender and printed on fax cover page. The value is limited to 1024 symbols The second and subsequent parts of the request are binary attachments in the formats JPEG, TIFF, DOCX, etc. Every attachment is provided according to MIME multipart (RFC-1341 [https://tools.ietf.org/html/ rfc1341]) standard. Fax attachments are rendered into a single document. A fax message can be sent to several recipients that are listed in the to field. As a response to a sent fax request the server returns fax message representation, including id and uri. Fax Attachment Limitations The size of all the attachments in total should not exceed 20 MB. The size of any single attachment is also limited to 20 Mb. The total number of pages (including cover page) is limited to 200. CONFIDENTIAL 32 Rev.1.0.16.a.[79434afda268+] Working with Messages Note If coverPageText is specified without coverIndex, the cover page is sent using the default template. If neither coverIndex, nor coverPageText and attachment are specified, the cover page is sent empty, in the default template. To send a fax request with attachments, it is necessary to specify Content-Type header either "application/ octet-stream", or any supported explicit MIME type (Fax Attachments. MIME Types ). If Content-Type is set to application/octet-stream it is necessary to specify the file name in the Content-Disposition header. If the file name does not exist or is empty in Content-Disposition header, the server returns the 400 Bad Request error with the logical error code InvalidParameter ("No content disposition"). If the Content-Type of a fax attachment is set to any supported explicit MIME type, then ContentDisposition is optional. If Content-Disposition header is specified, the file name is taken from it. If Content-Disposition header is absent, a file name is auto-generated, and a file extension is derived from the Content-Type header. Please consider the examples below, describing different methods of sending fax requests. 1. Request: Passing attachments in a fax by specifying the Content-Type of fax attachments as a MIME type (see Fax Attachments. MIME Types for details) POST /restapi/v1.0/account/~/extension/~/fax HTTP/1.1 Content-Type: multipart/mixed; boundary=Boundary_1_14413901_1361871080888 Content-Length: ACTUAL_CONTENT_LENGTH_HERE --Boundary_1_14413901_1361871080888 Content-Type: application/json {"to":[{"phoneNumber":"18005630003"}], "faxResolution":"High", "sendTime":"2013-02-26T09:31:20.882Z"} --Boundary_1_14413901_1361871080888 Content-Type: text/plain Hello, World! --Boundary_1_14413901_1361871080888-- 2. Request: Passing attachments in a fax by specifying the Content-Type of fax attachments as a MIME type (see Fax Attachments. MIME Types for details) and a filename in the Content-Disposition header. CONFIDENTIAL 33 Rev.1.0.16.a.[79434afda268+] Working with Messages POST /restapi/v1.0/account/~/extension/~/fax HTTP/1.1 Content-Type: multipart/mixed; boundary=Boundary_1_14413901_1361871080888 Content-Length: ACTUAL_CONTENT_LENGTH_HERE --Boundary_1_14413901_1361871080888 Content-Type: application/json {"to":[{"phoneNumber":"18005630003"}], "faxResolution":"High", "sendTime":"2013-02-26T09:31:20.882Z"} --Boundary_1_14413901_1361871080888 Content-Type: text/plain Content-Disposition: attachment; filename="fax.txt" Hello, World! --Boundary_1_14413901_1361871080888-- 3. Request: Passing attachments in a fax by specifying the Content-Type "application/octet-stream" and a filename in the Content-Disposition header. POST /restapi/v1.0/account/~/extension/~/fax HTTP/1.1 Content-Type: multipart/mixed; boundary=Boundary_1_14413901_1361871080888 Content-Length: ACTUAL_CONTENT_LENGTH_HERE --Boundary_1_14413901_1361871080888 Content-Type: application/json {"to":[{"phoneNumber":"18005630003"}], "faxResolution":"High", "sendTime":"2013-02-26T09:31:20.882Z"} --Boundary_1_14413901_1361871080888 Content-Type: application/octet-stream Content-Disposition: attachment; filename="fax.txt" Hello, World! --Boundary_1_14413901_1361871080888-- Response: HTTP/1.1 200 OK Content-Type: application/json { "uri": ".../account/284818008/extension/284822008/message-store/3291497008", "id": 3291497008, "to": [{"phoneNumber": "18005630003"}], "type": "Fax", "creationTime": "2013-02-26T08:35:04.000Z", "readStatus": "Unread", "priority": "Normal", "attachments": [ { "id": 1, "uri": ".../account/284818008/extension/284822008/message-store/3291497008/content/1", "contentType": "image/tiff" }], "direction": "Outbound", "availability": "Alive", "messageStatus": "Queued", "faxResolution": "High", "faxPageCount": 0, "lastModifiedTime": "2013-02-26T08:35:04.000Z" } CONFIDENTIAL 34 Rev.1.0.16.a.[79434afda268+] Working with Messages Get Fax Message The fax API allows to retrieve a fax message, general information. As a result of get fax request the server returns the general fax message description in JSON format. The fax content (attachments) is not returned in that case but the main attachment parameters id, uri and contentType are returned. If a fax message is not found by its ID, the server returns 404 Not Found error. Let's consider the example below: GET /restapi/v1.0/account/~/extension/~/fax/7269038008 HTTP/1.1 Accept: application/json HTTP/1.1 200 OK Content-Type: application/json { "uri": ".../account/130253008/extension/130253008/message-store/7269038008", "id": 7269038008, "to": [{"phoneNumber": "18559100010"}], "type": "Fax", "creationTime": "2013-01-29T06:22:09.000Z", "readStatus": "Unread", "priority": "Normal", "attachments": [{ "id": 1, "uri": ".../account/130253008/extension/130253008/message-store/7269038008/ content/1", "contentType": "image/tiff" }] } Get Fax Content The fax API also allows getting the fax content. Outbound fax content is always retrieved in TIFF format. Inbound fax content is always retrieved in TIFF or PDF formats. If fax message is not found by ID, the server returns 404 Not Found error. Let's consider the example below: GET /restapi/v1.0/account/~/extension/~/fax/7269038008/content/1 HTTP/1.1 HTTP/1.1 200 OK Content-Type: image/tiff <...binary...> Fax Attachments. MIME Types The API supports all the MIME Types listed in the table below: File Extension MIME Type Application Type pdf application/pdf Adobe Acrobat / Adobe Reader psd image/vnd.adobe.photoshop Adobe Photoshop doc application/msword Microsoft Word docm application/vnd.ms-word.document.macroenabled.12 Microsoft Word docx application/vnd.openxmlformatsofficedocument.wordprocessingml.document Microsoft Word xls application/vnd.ms-excel Microsoft Excel CONFIDENTIAL 35 Rev.1.0.16.a.[79434afda268+] Working with Messages File Extension MIME Type Application Type xlsb application/vnd.msexcel.sheet.binary.macroenabled.12 Microsoft Excel xlsm application/vnd.ms-excel.sheet.macroenabled.12 Microsoft Excel xlsx application/vnd.openxmlformatsofficedocument.spreadsheetml.sheet Microsoft Excel ppt application/vnd.ms-powerpoint Microsoft PowerPoint pptm application/vnd.mspowerpoint.presentation.macroenabled.12 Microsoft PowerPoint pptx application/vnd.openxmlformatsofficedocument.presentationml.presentation Microsoft PowerPoint vsd application/vnd.visio Microsoft Visio pub application/x-mspublisher Microsoft Publisher wps application/vnd.ms-works Microsoft Works wri application/x-mswrite Microsoft Windows Write tiff image/tiff Generic Graphic Formats gif image/gif Generic Graphic Formats jpeg image/jpeg Generic Graphic Formats bmp image/bmp Generic Graphic Formats png image/png Generic Graphic Formats pcx image/x-pcx Generic Graphic Formats tga image/x-tga Generic Graphic Formats wpd application/vnd.wordperfect Word Perfect Graphics rtf application/rtf Rich Text Format txt text/plain Text Files xml application/xml Extensible Markup Language html text/html Hypertext Markup Language csv text/csv Comma Separated Values Fax Error Codes. The following logical error codes can be returned in error responses for fax requests. CONFIDENTIAL 36 Rev.1.0.16.a.[79434afda268+] Working with Messages Logical Error Code InvalidParameter Description HTTP Code 1. No recipients are indicated in the request 400 Bad Request 2. Recipient phone number is empty 3. The coverIndex parameter is invalid: greater than zero (0) and not within the list of values available for cover pages (0-16) InvalidContent 1. The size of all the fax message attachments 400 Bad Request (TotalMessageSize) exceeds the limitation (20Mb by default) 2. Any single attachment size exceeds the limitation (20 Mb by default) FeatureNotAvailable 1. Fax feature is not supported for the account 403 Forbidden 2. Extension is not allowed to send/receive fax messages CONFIDENTIAL 37 Rev.1.0.16.a.[79434afda268+] Chapter 7. RingOut The RingOut option enables the users to make a call from any other outside number (not RingCentral number) by means of the RingCentral account, when it is not convenient for them to use the RingCentral number. This feature is available for softphone, web service and mobile applications. The user specifies a certain number under the forwarding number list, starts RingOut and enters the required called number. RingCentral makes a call to the specified forwarding number and connects the user with the called number. The API treats a two-legged RingOut call as a resource that can be created, retrieved, or deleted via the POST, GET and DELETE methods correspondingly. Note RingOut API cannot be called on behalf of Department/Announcement Only/Take Messages Only (Voicemail)/FaxUser (Fax only) extension types; the server responds with the 403 Forbidden error code in this case. Two-Legged RingOut Call 1. The two-legged RingOut call can be created via the following request: POST /restapi/v1.0/account/~/extension/~/ringout Content-Type: application/json Authorization: Bearer <access-token> { "from": {"phoneNumber": "13443334444"}, /* from parameter is optional if there is a default number in user's forwarding numbers */ "to": {"phoneNumber": "13453443434"}, /* to parameter is required */ "callerId": {"phoneNumber": "13443334444"}, /* optional field*/ "playPrompt": true /* optional field */ } Where: • from Refers to the number of the calling party. Required field only if there is no default number in the user's forwarding number list. The phoneNumber attribute should comply with the E.164 standard. As a result of validation of the phoneNumber attribute the server may return the error code: 400 Bad Request phoneNumber specified in the field is empty or invalid. • to Refers to the called party number. Required field. If this field is missing from the request, the 400 Bad Request error is returned. The phoneNumber attribute should comply with the E.164 standard. As a result of validation of the phoneNumber attribute the server may return the error code: 400 Bad Request - phoneNumber specified in the field is empty or invalid. • callerId The number which is displayed to the called party. Optional field. If the field is specified and invalid the 403 Forbidden error code is returned. If the field is not specified in the request then it is based CONFIDENTIAL 38 Rev.1.0.16.a.[79434afda268+] RingOut on the CallerId parameter specified in RingCentral application (Main phone Number/Current Location Number/Blocked). Caller ID Validation Rules: • callerId is the same as the user's extension number; • Get all phone numbers associated with the mailbox. Phone is the default and callerId is the same as this number; • Get a list of all forwarded phone numbers for the user. callerId is the same as one of the local or toll-free numbers. • playPrompt The audio prompt that the calling party hears when the call is connected. Optional field. It corresponds to the setting in the RingCentral application "Prompt me to dial 1 before connecting" (When selected, the system will ask you to press "1" on your phone's key pad before connecting to the destination number). The response can be as follows: 200 OK Content-Type: application/json { "id": 234343434, "uri": "/restapi/v1.0/account/~/extension/~/ringout/234343434", "status": { "callStatus": "Success", "callerStatus": "Success", "calleeStatus": "Success" } } Where: • callStatus can take the following values: 'Invalid' | 'Success' | 'InProgress' | 'CannotReach' | 'Error' | 'NoAnsweringMachine' | 'NoSessionFound' • callerStatus, calleeStatus can take the following values: 'Invalid' | 'Success' | 'InProgress' | 'Busy' | 'GenericError' | 'NoAnswer' | 'Rejected' | 'Finished' | 'InternationalDisabled' | 'DestinationBlocked' | 'NotEnoughFunds' | 'NoSuchUser'. In case the callerStatus or calleeStatus is set to InternationalDisabled or NotEnoughFunds, the 403 Forbidden error is returned in response. 2. The API allows getting the status of a two-legged RingOut call using the URI returned on its creation: GET/restapi/v1.0/account/~/extension/~/ringout/234343434 The response will be as follows: 200 OK Content-Type: application/json { "id": 234343434, "uri": "/restapi/v1.0/account/~/extension/~/ringout/234343434", "status": { "callStatus": "Success", "callerStatus": "Success", CONFIDENTIAL 39 Rev.1.0.16.a.[79434afda268+] RingOut "calleeStatus": "Success" } } 3. Delete the existing two-legged RingOut call is available by the following request: DELETE /restapi/v1.0/account/~/extension/~/ringout/234343434 204 No Content CONFIDENTIAL 40 Rev.1.0.16.a.[79434afda268+] Chapter 8. Notifications and Subscriptions There are two strategies of client-service interaction providing data renewal: poll and push. Polling implies that the client periodically queries the server in order to get the updated data. Pushing implies that the server immediately sends notifications to the client on any data update. RingCentral API supports both types of data renewal. However in case of rarely changing data push notifications are evidently more effective, as they reduce client-server traffic, server load and improve user experience by notifying client applications on-the-fly with a minimal delay about important events. For example, for getting new messages the client application can periodically poll the server in order to get updates via incremental synchronization. However push notifications delivered immediately when the new messages appear are much more convenient. To start receiving push notifications the client application should subscribe for the required events; in this case, for the new messages. The RingCentral API supports receiving push notifications for its clients of any type, including but not limited to mobile applications (smartphones and tablets running Android/iOS), desktop applications (for example, softphone for Windows/Mac), server-side applications hosted in a cloud, HTML5 applications, etc. The typical subscription flow is performed as follows: • A client application subscribes to the required events through the RingCentral API. In response the server provides all necessary information for the application to connect to the transport facilities that deliver the notifications: channel address; if required - credentials to access the channel, and notification payload encryption keys. • The server starts to push events to the dedicated channel after the subscription is created. The delivery mechanism PubNub queues a certain amount of notifications, awaiting a client to get them. • The client can unsubscribe explicitly at any time through the API. In this case the server immediately stops sending push notifications for this client. • Each subscription has an expiration time and needs to be renewed explicitly by the client through the API call. If subscription is expired, the server silently stops sending push notifications for this client. The server may change any information it has to provide to client upon subscription renewal. Any changes are provided in the renewal response. Subscription Flow To use RingCentral Push Notifications the client application can create a notifications subscription that can further be retrieved, changed or deleted by the client via the API requests. Let's consider the subscription flow step-by-step: 1. Authorization 2. Subscription creation 3. Notifications handling 4. Subscription renewal 5. Event Filters Modification CONFIDENTIAL 41 Rev.1.0.16.a.[79434afda268+] Notifications and Subscriptions 6. Unsubscribing Authorization When a client creates a subscription it must be authenticated and authorized to use the RingCentral API. It includes, at least, application authentication. Certain event filter requires the client to be authorized to access specific extension data, so the client needs to pass a valid access token in the request. For more details please refer to the Authentication section. Subscription Creation To create a subscription the client application should send the following request: POST /restapi/v1.0/subscription HTTP/1.1 In request body the client should specify event filters and delivery mode. By setting event filters the client specifies the notifications it wants to receive. The event filter is exposed as a URL, pointing to the RingCentral API resource which represents the data for which a notification is sent. Currently the following event types are available: messages and presence (Event Types). The delivery mode specifies the certain mechanism used to deliver event notification from the RingCentral service to the client application. Delivery mechanism can be selected by specifying deliveryMode.transportType attribute; currently only one transport channel is supported: the PubNub cloud service (http://www.pubnub.com), which utilizes HTTP(s) long polling, web socket, and APNS transports for delivering push notifications (for more details see PubNub). In response the server provides the client with: • identity of the subscription created, and its creation and expiration time; the exact event filters used for the subscription (in case it substituted the default value for some event attribute); • delivery mode, including: • transport type; • address - channel name to subscribe to; • subscriber key and secret key - subscriber credentials required to subscribe to the channel; • encryption information. Some event types provide sensitive data in the notification payload, which should be protected from unauthorized access. Whenever such an event type is requested in eventFilters, encryption is forced on the notifications channel, resulting in all notifications (including those that do not contain sensitive data) to be encrypted. To indicate the encryption mode for a new or renewed subscription, the server specifies the following attributes under deliveryMode: encryptionAlgorithm — name of the specific encryption mechanism, "None" by default. Available encryption mechanisms: encryptionKey — key to be used by the client to decode the notification payload. Encryption can also be forced by specifying deliveryType.encryption = true in subscription creation request. Consider the following subscription creation request: POST .../restapi/v1.0/subscription { CONFIDENTIAL 42 Rev.1.0.16.a.[79434afda268+] Notifications and Subscriptions "eventFilters": [ "/restapi/v1.0/account/~/extension/401550809004/presence?detailedTelephonyState=true" ], "deliveryMode": { "transportType": "PubNub" } } In response to this request the client application will get all the required information to subscribe to a certain PubNub channel (see PubNub section below to get more information about PubNub subscribing) and receive push notifications for the selected event (extension presence in this case): HTTP/1.1 200 OK { "eventFilters" : [ "/restapi/v1.0/account/~/extension/401550809004/presence? detailedTelephonyState=true" ], "id" : "78c53776-6aa5-4089-b080-150089c097bf", "deliveryMode" : { "transportType" : "PubNub", "encryption" : true, "address" : "96830102602705_0d0115d5", "subscriberKey" : "sub-c-b8b9cd8c-e906-11e2-b383-02ee2ddab7fe", "secretKey" : "sec-c-ZDNlYjY0OWMtMWFmOC00OTg2LWJjMTMtYjBkMzgzOWRmMzUz", "encryptionAlgorithm" : "AES", "encryptionKey" : "fNP0fszFJdc/thDO90/B3A==" }, "expirationTime" : "2013-09-13T13:58:57.187Z", "status" : "Active", "creationTime" : "2013-09-13T13:43:57.187Z", "uri" : "/restapi/v1.0/subscription/78c53776-6aa5-4089-b080-150089c097bf" } Notifications Handling Push notifications will be delivered to the client application via the delivery mechanism specified in subscription. Each notification has the same common structure, which can be easily described with a simple example: { "uuid":"ed1cf00c-0420-4bf5-a0ae-e659bb9f77e0", "event": "/restapi/v1.0/account/~/extension/823476228762/message-store", "timestamp": "2013-06-14T12:00:00.000Z", "body": { /* depends on event type, may even be omitted, if event does not need a payload. */ } } According to received notification the client application should either update local data or notify user about data changes (for example, new messages received). Subscription Renewal Created subscription should be renewed according to its expiration time by special request, otherwise it would not be sent to the client application after subscription expiration. After renewal any parameter of subscription may be changed, so it should be updated on a client side as well. To renew the subscription use the following request: PUT /restapi/v1.0/subscription/{subscriptionId} {} CONFIDENTIAL 43 Rev.1.0.16.a.[79434afda268+] Notifications and Subscriptions Note It is recommended to renew a subscription around 1-2 minutes before it is expired. The client should be aware that there may be strict throttling settings on subscriptions operations. Event Filters Modification In order to subscribe to any other events the client application can create additional subscriptions, but it is preferable to update the already existing subscription with the new event filters. To make this subscription modification the following request should be used: PUT /restapi/v1.0/subscription/{subscriptionId} { "eventFilters": [ "/restapi/v1.0/account/~/extension/12345/presence", "/restapi/v1.0/account/~/extension/98765/presence", "/restapi/v1.0/account/~/extension/~/message-store" ] } Unsubscribing If the application does not need to receive push notifications anymore due to some reason, it should unsubscribe from notifications through special API call. The existing subscription can be deleted as follows: DELETE /restapi/v1.0/subscription/78c53776-6aa5-4089-b080-150089c097bf HTTP/1.1 Accept: application/json Authorization: Bearer U0pDMDFQMDFKV1MwMnxXEhpuK23FJtRSi_rafOgPSMOorQ The response will be the following: HTTP/1.1 204 No Content Notifications Transport The system requires a certain transportation mechanism to deliver event notifications from the RingCentral service to the client application. Currently the API uses the PubNub cloud service as a transportation channel. PubNub The delivery mode uses external service provider PubNub. This provider uses WebSocket, HTTP longpolling, or Apple Push Notifications transports to deliver notifications. It is specifically well suited for web, standalone and mobile applications, and provides an extensive set of client libraries for all of these platforms. To use this mechanism the client should specify PubNub as a value of deliveryMode.transportType attribute. In response the server provides the following information to be used to connect to PubNub channel: CONFIDENTIAL 44 Rev.1.0.16.a.[79434afda268+] Notifications and Subscriptions • address — PubNub channel name to subscribe to; • subscriberKey and optional secretKey — PubNub subscriber credentials required to subscribe to the channel. The client uses this information to properly configure the PubNub client library and subscribe to the channel. PubNub provides SDKs for many popular operating systems and frameworks: iOS, Android, Ruby, JavaScript, Java, Objective C, .Net etc. You can find full list of SDKs on the page http://www.pubnub.com/ developers/. PubNub HTTP REST API can be also used as well. For example, to subscribe for push notifications with channel (address) and credentials (subscriberKey) provided by RingCentral API as it described above, you can use the following HTTP request: GET http://pubsub.pubnub.com/subscribe/{subscriberKey}/{address}/{callback}/{timetoken} You can find full PubNub REST API description on this page http://www.pubnub.com/http-rest-push-api/. CONFIDENTIAL 45 Rev.1.0.16.a.[79434afda268+] Chapter 9. Dictionary: Getting Static Data The RingCentral API allows to retrieve data on all the countries available for calling. It is implemented in order to provide the API clients with the access to the taxonomy of all countries, states, locations (cities) and timezones. This information changes very rarely. The client application is free to cache the data for a long period of time. Dictionary API exposes the following data: 1. List of countries that are available for this client, and the service information about each of them can be retrieved by the following request: GET /restapi/v1.0/dictionary/country The server will return the list of countries sorted by official name of the country in ascending order. The list also contains 2-letter codes of the countries according to the ISO 3166 [http://en.wikipedia.org/wiki/ ISO_3166]. You may limit the list returned in the response by setting the perPage and page parameters. Let's consider the example below: GET /restapi/v1.0/dictionary/country?page=8&perPage=2 HTTP/1.1 Accept: application/json Authorization: Bearer UExBMDFUMDRQV1MwMXxLLQ6JlTXrScjYNTqqwQ56h7o8wA HTTP/1.1 200 OK Content-Type: application/json { "uri" : "https.../restapi/v1.0/dictionary/country?page=8&perPage=2", "records" : [ { "uri" : "https.../restapi/v1.0/dictionary/country/15", "id" : "15", "name" : "Australia", "isoCode" : "AU", "callingCode" : "61" }, { "uri" : "https.../restapi/v1.0/dictionary/country/16", "id" : "16", "name" : "Austria", "isoCode" : "AT", "callingCode" : "43" } ], "paging" : { "page" : 8, "totalPages" : 124, "perPage" : 2, "totalElements" : 247, "pageStart" : 14, "pageEnd" : 15 }, "navigation" : { "nextPage" : { "uri" : "https.../restapi/v1.0/dictionary/country?page=9&perPage=2" }, "previousPage" : { "uri" : "https.../restapi/v1.0/dictionary/country?page=7&perPage=2" }, "firstPage" : { "uri" : "https.../restapi/v1.0/dictionary/country?page=1&perPage=2" }, "lastPage" : { "uri" : "https.../restapi/v1.0/dictionary/country?page=124&perPage=2" } } CONFIDENTIAL 46 Rev.1.0.16.a.[79434afda268+] Dictionary: Getting Static Data } The API also allows retrieving data on a particular country, by specifying its Id in the request body as follows: GET /restapi/v1.0/dictionary/country/{countryId} 2. List of states of a particular country, the internal identifier of which should be specified in the request: GET /restapi/v1.0/dictionary/state The server will return the list of states for the specified country, also containing the 2-letter codes of these states. You may limit the list returned in the response by setting the perPage and page parameters. Let's consider the example: GET /restapi/v1.0/dictionary/state?countryId=39&perPage=2 HTTP/1.1 Accept: application/json Authorization: Bearer UExBMDFUMDRQV1MwMXwpFKvx9Iz1xWLuiVfUxwkPp66yOQ HTTP/1.1 200 OK Content-Type: application/json { "uri" : "https.../restapi/v1.0/dictionary/state?countryId=39&page=1&perPage=2", "records" : [ { "uri" : "https.../restapi/v1.0/dictionary/state/501", "id" : "501", "name" : "Alberta", "isoCode" : "AB", "country" : { "uri" : "https.../restapi/v1.0/dictionary/country/39" } }, { "uri" : "https.../restapi/v1.0/dictionary/state/505", "id" : "505", "name" : "British Columbia", "isoCode" : "BC", "country" : { "uri" : "https.../restapi/v1.0/dictionary/country/39" } } ], "paging" : { "page" : 1, "totalPages" : 7, "perPage" : 2, "totalElements" : 13, "pageStart" : 0, "pageEnd" : 1 }, "navigation" : { "nextPage" : { "uri" : "https.../restapi/v1.0/dictionary/state?countryId=39&page=2&perPage=2" }, "firstPage" : { "uri" : "https.../restapi/v1.0/dictionary/state?countryId=39&page=1&perPage=2" }, "lastPage" : { "uri" : "https.../restapi/v1.0/dictionary/state?countryId=39&page=7&perPage=2" } } } The API also allows retrieving data on a particular state, by specifying its Id in the request body as follows: GET /restapi/v1.0/dictionary/state/{stateId} CONFIDENTIAL 47 Rev.1.0.16.a.[79434afda268+] Dictionary: Getting Static Data 3. List of locations (cities) with the area/central office phone codes for a particular state, which ID should be specified as query parameter for the following request: GET /restapi/v1.0/dictionary/location The server will return the list of locations (that means cities, or some other location entities) for the state specified. The list will also contain all NPA and NXX phone codes for all the cities of this state (refer to North American Numbering Plan [http://en.wikipedia.org/wiki/North_American_Numbering_Plan] for details on phone codes). All the locations are sorted depending on the query parameter, by default it is set to the city name. You may sort the list either by the location name or by the area phone code. You may also limit the list returned in the response by setting the perPage and page parameters. Let's consider the example: GET /restapi/v1.0/dictionary/location?stateId=501&page=1&orderBy=NPA&perPage=3 HTTP/1.1 Accept: application/json Authorization: Bearer UExBMDFUMDRQV1MwMXwpFKvx9Iz1xWLuiVfUxwkPp66yOQ HTTP/1.1 200 OK Content-Type: application/json { "uri" : "https.../restapi/v1.0/dictionary/location? stateId=501&orderBy=NPA&page=1&perPage=3", "records" : [ { "city" : "Calgary", "npa" : "403", "nxx" : "null", "state" : { "uri" : "https.../restapi/v1.0/dictionary/state/501" } }, { "city" : "Calgary", "npa" : "403", "nxx" : "800", "state" : { "uri" : "https.../restapi/v1.0/dictionary/state/501" } }, { "city" : "Calgary", "npa" : "403", "nxx" : "775", "state" : { "uri" : "https.../restapi/v1.0/dictionary/state/501" } } ], "paging" : { "page" : 1, "totalPages" : 4, "perPage" : 3, "totalElements" : 10, "pageStart" : 0, "pageEnd" : 2 }, "navigation" : { "nextPage" : { "uri" : "https.../restapi/v1.0/dictionary/location? stateId=501&orderBy=NPA&page=2&perPage=3" }, "firstPage" : { "uri" : "https.../restapi/v1.0/dictionary/location? stateId=501&orderBy=NPA&page=1&perPage=3" }, "lastPage" : { "uri" : "https.../restapi/v1.0/dictionary/location? stateId=501&orderBy=NPA&page=4&perPage=3" } } } CONFIDENTIAL 48 Rev.1.0.16.a.[79434afda268+] Dictionary: Getting Static Data 4. List of timezones can be retrieved by the following request: GET /restapi/v1.0/dictionary/timezone The server will return all available timezones - their names and brief descriptions. Besides you may limit the response by setting the perPage and page parameters, as in the example: GET /restapi/v1.0/dictionary/timezone?perPage=1 HTTP/1.1 Accept: application/json Authorization: Bearer UExBMDFUMDRQV1MwMXzK9iQu0XSysn38K_JF7p4cImVcNw HTTP/1.1 200 OK Content-Type: application/json { "uri" : "https.../restapi/v1.0/dictionary/timezone?page=1&perPage=1", "records" : [ { "uri" : "https.../restapi/v1.0/dictionary/timezone/1", "id" : "1", "name" : "GMT", "description" : "Casablanca, Monrovia, Reykjavik" } ], "paging" : { "page" : 1, "totalPages" : 90, "perPage" : 1, "totalElements" : 90, "pageStart" : 0, "pageEnd" : 0 }, "navigation" : { "nextPage" : { "uri" : "https:.../restapi/v1.0/dictionary/timezone?page=2&perPage=1" }, "firstPage" : { "uri" : "https.../restapi/v1.0/dictionary/timezone?page=1&perPage=1" }, "lastPage" : { "uri" : "https.../restapi/v1.0/dictionary/timezone?page=90&perPage=1" } } } The API also allows retrieving data on a particular timezone, by specifying its ID in the request body as follows: GET /restapi/v1.0/dictionary/timezone/{timezoneId} Note If any ID specified by user in the request is invalid (does not exist; is not available; is incorrect for this particular request) the server will return the error message "Object not found". CONFIDENTIAL 49 Rev.1.0.16.a.[79434afda268+] Part II. API Reference This part of the Developer's Guide gives information on the API endpoints with a detailed description of all of the parameters and examples. CONFIDENTIAL 50 Rev.1.0.16.a.[79434afda268+] Chapter 10. Common Data Types and Structures There are some common primitive and complex data types which are used in different API methods. This chapter contains information about such structures which will be cross-referenced from other sections. Data Types The table below describes the data types which are used in the RingCentral API. Data Type Description string General string value enumeration Predefined string constants/List of predefined string constants integer 64-bit integer value datetime Timestamp in XML Schema-compatible format, in accordance with ISO 8601, see its profile at Date and Time Formats [http://www.w3.org/TR/NOTEdatetime] . Note that "T" appears literally in the string, to indicate the beginning of the time element. The supported formats with the examples are as follows: Year: YYYY (eg 2012) Year and month: YYYY-MM (eg 2012-07) Complete date: YYYY-MM-DD (eg 2012-07-16) Complete date plus hours and minutes: YYYY-MM-DDThh:mmTZD (eg 2012-07-16T23:12:30) Complete date plus hours, minutes and seconds: YYYY-MM-DDThh:mm:ssTZD (eg 2012-07-16T23:12:30Z or 2012-07-16T23:12:30+04:00) Complete date plus hours, minutes, seconds and a decimal fraction of a second: YYYY-MM-DDThh:mm:ss.sTZD (eg 2012-07-16T23:12:30.45Z) where: YYYY MM DD hh mm ss s second TZD = = = = = = = four-digit year two-digit month (01=January, etc.) two-digit day of month (01 through 31) two digits of hour (00 through 23) (am/pm NOT allowed) two digits of minute (00 through 59) two digits of second (00 through 59) one or more digits representing a decimal fraction of a = time zone designator (Z or +hh:mm or -hh:mm) The server currently processes all timestamps in UTC time zone; for example, 2012-01-01T00:15:34Z. By default the server returns datetime format in full format, including a decimal fraction of a second YYYY-MM-DDThh:mm:ss.sTZD, for example 2012-07-16T23:12:30.45Z). CONFIDENTIAL 51 Rev.1.0.16.a.[79434afda268+] Common Data Types and Structures Data Type Description Please note, that when comparing timestamps, the timestamp is truncated to a second precision. For example, the response to request where the dateFrom value is 2012-07-16T23:12:30.45Z is always identical to the one with the dateFrom value 2012-07-16T23:12:30Z. Resource Identification Properties The table below describes properties which are supported by almost all API resources and used for identification purposes. Parameter Type Description id integer / string Internal unique identifier of a resource. This property exists in all resources which support retrieval/ update/delete of a single record of particular type. Depending on a resource it can hold either an integer or a string value. The resource id is also passed as a path parameter in the URI uri URI string Canonical URI of a resource. This URI might not be the same as the one which was used to retrieve this resource information. For example, if a resource was accessed by the URI containing simplified syntax with the tilde (~) characters, the canonical URI will also contain real identifiers. In most cases the URI contains an id value embedded as a path parameter The similar convention is used when one resource refers to another. For example, a direct phone number returned by the API contains a link to the extension it is assigned to in the following property: "extension": { "id": 234244008, "uri": ".../account/405884008/extension/234244008" } Common Collection Properties The table below describes properties which are supported by all collection resources. Parameter Type Description paging.page integer The current page number. 1-indexed, so the first page is 1 by default. May be omitted if result is empty (because non-existent page was specified or perPage=0 was requested) paging.perPage integer Current page size, describes how many items are in each page. Default value is 100. Maximum value is 1000. If perPage value in the request is greater than 1000, the maximum value (1000) is applied paging.pageStart integer The zero-based number of the first element on the current page. Omitted if the page is omitted or result is empty CONFIDENTIAL 52 Rev.1.0.16.a.[79434afda268+] Common Data Types and Structures Parameter Type Description paging.pageEnd integer The zero-based index of the last element on the current page. Omitted if the page is omitted or result is empty paging.totalPages integer The total number of pages in a dataset. May be omitted for some resources due to performance reasons paging.totalElements integer The total number of elements in a dataset. May be omitted for some resource due to performance reasons navigation.firstPage URI string The canonical URI for the first page of the list navigation.nextPage URI string The canonical URI for the next page of the list navigation.previousPage URI string The canonical URI for the previous page of the list navigation.lastPage URI string The canonical URI for the last page of the list Generic Path Parameters Most of the API resources require specifying the following path parameters. Parameter Type Description accountId integer Internal identifier of a RingCentral account or tilde (~) to indicate the account which was logged-in within the current session extensionId integer Internal identifier of an extension or tilde (~) to indicate the extension assigned to the account logged-in within the current session partnerId string For Partner Applications Internal identifier of an account or extension created by partner. RingCentral supports the mapping of accounts and stores the corresponding accountId/extensionId for each partnerId of a client application. In request URIs partnerIds are accepted instead of regular RingCentral native IDs as path parameters using pid = XXX clause. Though in response URIs contain the corresponding accountIds and extensionIds. In all request and response bodies these values are reflected via "partnerId" attributes of account and extension Common Query Parameters in Collection Resources All collection resources which support paging allow using the following standard query parameters. Parameter Type Description page integer Optional. Indicates the page number to retrieve. Only positive number values are allowed. Default value is '1'. perPage integer Optional. Indicates the page size (number of items). If not specified, the value is '100' by default. If perPage value is: • perPage > 0 - particular page is returned, if it is possible to return the subset of results according to given parameters CONFIDENTIAL 53 Rev.1.0.16.a.[79434afda268+] Common Data Types and Structures Parameter Type Description - no records are returned (collection paging metadata is returned, page is omitted, default perPage is returned) • perPage = 0 - such requests are used to get default navigation metadata - no records are returned - collection paging metadata is returned as for request without paging parameters (default values), page value is omitted • perPage = max (special string value) - perPage is set to maximum value (that may vary for different resources). The server behavior is as if perPage is set explicitly to the maximum possible value. In returned paging metadata perPage is explicitly set, but URIs are built with perPage=max • if other values are set, then the server returns 400 Bad Request error Caller Info All API resources which deal with messages and call logs use the Caller Info data structure to represent parties which are involved in communication. The table below describes properties which can be returned as a part of the Caller Info. Please note that not all properties listed are guaranteed to be returned: it depends on a particular use case. Parameter Type Description phoneNumber string Phone number of a party. Usually it is a plain number including country and area code like 18661234567. But sometimes it could be returned from database with some formatting applied, for example (866)123-4567. This property is filled in all cases where parties communicate by means of global phone numbers, for example when calling to direct numbers or sending/receiving SMS extensionNumber string Extension short number (usually 3 or 4 digits). This property is filled when parties communicate by means of short internal numbers, for example when calling to other extension or sending/receiving Company Pager message location string Contains party location (city, state) if one can be determined from phoneNumber. This property is filled only when phoneNumber is not empty and server can calculate location information from it (for example, this information is unavailable for US toll-free numbers) CONFIDENTIAL 54 Rev.1.0.16.a.[79434afda268+] Common Data Types and Structures Parameter Type string name Description Symbolic name associated with a party. If the phone does not belong to the known extension, only the location is returned, the name is not determined then Standard Error Response In case of unsuccessful request the API returns an error. Standard error response generally contains these two parameters: errorCode and message. Also, there are some parameters that are returned for certain HTTP error status codes. For example, the eventId parameter is returned in error response body in case of 500 Internal Server Error HTTP status code. This parameter has been introduced in order to simplify detection of error reasons by logging. All the parameters that may occur in the error response body are given in the table below. Response Body Parameter Type Description message string Human-readable text describing the error reason errorCode string High level logical error code parameterName string For 400 Bad Request only Name of incorrect parameter parameterValue string For 400 Bad Request only Specified parameter value description string For 400 Bad Request only Description of an error eventId string For 500 Internal server Error only Internal identifier of an error Example Response example HTTP/1.1 403 Forbidden Content-Type: application/json { "message": "Specified recipient [78083672] isn't a US phone number", "errorCode": "InternationalProhibited" } CONFIDENTIAL 55 Rev.1.0.16.a.[79434afda268+] Chapter 11. Authentication The RingCentral API supports OAuth 2.0 authentication flows as described in RFC-6749: The OAuth 2.0 Authorization Framework [https://tools.ietf.org/html/rfc6749], RFC-6750: The OAuth 2.0 Authorization Framework: Bearer Token Usage [https://tools.ietf.org/html/rfc6750] and RFC-7009: OAuth 2.0 Token Revocation [https://tools.ietf.org/html/rfc7009]. Get Token Resource Owner Password Credentials Flow Since 1.0.4 (Release 5.13) Issues new access and refresh tokens. Requests to this endpoint must be authenticated with HTTP Basic scheme using the application key and application secret as login and password, correspondingly. Method/URI POST /restapi/oauth/token The following request parameters are passed when using Resource Owner Credentials flow. Usage Plan Group Auth Request Body Content Type: application/x-www-form-urlencoded Parameter Type Description grant_type string Must hold password value for Resource Owner Credentials flow access_token_ttl integer Optional. Access token lifetime in seconds; the possible values are from 600 sec (10 min) to 3600 sec (1 hour). The default value is 3600 sec. If the value specified exceeds the default one, the default value is set. If the value specified is less than 600 seconds, the minimum value (600 sec) is set refresh_token_ttl integer Optional. Refresh token lifetime in seconds. The default value depends on the client application, but as usual it equals to 7 days. If the value specified exceeds the default one, the default value is applied. username string Phone number linked to account or extension in account in E.164 format with or without leading "+" sign extension string Optional. Extension short number. If company number is specified as a username, and extension is not specified, the server will attempt to authenticate client as main company administrator CONFIDENTIAL 56 Rev.1.0.16.a.[79434afda268+] Authentication Parameter Type Description password string User's password scope string Optional. List of API permissions to be used with access token (see Application Permissions). Can be omitted when requesting all permissions defined during the application registration phase endpoint_id string Optional. Unique identifier of a client application generated by the client and valid during the application lifetime Response Body Content Type: application/json, application/xml Token Info Parameter Type Description access_token string Access token to pass to subsequent API requests expires_in integer Issued access token TTL (time to live), in seconds refresh_token string Refresh token to get a new access token, when the issued one expires refresh_token_expires_in integer Issued refresh token TTL (time to live), in seconds scope string List of permissions allowed with this access token, white-space separated token_type string Type of token. Use this parameter in Authorization header of requests owner_id string Extension identifier endpoint_id string Optional. Unique identifier of a client application generated by the client and valid during the application lifetime Example 1 Request example POST /restapi/oauth/token HTTP/1.1 Accept: application/json Content-Type: application/x-www-form-urlencoded Authorization: Basic cmVsLWFsbC1wZXJtaXNzaWXFjMmpRZmlQcnlkSUkweE92QQ== grant_type=password&username=18559100010&extension=101&password=121212 Response example HTTP/1.1 200 OK Content-Type: application/json { "access_token" : "U1BCMDFUMDRKV1MwMXxzLFSvXdw5PHMsVLEn_MrtcyxUsw", "token_type" : "bearer", CONFIDENTIAL 57 Rev.1.0.16.a.[79434afda268+] Authentication "expires_in" : 7199, "refresh_token" : "U1BCMDFUMDRKV1MwMXxzLFL4ec6A0XMsUv9wLriecyxS_w", "refresh_token_expires_in" : 604799, "scope" : "AccountInfo CallLog ExtensionInfo Messages SMS", "owner_id" : "256440016" } Example 2 If the application brand ID does not match the account brand ID, then the OAU-101 error is returned with the following message: "Parameter [brandId] is invalid" and HTTP status code 403 Forbidden. Request example POST /restapi/oauth/token HTTP/1.1 Content-Type: application/x-www-form-urlencoded Authorization: Basic WW91hguitkcEtleTpZb3VyQXBwU2VjcmV0 Accept: application/json access_token_ttl=7200&grant_type=client_credentials&brand_id=654321 Response example { "error": "invalid_client", "error_description": "Access to account denied" "errors" : [ { "errorCode" : "OAU-101", "message" : "Parameter [brandId] is invalid", "parameters": [ { "parameterName" : "brandId", "parameterValue" : "123456" //account brand ID } ] } ] } Refresh Token Flow Since 1.0.4 (Release 5.13) Issues new access and refresh tokens by previously issued refresh token. Requests to this endpoint must be authenticated with HTTP Basic scheme using the application key and application secret as login and password, correspondingly. Request Body Content Type: application/x-www-form-urlencoded Parameter refresh_token Type string Description Previously issued refresh token Response Body Token Info [57] Example Request example CONFIDENTIAL 58 Rev.1.0.16.a.[79434afda268+] Authentication POST /restapi/oauth/token HTTP/1.1 Accept: application/json Content-Type: application/x-www-form-urlencoded Authorization: Basic cmVsLWFsbC1wZXJtaXNzaWXFjMmpRZmlQcnlkSUkweE92QQ== refresh_token=BCMDFUMDRKV1MwMXx5d5dwzLFL4ec6U1A0XMsUv935527jghj48 Response example HTTP/1.1 200 OK Content-Type: application/json { "access_token" : "U1BCMDFUMDRKV1MwMXxzLFSvXdw5PHMsVLEn_MrtcyxUsw", "token_type" : "bearer", "expires_in" : 7199, "refresh_token" : "U1BCMDFUMDRKV1MwMXxzLFL4ec6A0XMsUv9wLriecyxS_w", "refresh_token_expires_in" : 6048799, "scope" : "AccountInfo CallLog ExtensionInfo Messages SMS" } Revoke Token Since 1.0.5 (Release 5.14) Revokes access/refresh token. Requests to this endpoint must be authenticated with HTTP Basic scheme using the application key and application secret as login and password, correspondingly. Request Body Content Type: application/x-www-form-urlencoded Parameter token Type string Description Active access or refresh token to be revoked Response Body None Example Request example POST /restapi/oauth/revoke HTTP/1.1 Content-Type: application/x-www-form-urlencoded Authorization: Basic M2ZmYjNlMThkZDU4ZDE1YTk2NTIwYmFmNzUzZjBiNzk6MzI5OWQ0NTg5NGU1Njg5ODllOTY1ZTFiMTk5MGU2OTI token=U0pDMDFQMDFKV1MwMXwJ_W7L1fG4eGXBW9Pp-otywzriCw Response example HTTP/1.1 200 OK CONFIDENTIAL 59 Rev.1.0.16.a.[79434afda268+] Chapter 12. API Versioning Get API Versions Since 1.0.0 Returns current API version(s) and server info. Method/URI GET /restapi Usage Plan Group Light Request Body None Response Body Parameter Type Description uri string Standard resource property canonical URI, see the section called “Resource Identification Properties” apiVersions Collection of [VersionInfo [60]] Full API version information: uri, number, release date serverVersion string Server version serverRevision string Server revision Version Info Parameter Type Description uri string Standard resource property canonical URI, see the section called “Resource Identification Properties” versionString string Version of the RingCentral REST API releaseDate string Release date of this version uriString string URI part determining the current version Example Request example GET /restapi/ HTTP/1.1 Accept: application/json Authorization: Bearer U0pDMDFQMDFQQVMwMXxBQUFWZmY4ZXoxMlhvSmlGdjlQc1 Response example CONFIDENTIAL 60 Rev.1.0.16.a.[79434afda268+] API Versioning HTTP/1.1 200 OK Date: Mon, 13 Oct 2014 13:24:10 GMT RoutingKey: SJC01P01PAS01 Content-Type: application/json Content-Language: en Content-Length: 312 { "uri" : "https.../restapi/", "apiVersions" : [ { "uri" : "https.../restapi/v1.0", "versionString" : "1.0.14", "releaseDate" : "2014-10-31T00:00:00.000Z", "uriString" : "v1.0" } ], "serverVersion" : "7.0.0.551", "serverRevision" : "598ed4edcc56" } Get Version Info Since 1.0.0 Returns current API version info by apiVersion. Method/URI GET /restapi/apiVersion Usage Plan Group Light Path Parameters Parameter apiVersion Type Description string API version to be requested, for example "v1.0" Request Body None Response Body VersionInfo [60] Example Request example GET /restapi/v1.0 HTTP/1.1 Accept: application/json Authorization: Bearer U0pDMDFQMDFQQVMwMXxBQUFWZmY4ZXoxMlhvSmlGdjlQc1f Response example CONFIDENTIAL 61 Rev.1.0.16.a.[79434afda268+] API Versioning HTTP/1.1 200 OK Date: Mon, 13 Oct 2014 13:57:02 GMT RoutingKey: SJC01P01PAS01 Content-Type: application/json Content-Language: en Content-Length: 156 { "uri" : "https.../restapi/v1.0", "versionString" : "1.0.14", "releaseDate" : "2014-10-31T00:00:00.000Z", "uriString" : "v1.0" } CONFIDENTIAL 62 Rev.1.0.16.a.[79434afda268+] Chapter 13. Account and Extension Information Get Account Info Since 1.0.0 Returns basic information about a particular RingCentral customer account. Method/URI GET /restapi/v1.0/account/{accountId} Usage Plan Group Light Path Parameters Parameter accountId Type Description integer See the section called “Generic Path Parameters” Request Body None Response Body Account Info Parameter Type Description Standard resource properties ID and canonical URI, see the section called “Resource Identification Properties” id, uri serviceInfo Service Info [64] Account service information, including brand, service plan and billing plan mainNumber string Main phone number of the current account operator Extension Info [66] Operator's extension information. This extension will receive all calls and messages intended for the operator status 'Confirmed' | 'Disabled' Account status setupWizardState 'NotStarted' | 'Incomplete' | 'Completed' Specifies account configuration wizard state (web service setup). The default value is 'NotStarted' CONFIDENTIAL 63 Rev.1.0.16.a.[79434afda268+] Account and Extension Information Parameter Type Description statusInfo Collection of parameters Status information (reason, comment, lifetime). Returned for 'Disabled' status only reason 'SuspendedVoluntarily' | 'SuspendedInvoluntarily' | 'CancelledVoluntarily' | 'CancelledInvoluntarily' Type of suspension comment string A free-form user comment, describing the status change reason till datetime Date until which the account will get deleted. The default value is 30 days since current time partnerId string Additional account identifier, developed and applied by the client Service Info Parameter Type Description brand id string Internal identifier of a brand name string Brand name, for example "RingCentral UK", "ClearFax" id string Internal identifier of a home country uri string Home country URI id string Internal identifier of a service plan name string Service plan name id string Internal identifier of a billing plan name string Billing plan name durationUnit 'Month' | 'Day' Duration period duration string Number of duration units type 'Initial' | 'Regular' | 'Suspended' Billing plan type | 'Trial' | 'TrialNoCC' | 'Free' homeCountry servicePlan billingPlan Example Request example GET /restapi/v1.0/account/401145624008 HTTP/1.1 Authorization: Bearer UExBMDFUMDRQV1MwMXzq47-tLtp8ltajk78BuDxCDNYh_Q Accept: application/json Response example CONFIDENTIAL 64 Rev.1.0.16.a.[79434afda268+] Account and Extension Information HTTP/1.1 200 OK Content-Type: application/json { "uri" : "https.../restapi/v1.0/account/401145624008", "id" : 401145624008, "serviceInfo" : { "uri" : "https.../restapi/v1.0/account/401145624008/service-info", "brand" : { "id" : "1210", "name" : "MyCompany Inc.", "homeCountry" : { "id" : "1", "uri" : "https.../restapi/v1.0/dictionary/country/1" } }, "servicePlan" : { "id" : "1216", "name" : "Professional" }, "billingPlan" : { "id" : "159", "name" : "Monthly - 14.99 - Pro 101503", "durationUnit" : "Month", "duration" : 1, "type" : "Regular" } }, "operator" : { "uri" : "https.../restapi/v1.0/account/401145624008/extension/401145624008", "id" : 401145624008, "extensionNumber" : "101" }, "mainNumber" : "18555440014", "status" : "Confirmed", "setupWizardState" : "Completed" } Get Extension Info Since 1.0.0 Returns the information on account extension. Method/URI GET /restapi/v1.0/account/{accountId}/extension/{extensionId} Usage Plan Group Light Path Parameters Parameter accountId, extensionId Type Description integer See Generic Path Parameters Request Body None CONFIDENTIAL 65 Rev.1.0.16.a.[79434afda268+] Account and Extension Information Response Body Extension Info Parameter Type Description Standard resource properties ID and canonical URI, see Common Properties id, uri partnerId string For Partner Applications Internal identifier of an extension created by partner. The RingCentral supports the mapping of accounts and stores the corresponding accountId/extensionId for each partnerId of a client application. In request URIs partnerIds are accepted instead of regular RingCentral native IDs as path parameters using pid = XXX clause. Though in response URIs contain the corresponding accountIds and extensionIds. In all request and response bodies these values are reflected via "partnerId" attributes of account and extension extensionNumber string Extension short number (usually 3 or 4 digits) name string Extension user name type 'User' | 'Fax User' | 'VirtualUser' Extension type (see Extension Information | 'DigitalUser' | 'Department' | for details) 'Announcement' | 'Voicemail' | 'SharedLinesGroup' | 'PagingOnly' | 'IvrMenu' | 'ApplicationExtension' departments Collection of parameters Information on department extension(s), to which the requested extension belongs. Returned only for user extensions, members of department, requested by single extensionId uri string Link to full information on department extension, see Common Properties id string Internal identifier of department extension extensionNumber string Number of department extension contact Contact Info [67] Contact detailed information status 'Enabled' | 'Disabled' | 'NotActivated' | 'Unassigned' Extension current state statusInfo Collection of parameters Status information (reason, comment). Returned for 'Disabled' status only reason 'Voluntarily' | 'Involuntarily' Type of suspension comment string A free-form user comment, describing the status change reason CONFIDENTIAL 66 Rev.1.0.16.a.[79434afda268+] Account and Extension Information Parameter Type Description serviceFeatures Collection of [Extension Service Feature Info [68]] Extension service features returned in response only when the logged-in user requests his/her own extension info, see also Extension Service Features [68] regionalSettings Regional Settings [70] Extension region data (timezone, home country, language) setupWizardState 'NotStarted' | 'Incomplete' | 'Completed' Specifies extension configuration wizard state (web service setup). The default value is "NotStarted" permissions Extension Permissions [71] Extension permissions, corresponding to the Service Web permissions "Admin" and "InternationalCalling" greetings Greetings Info [71] The greetings that are applied during forwarding calls Note Short or extended version of Extension Info can be returned depending on particular API. Extension Info (short) Parameter Type Description Standard resource properties ID and canonical URI, see the section called “Resource Identification Properties” id, uri partnerId string For Partner Applications Internal identifier of an extension created by partner. The RingCentral supports the mapping of accounts and stores the corresponding accountId/extensionId for each partnerId of a client application. In request URIs partnerIds are accepted instead of regular RingCentral native IDs as path parameters using pid = XXX clause. Though in response URIs contain the corresponding accountIds and extensionIds. In all request and response bodies these values are reflected via "partnerId" attributes of account and extension extensionNumber string Extension number (usually 3 or 4 digits) Contact Info Parameter Type Description firstName string For User extension type only. Extension user first name lastName string For User extension type only. Extension user last name company string Extension user company name email string Email of extension user businessPhone string Extension user contact phone number CONFIDENTIAL 67 Rev.1.0.16.a.[79434afda268+] Account and Extension Information Parameter businessAddress Type Contact Address Info [68] Description Business address of extension user company Contact Address Info Parameter Type Description country string Country name of extension user company state string State/province name of extension user company city string City name of extension user company street string Street address of extension user company zip string Zip code of extension user company Extension Service Feature Info Parameter Type Description featureName string Feature name, see all available values in Service Feature List [68] enabled True | False Feature status; shows feature availability for an extension reason string Reason of limitation for a particular service feature. Returned only if the enabled parameter value is 'False', see Service Feature Limitations and Reasons [69] Service Feature List Feature Name Description BlockedMessageForwarding Disallows to forward unencrypted fax and voicemail messages and specifies 'Open With' on Android devices CallForwarding Feature that allows forwarding a call to the number previously added to the extension forwarding list CallPark Feature that allows putting a call on hold at one telephone set and continuing the conversation from any other telephone set Conferencing Conference calling DND DnD (Do not Disturb) mode EncryptionAtRest Enables data protection on mobile devices and softphones Fax Sending and receiving Fax messages FaxReceiving Receiving Fax messages FreeSoftPhoneLines Free Digital Line availability HDVoice Feature enabling support of HD Voice compatible phones HipaaCompliance HIPAA Compliance of the account. The Health Insurance Portability and Accountability Act is a standard for protecting sensitive patient data, providing physical, network and process security Intercom Intercom calling. A soft key on the caller's phone is assigned for the Intercom function. By pressing it the CONFIDENTIAL 68 Rev.1.0.16.a.[79434afda268+] Account and Extension Information Feature Name Description user makes a call which is received by the destination number automatically via the loudspeaker. The callee is also able to switch the microphone on. Available for User extension types except FaxUser InternationalCalling Calling to international phone numbers OnDemandCallRecording Feature that allows recording a call on demand Pager Sending and receiving Pager messages PagerReceiving Receiving Pager messages Paging Intercom calling without callback possibility; used when some information is to be delivered via the loud speaker to one or several paging groups. Available for User extension types except FaxUser Reports Viewing reports on call history Presence Ability of user extension to monitor other extensions' presence RingOut Click-to-Call feature, allowing to make calls using the web on any IP, analog or mobile phone. When you initiate a call using RingOut, RingCentral will call your current location number. Once you answer, RingCentral dials a destination number for you. It is useful, when you do not want to dial a number manually or want to make a call with another phone using RingCentral number. Also it may be used by a third party (secretary) to initiate a call between you and another person SalesForce Integration with Salesforce SingleExtensionUI Indicates that current account can contain one and only one extension SMS Sending and receiving SMS messages SMSReceiving Receiving SMS messages VideoConferencing Video conference calling VoipCalling IP telephony Voicemail Sending and receiving Voicemail messages VoicemailToText Transcription of voicemail audio record to text message Service Feature Limitations and Reasons Note When retrieving service features for extension, the reasons for the limitations, if any, are returned in response. Limitation AccountTypeLimitation CONFIDENTIAL Description Principal account type limitation. Feature is not supported for account type 69 Example Free Digital Line service feature is turned off on UBP tier Rev.1.0.16.a.[79434afda268+] Account and Extension Information Limitation Description ExtensionTypeLimitation Principal extension type limitation. Feature is not supported for particular extension type (built-in Product restriction) Example Announcement Only or Take Messages Only extension types that cannot send SMS, feature is disabled because of immutable extension type limitation and it is impossible to change the type of this extension AccountLimitation Account limitation (service SMS can be turned off for a particular parameter setting at brand, account/tier tier or account level); can be changed only by RC Customer Support, or by upgrading to a different tier ExtensionLimitation Extension limitation, requiring chargeable action; can be changed by Account Administrator, requires chargeable action (except tier upgrades) Is used for Free Digital Line service feature, it is available only if there is at least one paid digital line on this extension InsufficientPermissions Extension limitation, resolution International Calling is turned off using is not chargeable; can be changed by Account Administrator without extra charges extension permissions Regional Settings Parameter Type Description timezone Timezone Info [134] Extension timezone information homeCountry Country Info [126] Extension country information language Collection of parameters User interface language data id string Internal identifier of a language name string Official name of a language localeCode string Localization code greetingLanguage Collection of parameters Information on language used for telephony greetings id string Internal identifier of a greeting language name string Official name of a greeting language localeCode string Localization code formattingLocale Collection of parameters Formatting language preferences for numbers, dates and currencies CONFIDENTIAL 70 Rev.1.0.16.a.[79434afda268+] Account and Extension Information Parameter Type Description id string Internal identifier of a formatting language name string Official name of a language localeCode string Localization code Extension Permissions Parameter Type admin Collection of parameters enabled 'True' | 'False' internationalCalling Collection of parameters enabled 'True' | 'False' Description Admin permission International Calling permission Greetings Info Parameter Type Description type Introductory' | 'Voicemail' | 'AudioWhileConnecting' | 'CallScreening' | 'ConnectingMessage' | 'Announcement'| 'MusicOnHold', etc. Type of greeting prompt Collection of parameters The prompt message id string Internal identifier of the prompt type string Type of the prompt name string The specified name of the prompt Example Request example GET /restapi/v1.0/account/11041661004/extension/~ HTTP/1.1 Accept: application/json Authorization: Bearer U0pDMDFQMDFQQVMwMnxBQUJFU3VOMlp2bjZFSi1KZFFBdkFFWldt Response example HTTP/1.1 200 OK Content-Language: en-US Content-Type: application/json; charset=UTF-8 { "uri" : "https.../restapi/v1.0/account/11041661004/extension/11041661004", "id" : 11041661004, "extensionNumber" : "101", "contact" : { "firstName" : "John", "lastName" : "Smith", "company" : "MyCompany Inc.", "email" : "[email protected]", "businessPhone" : "+16557809302", "businessAddress" : { "street" : "13 Elm Street", "city" : "Foster City", CONFIDENTIAL 71 Rev.1.0.16.a.[79434afda268+] Account and Extension Information "state" : "CA", "zip" : "94404", "country" : "United States" } }, "name" : "John Smith", "type" : "User", "status" : "Enabled", "serviceFeatures" : [ { "featureName" : "SMS", "enabled" : true }, { "featureName" : "SMSReceiving", "enabled" : true }, { "featureName" : "Pager", "enabled" : true }, { "featureName" : "PagerReceiving", "enabled" : true }, { "featureName" : "Voicemail", "enabled" : true }, { "featureName" : "Fax", "enabled" : true }, { "featureName" : "FaxReceiving", "enabled" : true }, { "featureName" : "DND", "enabled" : true }, { "featureName" : "RingOut", "enabled" : true }, { "featureName" : "InternationalCalling", "enabled" : false, "reason" : "AccountLimitation" }, { "featureName" : "Presence", "enabled" : true }, { "featureName" : "VideoConferencing", "enabled" : true }, { "featureName" : "SalesForce", "enabled" : true }, { "featureName" : "Intercom", "enabled" : true }, { "featureName" : "Paging", "enabled" : true }, { "featureName" : "Conferencing", "enabled" : true }, { "featureName" : "VoipCalling", "enabled" : true }, { "featureName" : "FreeSoftPhoneLines", "enabled" : false, "reason" : "ExtensionLimitation" }, { "featureName" : "HipaaCompliance", "enabled" : false, "reason" : "AccountLimitation" }, { "featureName" : "CallPark", "enabled" : true }, { "featureName" : "OnDemandCallRecording", "enabled" : true }, { "featureName" : "Reports", "enabled" : true CONFIDENTIAL 72 Rev.1.0.16.a.[79434afda268+] Account and Extension Information }, { "featureName" : "CallForwarding", "enabled" : true }, { "featureName" : "DeveloperPortal", "enabled" : false, "reason" : "AccountLimitation" }, { "featureName" : "EncryptionAtRest", "enabled" : false, "reason" : "AccountLimitation" }, { "featureName" : "BlockedMessageForwarding", "enabled" : false, "reason" : "AccountLimitation" }, { "featureName" : "EmergencyCalling", "enabled" : false, "reason" : "AccountLimitation" }, { "featureName" : "HDVoice", "enabled" : false, "reason" : "AccountTypeLimitation" }, { "featureName" : "SingleExtensionUI", "enabled" : false, "reason" : "AccountLimitation" }, { "featureName" : "CallSupervision", "enabled" : false, "reason" : "AccountLimitation" }, { "featureName" : "VoicemailToText", "enabled" : false, "reason" : "AccountLimitation" } ], "regionalSettings" : { "timezone" : { "uri" : "https.../restapi/v1.0/dictionary/timezone/14", "id" : "14", "name" : "Europe/Moscow", "description" : "Moscow, St. Petersburg, Volgograd" }, "homeCountry" : { "uri" : "https.../restapi/v1.0/dictionary/country/1", "id" : "1", "name" : "United States", "isoCode" : "US", "callingCode" : "1" }, "language" : { "id" : "1033", "name" : "English (United States)", "localeCode" : "en-US" }, "greetingLanguage" : { "id" : "1033", "name" : "English (United States)", "localeCode" : "en-US" }, "formattingLocale" : { "id" : "1033", "name" : "English (United States)", "localeCode" : "en-US" } }, "setupWizardState" : "Completed", "permissions" : { "admin" : { "enabled" : true }, "internationalCalling" : { "enabled" : true } }, "greetings" : [ { "type" : "MusicOnHold", CONFIDENTIAL 73 Rev.1.0.16.a.[79434afda268+] Account and Extension Information "prompt" "id" : "type" "name" } } ] : { "6", : "music", : "Acoustic" } Get Extension List Since 1.0.0 Returns the list of extensions created for a particular account. All types of extensions are included in this list. Method/URI GET /restapi/v1.0/account/{accountId}/extension Usage Plan Group Medium Path Parameters Parameter accountId Type Description integer See the section called “Generic Path Parameters” Query Parameters Parameter Type Description page, perPage integer Standard paging parameters, see the section called “Common Query Parameters in Collection Resources” status 'Enabled' | 'Disabled' | 'NotActivated'| 'Unassigned' Extension current state. If 'Unassigned' is specified, then extensions without extensionNumber are returned. If not specified, then all extensions are returned Request Body None Response Body Property records Type Description Collection [Extension Info [66]] Standard collection metadata, see the section called “Common Collection Properties” paging, navigation CONFIDENTIAL List of extension records 74 Rev.1.0.16.a.[79434afda268+] Account and Extension Information Example Request example GET /restapi/v1.0/account/~/extension HTTP/1.1 Accept: application/json Authorization: Bearer U0pDMDFQMDFKV1MwMXz6J_ixC7_yYvon-KUZ31Lx-if4rw Response example HTTP/1.1 200 OK Content-Type: application/json { "uri" : ".../account/754224008/extension?page=1&perPage=100", "records" : [ { "uri" : ".../account/754224008/extension/754233008", "id" : 754233008, "extensionNumber" : "109", "name": "Sara Lin" "type": "User" "contact" { "firstName" : "Sara", "lastName" : "Lin", "company" : "MyCompany Inc.", "email": "[email protected]" } "status": "Enabled" }, { "uri" : ".../account/754224008/extension/754235008", "id" : 754235008, "extensionNumber" : "301", "name" : "Announcement Extension", "type" : "Announcement" "contact" { "company" : "MyCompany Inc.", "email": "[email protected]" "businessAddress": { "country": "China" "city": "Beijing" } "status": "Enabled" }, { "uri" : ".../account/754224008/extension/754234008", "id" : 754234008, "extensionNumber" : "201", "name" : "Department Extension", "type" : "Department" "contact"{ "company" : "MyCompany Inc.", "email": "[email protected]" "businessAddress": { "country": "Canada" "city": "Montreal" } "status": "Enabled" }, { "uri" : ".../account/754224008/extension/754236008", "id" : 754236008, "extensionNumber" : "401", "name" : "Voicemail Extension", "type" : "Voicemail" "contact"{ "company" : "MyCompany Inc.", "email": "[email protected]" "businessAddress": { "country": "USA" "city": "Washington" } "status": "Enabled" } } CONFIDENTIAL 75 Rev.1.0.16.a.[79434afda268+] Chapter 14. Call Log Get Call Log Record Since 1.0.3 (Release 5.11) Returns individual call log record by callRecordId(s). Method/URI GET /restapi/v1.0/account/{accountId}/call-log/{callRecordId(s)} GET /restapi/v1.0/account/{accountId}/extension/{extensionId}/call-log/ {callRecordId(s)} Batch request is supported, see Batch Requests for details. Usage Plan Group Heavy Path Parameters Parameter Type Batch support Description accountId, extensionId integer no See the section called “Generic Path Parameters” callRecordId integer yes Internal identifier of a call log record Request Body None Response Body Call Log Record Parameter Type Description Standard resource properties ID and canonical URI, see the section called “Resource Identification Properties” id, uri sessionId string Internal identifier of a call session from Caller Info Caller information to Caller Info Callee information type 'Voice' | 'Fax' Call type direction 'Inbound' | 'Outbound' Call direction action string CONFIDENTIAL Action description of the call operation. See the section called “Commonly Used Call Actions and Results” 76 Rev.1.0.16.a.[79434afda268+] Call Log Parameter Type Description result string Status description of the call operation. See the section called “Commonly Used Call Actions and Results” startTime datetime Call start time duration integer Call duration in seconds recording Recording Info [78] Call recording data. Returned if the call is recorded Call Log Detailed Record Parameter Type Description Standard resource properties ID and canonical URI, see the section called “Resource Identification Properties” id, uri sessionId string Internal identifier of a call session from Caller Info Caller information to Caller Info Callee information type 'Voice' | 'Fax' Call type direction 'Inbound' | 'Outbound' Call direction action string Action description of the call operation. See the section called “Commonly Used Call Actions and Results” result string Status description of the call operation. See the section called “Commonly Used Call Actions and Results” startTime datetime Call start time duration integer Call duration in seconds transport 'PSTN'/ 'VoIP' Call transport message null Message attachment recording Recording Info [78] Call recording data. Returned if the call is recorded billing 'costIncluded' | 'costPurchased' Information on costs legs Collection of parameters Leg description startTime datetime Call start time duration integer Call duration in seconds type 'Voice' | 'Fax' Call type direction 'Inbound' | 'Outbound' Call direction action string Action description of the call operation. See the section called “Commonly Used Call Actions and Results” CONFIDENTIAL 77 Rev.1.0.16.a.[79434afda268+] Call Log Parameter Type Description result string Status description of the call operation. See the section called “Commonly Used Call Actions and Results” from Caller Info Caller information to Caller Info Callee information transport 'PSTN'/ 'VoIP' Call transport message null Message attachment recording Recording Info [78] Call recording data. Returned if the call is recorded billing 'costIncluded' | 'costPurchased' Information on costs legType string Leg type Recording Info Parameter Type Description id integer Internal identifier of the call recording uri string Link to the call recording resource contentType string Call recording file format. Supported format is audio/ x-wav duration integer Recorded call duration Example Request example GET https.../restapi/v1.0/account/10979280004/extension/10979280004/call-log/AYRh1VBgc6C8eks HTTP/1.1 Authorization: Bearer U0pDMDFQMDFQQVMwMnxBQUJFU3VOMlp2bjZFSUNPU3BWV2wyZmZ4YkVPSFNDSlVFT3FaRmZTdFdraUx Accept: application/json Response example HTTP/1.1 200 OK Content-Language: en-US Content-Type: application/json Content-Length: 723 { "uri" : "https.../restapi/v1.0/account/10979280004/extension/10979280004/call-log/ AYRh1VBgc6C8eks", "id" : "AYRh1VBgc6C8eks", "sessionId" : "18340829004", "startTime" : "2015-01-19T13:58:19.000Z", "duration" : 60, "type" : "Voice", "direction" : "Inbound", "action" : "Phone Call", "result" : "Accepted", "to" : { "phoneNumber" : "18773220048", "name" : "John Smith" }, "from" : { CONFIDENTIAL 78 Rev.1.0.16.a.[79434afda268+] Call Log "phoneNumber" : "18558570060", "name" : "Jane Smith" }, "recording" : { "uri" : "https.../restapi/v1.0/account/10979280004/extension/10979280004/ recording/59497406004/content", "id" : 59497406004, "contentType" : "audio/x-wav", "duration" : 30 } } Get Call Log Records by Filter Since 1.0.3 (Release 5.11) Returns call log records filtered by the specified parameters. Method/URI Account Call-Log GET /restapi/v1.0/account/{accountId}/call-log Extension Call-Log GET /restapi/v1.0/account/{accountId}/extension/{extensionId}/call-log Usage Plan Group Heavy Path Parameters Parameter Type Description accountId, extensionId integer See the section called “Generic Path Parameters” Query Parameters Parameter Type extensionNumber string Description Extension number of a user. If specified, returns call log for a particular extension only. Cannot be specified together with the phoneNumber filter phoneNumber string Phone number of a caller/call recipient. If specified, returns all calls (both incoming and outcoming) with the mentioned phone number. Cannot be specified together with the extensionNumber filter direction 'Inbound' | 'Outbound' The direction for the result records. It is allowed to specify more than one direction. If not specified, both inbound and outbound records are returned. Multiple values are accepted type 'Voice' | 'Fax' Call type of a record. It is allowed to specify more than one type. If not specified, all call types are returned. Multiple values are accepted CONFIDENTIAL 79 Rev.1.0.16.a.[79434afda268+] Call Log Parameter Type Description view 'Simple' | 'Detailed' The default value is 'Simple' for both account and extension call log withRecording 'True' | 'False' 'True' if only recorded calls have to be returned dateTo datetime Specifies the ending timestamp for result records. Default: current time dateFrom datetime The start timestamp for result records. Default value is equal to dateTo minus 1 week page, perPage integer Standard paging parameters, see the section called “Common Query Parameters in Collection Resources” Request Body None Response Body Property records Type Description Collection [Call Log Record [76]]; or collection [Call Log Detailed Record [77]] List of call log records depending on the view parameter value. If the 'Simple' value is specified then collection of Call Log Record [76] is returned. If the 'Detailed' value is specified then collection of Call Log Detailed Record [77] is returned Standard collection metadata, see the section called “Common Collection Properties”, except for properties totalPages and totalElements, which are not returned for this request. The total number of elements per page is not specified, and the page enumeration is absent paging, navigation Example 1 If the view parameter value is 'Simple' Request example GET /restapi/v1.0/account/~/extension/~/call-log? direction=Inbound&dateFrom=2012-09-17T12:51:00.000Z HTTP/1.1 Accept: application/json Authorization: Bearer U0pDMDFQMDFKV1MwMXz6J_ixC7_yYvon-KUZ31Lx-if4rw Response example HTTP/1.1 200 OK Content-Type: application/json { "uri" : ".../account/754224008/extension/754224008/call-log? direction=Inbound&dateFrom=2012-09-17T12:51:00.000Z&page=1&perPage=100", "records" : [ { "uri" : ".../account/754224008/extension/754224008/call-log/Pz4OE2Y_VJRPEg", "id" : "Pz4OE2Y_VJRPEg", "sessionId" : "403389461094", CONFIDENTIAL 80 Rev.1.0.16.a.[79434afda268+] Call Log "startTime" : "2012-09-17T12:51:22.000Z", "duration" : 48, "type" : "Voice", "direction" : "Inbound", "action" : "Phone Call", "result" : "Voicemail", "to" : { "phoneNumber" : "12056770024", "location" : "Chelsea, AL" }, "from" : { "phoneNumber" : "18559100010" } } ], "paging" : { "page" : 1, "perPage" : 100, "pageStart" : 0, "pageEnd" : 0 }, "navigation" : { "firstPage" : { "uri" : ".../account/754224008/extension/754224008/call-log? direction=Inbound&dateFrom=2012-09-17T16:51:00.000Z&page=1&perPage=100" } } } Example 2 If the view parameter value is 'Detailed' Request example GET /restapi/v1.0/account/400686290004/extension/400686290004/call-log/detail?perPage=2 HTTP/1.1 Accept: application/json Authorization: Bearer U0pDMDFQMDFQQVMwMnxBQUFWZmY4ZXoxMlhvUFI5dmhYVzVs Response example HTTP/1.1 200 OK Content-Type: application/json Content-Length: 3178 { "uri" : "https.../restapi/v1.0/account/400686290004/extension/400686290004/call-log? dateFrom=2014-08-12T00:00:00.000Z&page=1&perPage=2", "records" : [ { "uri" : "https.../restapi/v1.0/account/400686290004/extension/400686290004/call-log/IVNVUw5GHgnXlE", "id" : "IV-NVUw5GHgnXlE", "sessionId" : "403457840004", "startTime" : "2014-08-19T11:15:05.000Z", "duration" : 4, "type" : "Voice", "direction" : "Inbound", "action" : "Phone Call", "result" : "Accepted", "to" : { "phoneNumber" : "18559700003", "name" : "John Smith" }, "from" : { "phoneNumber" : "16504445567", "name" : "Jane Smith", "location" : "Palo Alto, CA" }, "transport" : "PSTN", "message" : "null", "recording" : "null", "billing" : { }, "legs" : [ { "startTime" : "2014-08-19T11:15:05.000Z", CONFIDENTIAL 81 Rev.1.0.16.a.[79434afda268+] Call Log "duration" : 4, "type" : "Voice", "direction" : "Inbound", "action" : "Phone Call", "result" : "Accepted", "to" : { "phoneNumber" : "18559700003", "name" : "John Smith" }, "from" : { "phoneNumber" : "16504445567", "name" : "Jane Smith", "location" : "Palo Alto, CA" }, "transport" : "PSTN", "message" : "null", "recording" : "null", "billing" : { }, "legType" : "ACCEPT" } ] }, { "uri" : "https.../restapi/v1.0/account/400686290004/extension/400686290004/call-log/IVNR2uCZNDDXk4", "id" : "IV-NR2uCZNDDXk4", "sessionId" : "403457830004", "startTime" : "2014-08-19T11:15:02.000Z", "duration" : 7, "type" : "Voice", "direction" : "Inbound", "action" : "Phone Call", "result" : "Accepted", "to" : { "phoneNumber" : "18559700003", "name" : "John Smith" }, "from" : { "phoneNumber" : "16504445566", "name" : "Jerry Smith", "location" : "Palo Alto, CA" }, "transport" : "PSTN", "message" : "null", "recording" : "null", "billing" : { }, "legs" : [ { "startTime" : "2014-08-19T11:15:02.000Z", "duration" : 7, "type" : "Voice", "direction" : "Inbound", "action" : "Phone Call", "result" : "Accepted", "to" : { "phoneNumber" : "18559700003", "name" : "John Smith" }, "from" : { "phoneNumber" : "16504445566", "name" : "Jerry Smith", "location" : "Palo Alto, CA" }, "transport" : "PSTN", "message" : "null", "recording" : "null", "billing" : { }, "legType" : "ACCEPT" } ] } ], "paging" : { "page" : 1, "perPage" : 2, "pageStart" : 0, "pageEnd" : 1 }, "navigation" : { "nextPage" : { "uri" : "https.../restapi/v1.0/account/400686290004/extension/400686290004/call-log? dateFrom=2014-08-12T00:00:00.000Z&page=2&perPage=2" CONFIDENTIAL 82 Rev.1.0.16.a.[79434afda268+] Call Log }, "firstPage" : { "uri" : "https.../restapi/v1.0/account/400686290004/extension/400686290004/call-log? dateFrom=2014-08-12T00:00:00.000Z&page=1&perPage=2" } } } Get Active Calls Since 1.0.13 (Release 6.5) Returns records of all calls that are in progress, ordered by start time in descending order. Method/URI Account Call-Log GET /restapi/v1.0/account/{accountId}/active-calls Extension Call-Log GET /restapi/v1.0/account/{accountId}/extension/{extensionId}/active-calls Usage Plan Group Heavy Required Permissions Permission Description Viewing user call logs ReadCallLog Path Parameters Parameter Type Description accountId, extensionId integer See the section called “Generic Path Parameters” Query Parameters Parameter Type Description direction 'Inbound' | 'Outbound' type 'Voice' | 'Fax' Call type of a record. It is allowed to specify more than one type. If not specified, all call types are returned. Multiple values are accepted page, perPage integer CONFIDENTIAL The direction for the result records. It is allowed to specify more than one direction. If not specified, both inbound and outbound records are returned. Multiple values are accepted Standard paging parameters, see the section called “Common Query Parameters in Collection Resources” 83 Rev.1.0.16.a.[79434afda268+] Call Log Request Body None Response Body Property records Type Collection [Call Log Record [76]] paging, navigation Description List of call log records Standard collection metadata, see the section called “Common Collection Properties”, except for properties totalPages and totalElements, which are not returned for this request. The total number of elements per page is not specified, and the page enumeration is absent Example Request example GET /restapi/v1.0/account/400618687004/extension/400618687004/active-calls HTTP/1.1 Accept: application/json Authorization: Bearer U0pDMDFQMDFQQVMwMnxBQUFWZmY4ZXoxMlhvUFI5dmhYVzV Response example HTTP/1.1 200 OK Content-Type: application/json Content-Length: 941 { "uri" : "https.../restapi/v1.0/account/400618687004/extension/400618687004/active-calls? page=1&perPage=100", "records" : [ { "uri" : "https.../restapi/v1.0/account/400618687004/extension/400618687004/call-log/ IV5fj9D8vHjs8fw", "id" : "IV5fj9D8vHjs8fw", "sessionId" : "403402173004", "startTime" : "2014-08-15T15:16:12.000Z", "duration" : 0, "type" : "Voice", "direction" : "Outbound", "action" : "RingOut Web", "result" : "Call connected", "to" : { "phoneNumber" : "18556620006", "name" : "John Smith" }, "from" : { "name" : "Jane Smith" } } ], "paging" : { "page" : 1, "perPage" : 100, "pageStart" : 0, "pageEnd" : 0 }, "navigation" : { "firstPage" : { "uri" : "https.../restapi/v1.0/account/400618687004/extension/400618687004/active-calls? page=1&perPage=100" } CONFIDENTIAL 84 Rev.1.0.16.a.[79434afda268+] Call Log } } CONFIDENTIAL 85 Rev.1.0.16.a.[79434afda268+] Chapter 15. Messaging RingCentral Messaging API allows to work with different types of messages processed by RingCentral phone system. Get Message Since 1.0.2 Returns individual message record by the given messageId. Method/URI GET /restapi/v1.0/account/{accountId}/extension/{extensionId}/message-store/ {messageId(s)} Batch request is supported, see Batch Requests for details. Usage Plan Group Light Path Parameters Parameter Type Batch support Description accountId, extensionId integer no See the section called “Generic Path Parameters” messageId integer yes Internal identifier of a message Request Body None Response Body Message Info Parameter Type Description Standard resource properties ID and canonical URI, see the section called “Resource Identification Properties” id, uri type 'Fax' | 'SMS' | 'VoiceMail' | 'Pager' | 'Text' Message type direction 'Inbound' | 'Outbound' Message direction. Note that for some message types not all directions are allowed. For example voicemail messages can be only inbound from Caller Info Sender information CONFIDENTIAL 86 Rev.1.0.16.a.[79434afda268+] Messaging Parameter Type Description to Caller Info Recipient information creationTime datetime Message creation timestamp lastModifiedTime datetime The timestamp when the message was modified on server messageStatus 'Queued' | 'Sent' | 'Delivered' | 'DeliveryFailed' | 'SendingFailed' | 'Received' Message status. Different message types may have different allowed status values (see Chapter 6, Working with Messages for details) readStatus 'Read' | 'Unread' Message read status availability 'Alive' | 'Deleted' | 'Purged' Message availability status. Message in 'Deleted' state is still preserved along with all its attachments and can be restored. 'Purged' means that all attachments are already deleted and the message itself is about to be physically deleted shortly vmTranscriptionStatus'NotAvailable' | 'InProgress' Voicemail only. Status of voicemail to text | 'TimedOut' | 'Completed' | transcription. If VoicemailToText feature is 'CompletedPartially' | 'Failed' not activated for account, the 'NotAvailable' value is returned attachments Collection of [Message Attachment Info [87]] The list of message attachments conversationId integer SMS and Pager only. Identifier of the conversation the message belongs to deliveryErrorCode string SMS only. Delivery error code returned by gateway faxPageCount integer Fax only. Page count in fax message faxResolution 'High' | 'Low' Fax only. Resolution of fax message. ('High' for black and white image scanned at 200 dpi, 'Low' for black and white image scanned at 100 dpi). priority 'Normal' | 'High' Message priority smsDeliveryTime datetime SMS only. The timestamp when outbound SMS was delivered to recipient's handset. It is filled only if the carrier sends a delivery receipt to RingCentral smsSendingAttemptsCount integer SMS only. Number of attempts made to send an outbound SMS to the gateway (if gateway is temporary unavailable) subject string Message subject. For SMS and Pager messages it replicates message text which is also returned as an attachment pgToDepartment boolean Pager only. True if at least one of the message recipients is Department extension Message Attachment Info CONFIDENTIAL 87 Rev.1.0.16.a.[79434afda268+] Messaging Parameter Type Description Standard resource properties ID and canonical URI. In this case URI points to media for a particular attachment id, uri type 'AutoRecording' | 'AutoTranscription | 'Text' | 'SourceDocument'| 'RenderedDocument' Attachment type, see also Attachment Type Info [88] contentType string MIME type for a given attachment, for instance 'audio/wav' vmDuration integer Voicemail only Duration of the voicemail in seconds Attachment Type Info Attachment Type Message Type Content Type Description AutoRecording Voicemail audio Auto recorded audio file AutoTranscription Voicemail text Auto transcribed text file RenderedDocument Fax image/tiff; application/ pdf The file rendered from original format to TIFF or PDF; delivered to the recipient SourceDocument Fax/Text Any supported file format The original file in any format; attached by the sender Text SMS/ Pager text/plain Text format file Example 1 Get Voicemail message Request example GET /restapi/v1.0/account/14833636004/extension/14833636004/message-store/82063400004 HTTP/1.1 Accept-Encoding: gzip,deflate Authorization: Bearer U0pDMDFQMDFQQVMwMnxBQUJFU3VOMlp2bjZFTzNXSmhtdUh0cUlRNENtT2NT Accept: application/json Response example HTTP/1.1 200 OK Content-Language: en-US Content-Type: application/json; charset=UTF-8 Content-Length: 1150 { "uri" : "https.../restapi/v1.0/account/14833636004/extension/14833636004/messagestore/82063400004", "id" : 82063400004, "to" : [ { "name" : "John Smith" } ], "from" : { "phoneNumber" : "+18664320079", CONFIDENTIAL 88 Rev.1.0.16.a.[79434afda268+] Messaging "name" : "Generated voice message" }, "type" : "VoiceMail", "creationTime" : "2015-04-01T04:39:19.000Z", "readStatus" : "Unread", "priority" : "Normal", "attachments" : [ { "id" : 82063400004, "uri" : "https.../restapi/v1.0/account/14833636004/extension/14833636004/messagestore/82063400004/content/82063400004", "type" : "AudioRecording", "contentType" : "audio/x-wav", "vmDuration" : 30 }, { "id" : 1897320004, "uri" : "https.../restapi/v1.0/account/14833636004/extension/14833636004/messagestore/82063400004/content/1897320004", "type" : "AudioTranscription", "contentType" : "text/plain" } ], "direction" : "Inbound", "availability" : "Alive", "messageStatus" : "Received", "lastModifiedTime" : "2015-04-01T08:39:18.706Z", "vmTranscriptionStatus" : "Completed" } Example 2 Get Pager message Request example GET /restapi/v1.0/account/400928048004/extension/400928050004/message-store/401081345004 HTTP/1.1 Authorization: Bearer U0pDMDFQMDFQQVMwMnxBQUFWZmY4ZXoxMlhvUFI5dmhYVzVsb1hBV21Ka01xV3NDREFvZ2ZoT2J Accept: application/json Response example HTTP/1.1 200 OK Content-Type: application/json { "uri" : "https.../restapi/v1.0/account/400928048004/extension/400928050004/messagestore/401081345004", "id" : 401081345004, "to" : [ { "extensionNumber" : "103" } ], "from" : { "extensionNumber" : "102", "name" : "Generated IM message" }, "type" : "Pager", "creationTime" : "2014-09-01T19:26:45.000Z", "readStatus" : "Unread", "priority" : "Normal", "attachments" : [ { "id" : 401081345004, "uri" : "https.../restapi/v1.0/account/400928048004/extension/400928050004/messagestore/401081345004/content/401081345004", "type" : "Text", "contentType" : "text/plain" } ], "direction" : "Outbound", "availability" : "Alive", "subject" : "Sample message", CONFIDENTIAL 89 Rev.1.0.16.a.[79434afda268+] Messaging "messageStatus" : "Sent", "conversationId" : 6951365551500, "lastModifiedTime" : "2014-09-01T12:26:44.114Z", "pgToDepartment" : false } Example 3 Get SMS message Request example GET /restapi/v1.0/account/12502999004/extension/12502999004/message-store/60279564004 HTTP/1.1 Authorization: Bearer U0pDMDFQMDFQQVMwMXxBQUJFU3VOMlp2bjZFSzBYeG9vaVc1UXpWR0k0VU13Yk4tbXFaRmZ Accept: application/json Response example HTTP/1.1 200 OK Content-Language: en-US Content-Type: application/json; charset=UTF-8 { "uri" : "https.../restapi/v1.0/account/12502999004/extension/12502999004/messagestore/60279564004", "id" : 60279564004, "to" : [ { "phoneNumber" : "+16505393204", "location" : "San Mateo, CA" } ], "from" : { "phoneNumber" : "+18889450052" }, "type" : "SMS", "creationTime" : "2015-02-18T13:24:50.000Z", "readStatus" : "Read", "priority" : "Normal", "attachments" : [ { "id" : 60279564004, "uri" : "https.../restapi/v1.0/account/12502999004/extension/12502999004/messagestore/60279564004/content/60279564004", "type" : "Text", "contentType" : "text/plain" } ], "direction" : "Outbound", "availability" : "Alive", "subject" : "Test SMS message from Platform server", "messageStatus" : "Sent", "smsSendingAttemptsCount" : 1, "conversationId" : 5578984350117917661, "lastModifiedTime" : "2015-02-18T13:24:50.300Z" } Example 4 Get Fax message Request example GET /restapi/v1.0/account/12569864004/extension/12569864004/message-store/60335038004 HTTP/1.1 Accept: application/json Authorization: Bearer U0pDMDFQMDFQQVMwMXxBQUJFU3VOMlp2bjZFSzBYeG9vaVc1UXpDbGpvZTZrcFlj Response example CONFIDENTIAL 90 Rev.1.0.16.a.[79434afda268+] Messaging HTTP/1.1 200 OK Content-Language: en-US Content-Type: application/json; charset=UTF-8 Content-Length: 766 { "uri" : "https.../restapi/v1.0/account/12569864004/extension/12569864004/messagestore/60335038004", "id" : 60335038004, "to" : [ { "phoneNumber" : "+18005630003" } ], "type" : "Fax", "creationTime" : "2015-02-19T14:15:51.000Z", "readStatus" : "Unread", "priority" : "Normal", "attachments" : [ { "id" : 60335038004, "uri" : "https.../restapi/v1.0/account/12569864004/extension/12569864004/messagestore/60335038004/content/60335038004", "type" : "RenderedDocument", "contentType" : "image/tiff" } ], "direction" : "Outbound", "availability" : "Alive", "messageStatus" : "Sent", "faxResolution" : "High", "faxPageCount" : 2, "lastModifiedTime" : "2015-02-19T14:18:05.042Z" } Get Message List Since 1.0.2 Returns the list of messages from an extension mailbox. Method/URI GET /restapi/v1.0/account/{accountId}/extension/{extensionId}/message-store Usage Plan Group Light Path Parameters Parameter accountId, extensionId Type Description integer See the section called “Generic Path Parameters” Query Parameters Parameter Type Description phoneNumber string The phone number. If specified, messages are returned for this particular phone number only direction 'Inbound' | 'Outbound' The direction for the resulting messages. If not specified, both inbound and outbound messages are returned. Multiple values are accepted CONFIDENTIAL 91 Rev.1.0.16.a.[79434afda268+] Messaging Parameter Type Description messageType 'Fax' | 'SMS' | 'VoiceMail' The type of the resulting messages. If not specified, | 'Pager' | 'Text' all messages without message type filtering are returned. Multiple values are accepted readStatus 'Read' | 'Unread' The read status for the resulting messages. Multiple values are accepted dateTo datetime Specifies the ending timestamp for the resulting messages. Default: current time dateFrom datetime The start timestamp for the resulting messages. Default value is equal to dateFrom minus 1 week conversationId integer Specifies the conversation identifier for the resulting messages availability 'Alive' | 'Deleted' | 'Purged' Specifies the availability status for the resulting messages. Default value is 'Alive'. Multiple values are accepted page, perPage integer Standard paging parameters, see the section called “Common Query Parameters in Collection Resources” Request Body None Response Body Property records Type Description Collection [Message Info [86]] List of records with message details Standard collection metadata, see the section called “Common Collection Properties” paging, navigation Example Request example GET /restapi/v1.0/account/~/extension/~/message-store HTTP/1.1 Accept: application/json Authorization: Bearer U1BCMDFUMDRKV1MwMXwVVOaPwPu88hVU5oR0u-FQFVTmhA Response example HTTP/1.1 200 OK Content-Type: application/json { "uri" : ".../account/1346632010/extension/1346632010/message-store? availability=Alive&page=1&perPage=100", "records" : [ { "uri" : ".../account/1346632010/extension/1346632010/message-store/315433012010", "id" : 315433012010, CONFIDENTIAL 92 Rev.1.0.16.a.[79434afda268+] Messaging "to" : [ { "phoneNumber" : "18559100010" } ], "from" : { "phoneNumber" : "16509101086" }, "type" : "SMS", "creationTime" : "2012-09-13T14:46:37.000Z", "readStatus" : "Unread", "priority" : "Normal", "attachments" : [ { "id" : 1, "uri" : ".../account/1346632010/extension/1346632010/message-store/315433012010/ content/1", "type": "Text", "contentType" : "text/plain" } ], "direction" : "Inbound", "availability" : "Alive", "subject" : "This is a sample message", "messageStatus" : "Received", "conversationId" : 141549019326272744, "lastModifiedTime" : "2012-09-13T14:46:37.000Z" }, { "uri" : ".../account/1346632010/extension/1346632010/message-store/315432888010", "id" : 315432888010, "to" : [ { "phoneNumber" : "18559100010" } ], "from" : { "phoneNumber" : "16509101086" }, "type" : "VoiceMail", "creationTime" : "2012-09-13T14:44:27.000Z", "readStatus" : "Unread", "priority" : "Normal", "attachments" : [ { "id" : 1, "uri" : ".../account/1346632010/extension/1346632010/message-store/315432888010/ content/1", "type": "AudioRecording", "contentType" : "audio/x-wav", "vmDuration" : 25 } ], "direction" : "Inbound", "availability" : "Alive", "messageStatus" : "Received", "lastModifiedTime" : "2012-09-13T14:44:27.000Z", "vmTranscriptionStatus" : "NotAvailable" }], "paging": { "page": 1, "totalPages": 1, "perPage": 100, "totalElements": 2, "pageStart": 0, "pageEnd": 1 }, "navigation": { "firstPage": {"uri": ".../account/1346632010/extension/1346632010/message-store? availability=Alive&page=1&perPage=100"}, "lastPage": {"uri": ".../account/1346632010/extension/1346632010/message-store? availability=Alive&page=1&perPage=100"} } } Update Message Since 1.0.2 Updates an individual message or several messages. Currently, updating only the message read status is supported. CONFIDENTIAL 93 Rev.1.0.16.a.[79434afda268+] Messaging Note If the status of the updating message is 'Purged', then 404 Not Found error code is returned. In case of incorrect request 400 Bad Request error code is returned. Method/URI PUT /restapi/v1.0/account/{accountId}/extension/{extensionId}/message-store/ {messageId(s)} Batch request is supported, see Batch Requests for details. Usage Plan Group Medium Path Parameters Parameter Type Batch support Description accountId, extensionId integer no See the section called “Generic Path Parameters” messageId integer yes Internal identifier of a message Request Body Parameter readStatus Type Description 'Read' | 'Unread' Read status of a message to be changed. Multiple values are accepted Response Body Message Info [86] with the updated read status. Example Request example PUT /restapi/v1.0/account/1346632010/extension/1346632010/message-store/315433012010 HTTP/1.1 Authorization: Bearer U1BCMDFUMDRKV1MwMXwVVOaPwPu88hVU5oR0u-FQFVTmhA Content-Type: application/json {"readStatus": "Read"} Response example HTTP/1.1 200 OK Content-Type: application/json CONFIDENTIAL 94 Rev.1.0.16.a.[79434afda268+] Messaging { "uri" : ".../account/1346632010/extension/1346632010/message-store/1346632010/messagestore/315433012010", "id" : 315433012010, "to" : [ { "phoneNumber" : "18559100010" } ], "from" : { "phoneNumber" : "16509101086" }, "type" : "SMS", "creationTime" : "2012-09-13T14:46:37.000Z", "readStatus" : "Read", "priority" : "Normal", "attachments" : [ { "id" : 1, "uri" : ".../account/1346632010/extension/1346632010/message-store/1346632010/messagestore/315433012010/content/1", "type" : "Text", "contentType" : "text/plain" } ], "direction" : "Inbound", "availability" : "Alive", "subject" : "This is a sample message", "messageStatus" : "Received", "conversationId" : 141549019326272744, "lastModifiedTime" : "2012-09-13T15:14:46.000Z" } Delete Message Since 1.0.2 Deletes an individual message or several messages by the given message IDs. Method/URI DELETE /restapi/v1.0/account/{accountId}/extension/{extensionId}/message-store/ {messageId(s)} Batch request is supported, see Batch Requests for details. Usage Plan Group Medium Path Parameters Parameter Type Batch support Description accountId, extensionId integer no See the section called “Generic Path Parameters” messageId integer yes Internal identifier of a message Request Body None CONFIDENTIAL 95 Rev.1.0.16.a.[79434afda268+] Messaging Response Body None Example Request example DELETE /restapi/v1.0/account/1346632010/extension/1346632010/message-store/315433012010 HTTP/1.1 Authorization: Bearer U1BCMDFUMDRKV1MwMXwVVOaPwPu88hVU5oR0u-FQFVTmhA Response example HTTP/1.1 204 No Content Delete Messages in a Thread Since 1.0.2 Deletes the entire message thread by the conversationId assigned to this message thread. It is possible to delete only one thread by one request, batch request is not supported. Method/URI DELETE /restapi/v1.0/account/{accountId}/extension/{extensionId}/message-store/ {conversationId} Usage Plan Group Medium Path Parameters Parameter Type Description accountId, extensionId string See the section called “Generic Path Parameters” conversationId integer Internal identifier of a message Request Body None Response Body None CONFIDENTIAL 96 Rev.1.0.16.a.[79434afda268+] Messaging Example Request example DELETE /restapi/v1.0/account/1346632010/extension/1346632010/message-store/141549019326272744 HTTP/1.1 Authorization: Bearer U1BCMDFUMDRKV1MwMXwVVOaPwPu88hVU5oR0u-FQFVTmhA Response example HTTP/1.1 204 No Content Get Message Attachment Data Since 1.0.4 (Release 5.13) Returns particular message attachment data as a media stream. Method/URI GET /restapi/v1.0/account/{accountId}/extension/{extensionId}/message-store/ {messageId}/content/{attachmentId} Usage Plan Group Medium Path Parameters Parameter Type Description accountId, extensionId integer See the section called “Generic Path Parameters” messageId integer Internal identifier of a message attachmentId integer Internal identifier of a message attachment Request Body None Response Body The content of a message. For SMS messages the content is returned in .txt format with UTF-8 charset. For Fax messages the content is returned in TIFF (outcoming/incoming faxes) or PDF (incoming faxes) Example Request example CONFIDENTIAL 97 Rev.1.0.16.a.[79434afda268+] Messaging 1. GET /restapi/v1.0/account/1346632010/extension/1346632010/message-store/313600045010/content/1 HTTP/1.1 Authorization: Bearer U1BCMDFUMDRKV1MwMXwVVOaPwPu88hVU5oR0u-FQFVTmhA 2. GET /restapi/v1.0/account/~/extension/~/message-store/402373285008/content/1 HTTP/1.1 Authorization: Bearer U0pDMDFQMDFQV1MwM3w7y3hoN4VOvT1Vat2crMSnYJE6Sw Response example 1. HTTP/1.1 200 OK Content-Type: text/plain;charset=utf-8 Test message from Platform server 2. HTTP/1.1 200 OK Content-Type: image/tiff Content-Disposition: inline;filename=402373285008.tiff <...binary...> Create SMS Message Since 1.0.2 Creates and sends new SMS message. Method/URI POST /restapi/v1.0/account/{accountId}/extension/{extensionId}/sms Usage Plan Group Medium Path Parameters Parameter accountId, extensionId Type Description integer See the section called “Generic Path Parameters” Request Body Parameter Type Description from Caller Info Sender of SMS message. The phoneNumber property must be filled to correspond to one of the account phone numbers which is allowed for given extension to send SMS from to Caller Info Receiver of SMS message. phoneNumber property must be filled CONFIDENTIAL 98 Rev.1.0.16.a.[79434afda268+] Messaging Parameter text Type Description string Text of SMS message (max 160 characters) Response Body Message Info [86] of the newly created and sent message. Example Request example POST /restapi/v1.0/account/~/extension/~/sms HTTP/1.1 Accept: application/json Authorization: Bearer U1BCMDFUMDRKV1MwMXwVVOaPwPu88hVU5oR0u-FQFVTmhA Content-Type: application/json { "to": [{"phoneNumber": "18551003738"}], "from": {"phoneNumber": "18559100010}"}, "text": "Test SMS message from Platform server" } Response example HTTP/1.1 200 OK Content-Type: application/json { "uri" : ".../account/1346632010/extension/1346632010/message-store/315450330010", "id" : 315450330010, "to" : [ { "phoneNumber" : "18551003738" } ], "from" : { "phoneNumber" : "18559100010" }, "type" : "SMS", "creationTime" : "2012-09-13T15:21:08.000Z", "readStatus" : "Unread", "priority" : "Normal", "attachments" : [ { "id" : 1, "uri" : ".../account/1346632010/extension/1346632010/message-store/315450330010/ content/1", "contentType" : "text/plain" } ], "direction" : "Outbound", "availability" : "Alive", "subject" : "Test SMS message from Platform server", "messageStatus" : "Sent", "conversationId" : 4481650717038104652, "lastModifiedTime" : "2012-09-13T15:21:09.000Z" } Create Fax Message Since 1.0.2 Creates and sends new fax message. CONFIDENTIAL 99 Rev.1.0.16.a.[79434afda268+] Messaging Method/URI POST /restapi/v1.0/account/{accountId}/extension/{extensionId}/fax Usage Plan Group Heavy Path Parameters Parameter accountId, extensionId Type Description integer See the section called “Generic Path Parameters” Request Body Parameter Type Description to Caller Info Recipient information. Phone number property is mandatory resolution 'High' | 'Low' Fax resolution sendTime datetime Optional. Timestamp to send fax at. If not specified (current or the past), the fax is sent immediately coverIndex integer (0-16) Optional. Cover page index. If not specified, the default cover page which is configured in "Outbound Fax Settings" is attached. See also "Available Cover Pages" table below coverPageText string Optional. Cover page text, entered by the fax sender and printed on the cover page. Maximum length is limited to 1024 symbols Available Cover Pages Cover Index Value Description 0 "None", the cover page is not attached 1 "Ancient" cover page template is attached 2 "Birthday" cover page template is attached 3 "Blank" cover page template is attached 4 "Clasmod" cover page template is attached 5 "Classic" cover page template is attached 6 "Confidential" cover page template is attached 7 "Contempo" cover page template is attached 8 "Elegant" cover page template is attached 9 "Express" cover page template is attached 10 "Formal" cover page template is attached CONFIDENTIAL 100 Rev.1.0.16.a.[79434afda268+] Messaging Cover Index Value Description 11 "Jazzy" cover page template is attached 12 "Modern" cover page template is attached 13 "Urgent" cover page template is attached Response Body Message Info [86] of the created fax message with the filled fax-specific fields. Example Request example 1: Passing attachments in a fax by specifying Content-Type of fax attachments as MIME type (see Fax Attachments. MIME Types for details) POST /restapi/v1.0/account/~/extension/~/fax HTTP/1.1 Content-Type: multipart/mixed; boundary=Boundary_1_14413901_1361871080888 Content-Length: ACTUAL_CONTENT_LENGTH_HERE --Boundary_1_14413901_1361871080888 Content-Type: application/json {"to":[{"phoneNumber":"18005630003"}], "faxResolution":"High", "sendTime":"2013-02-26T09:31:20.882Z"} --Boundary_1_14413901_1361871080888 Content-Type: text/plain Hello, World! --Boundary_1_14413901_1361871080888-- Request example 2: Passing attachments in a fax by specifying Content-Type of fax attachments as MIME type (see Fax Attachments. MIME Types for details) and a filename in Content-Disposition header. POST /restapi/v1.0/account/~/extension/~/fax HTTP/1.1 Content-Type: multipart/mixed; boundary=Boundary_1_14413901_1361871080888 Content-Length: ACTUAL_CONTENT_LENGTH_HERE --Boundary_1_14413901_1361871080888 Content-Type: application/json {"to":[{"phoneNumber":"18005630003"}], "faxResolution":"High", "sendTime":"2013-02-26T09:31:20.882Z"} --Boundary_1_14413901_1361871080888 Content-Type: text/plain Content-Disposition: attachment; filename="fax.txt" Hello, World! --Boundary_1_14413901_1361871080888-- Request example 3: Passing attachments in a fax by specifying Content-Type "application/octet-stream" and a filename in Content-Disposition header. POST /restapi/v1.0/account/~/extension/~/fax HTTP/1.1 Content-Type: multipart/mixed; boundary=Boundary_1_14413901_1361871080888 CONFIDENTIAL 101 Rev.1.0.16.a.[79434afda268+] Messaging Content-Length: ACTUAL_CONTENT_LENGTH_HERE --Boundary_1_14413901_1361871080888 Content-Type: application/json {"to":[{"phoneNumber":"18005630003"}], "faxResolution":"High", "sendTime":"2013-02-26T09:31:20.882Z"} --Boundary_1_14413901_1361871080888 Content-Type: application/octet-stream Content-Disposition: attachment; filename="fax.txt" Hello, World! --Boundary_1_14413901_1361871080888-- Response example HTTP/1.1 200 OK Content-Type: application/json { "uri": ".../restapi/v1.0/account/284818008/extension/284822008/message-store/3291869008", "id": 3291869008, "to": [{"phoneNumber": "18005630003"}], "type": "Fax", "creationTime": "2013-02-26T08:38:45.000Z", "readStatus": "Unread", "priority": "Normal", "attachments": [ { "id": 1, "uri": ".../restapi/v1.0/account/284818008/extension/284822008/message-store/3291869008/ content/1", "contentType": "image/tiff" }], "direction": "Outbound", "availability": "Alive", "messageStatus": "Queued", "faxResolution": "High", "faxPageCount": 0, "lastModifiedTime": "2013-02-26T08:38:45.000Z" } Create Pager Message Since 1.0.2 Creates and sends new pager message. Method/URI POST /restapi/v1.0/account/{accountId}/extension/{extensionId}/company-pager Usage Plan Group Medium Path Parameters Parameter accountId, extensionId CONFIDENTIAL Type Description integer See the section called “Generic Path Parameters” 102 Rev.1.0.16.a.[79434afda268+] Messaging Request Body Parameter Type Description from Caller Info Sender of pager message. The extensionNumber property must be filled replyOn integer Optional. ID of a message this message replies to text string Text of pager message to Caller Info Receiver of pager message. The extensionNumber property must be filled Response Body Message Info [86] of the created pager message. Error Codes Logical Error Code HTTP Status Code Possible Reason FeatureNotAvailable 403 Forbidden This extension/account does not support pager messages InvalidContent 400 Bad Request The content is invalid. For example, the pager message exceeds the length limit (160 symbols) InvalidParameter 400 Bad Request One or many request parameters are invalid, refer to parameterName field in response OldThreadReply 403 Forbidden Reply is forbidden for old message threads OutOfThreadReply 403 Forbidden Reply is denied for user, who is no longer a thread participant RejectedByRecipient 400 Bad Request This extension/account does not support pager messages, or it is Disabled. Example Request example POST /restapi/v1.0/account/~/extension/~/company-pager HTTP/1.1 Accept: application/json Authorization: Bearer U1BCMDFUMDRKV1MwMXzidVlSWLyuMeJ1WV-VfMBf4nVZWg Content-Type: application/json { "to": [{"extensionNumber": "102"}, {"extensionNumber": "103"} ], "from": {"extensionNumber": "101"}, "text": "Hello!" } Response example HTTP/1.1 200 OK CONFIDENTIAL 103 Rev.1.0.16.a.[79434afda268+] Messaging Content-Type: application/json { "uri" : ".../account/1346632010/extension/1346632010/message-store/315458412010", "id" : 315458412010, "to" : [ {"extensionNumber" : "102"}, {"extensionNumber" : "103"} ], "from" : { "extensionNumber" : "101" }, "type" : "Pager", "creationTime" : "2012-09-13T16:03:04.000Z", "readStatus" : "Unread", "priority" : "Normal", "attachments" : [ { "id" : 1, "uri" : ".../account/1346632010/extension/1346632010/message-store/315458412010/ content/1", "contentType" : "text/plain" } ], "direction" : "Outbound", "availability" : "Alive", "subject" : "Hello!", "messageStatus" : "Sent", "conversationId" : 315458412010, "lastModifiedTime" : "2012-09-13T16:03:04.000Z" } CONFIDENTIAL 104 Rev.1.0.16.a.[79434afda268+] Chapter 16. RingOut The RingOut option enables users to make a call from any other outside number (not a RingCentral number) by means of their RingCentral account, when it is not convenient for them to use the RingCentral number. This feature is available for softphone, web and mobile applications. The RingCentral API allows to make and get RingOut calls. Make RingOut Call Since 1.0.7 (Release 5.16) Makes a 2-leg RingOut call. Method/URI POST /restapi/v1.0/account/{accountId}/extension/{extensionId}/ringout Usage Plan Group Heavy Path Parameters Parameter Type integer accountId, extensionId Description See the section called “Generic Path Parameters” Request Body Parameter Type Description from Caller Info (only phoneNumber element is supported) Phone number of the caller. This number corresponds to the 1st leg of the RingOut call. This number can be one of user's configured forwarding numbers or arbitrary number. Required to Caller Info (only phoneNumber element is supported) Phone number of the called party. This number corresponds to the 2nd leg of the RingOut call. Required callerId Caller Info (only phoneNumber element is supported) The number which will be displayed to the called party. Optional playPrompt True | False The audio prompt that the calling party hears when the call is connected. Optional Response Body Parameter Type Description id string Internal identifier of a RingOut call status RingOut Status Info [106] RingOut status information CONFIDENTIAL 105 Rev.1.0.16.a.[79434afda268+] RingOut RingOut Status Info Parameter Type Description callStatus string Status of a call callerStatus string Status of a calling party calleeStatus string Status of a called party Call Status Parameter Description Invalid Invalid call status Success Call is connected InProgress Connection is in progress Busy Call failed NoAnswer Call failed Rejected Call failed GenericError Call failed Finished Call is completed InternationalDisabled International calls are disabled DestinationBlocked Destination number is prohibited NotEnoughFunds Low balance on account NoSuchUser Call failed Request example Example Request example POST /restapi/v1.0/account/~/extension/~/ringout HTTP/1.1 Authorization: Bearer UExBMDFUMDRQV1MwMnzeaX-Y1k77JspRU1uvPvfyj8Faaw Content-Type: application/json { "from": {"phoneNumber": "12053320032"}, "to": {"phoneNumber": "12052160005"}, "callerId": {"phoneNumber": "12053320032"}, "playPrompt": true } Response example HTTP/1.1 200 OK Content-Type: application/json { "uri" : "https.../restapi/v1.0/account/400162076008/extension/400162076008/ringout/1", "id" : 1, "status" : { "callStatus" : "InProgress", "callerStatus" : "InProgress", CONFIDENTIAL 106 Rev.1.0.16.a.[79434afda268+] RingOut "calleeStatus" : "InProgress" } } Get Status of RingOut Call Since 1.0.7 (Release 5.16) Returns the status of a 2-leg RingOut call. Method/URI GET /restapi/v1.0/account/{accountId}/extension/{extensionId}/ringout/{ringoutId} Usage Plan Group Light Path Parameters Parameter Type Description accountId, extensionId integer See the section called “Generic Path Parameters” ringoutId string Internal identifier of a RingOut call Request Body None Response Body Parameter Type Description id string Internal identifier of a RingOut call status RingOut Status Info [106] RingOut status information Example Request example GET /restapi/v1.0/account/~/extension/~/ringout/2 HTTP/1.1 Accept: application/json Authorization: Bearer U0pDMDFQMDFQV1MwM3zcKcfZlnowKxw6lxYDv9mfS1b6eQ Response example HTTP/1.1 200 OK Content-Type: application/json { CONFIDENTIAL 107 Rev.1.0.16.a.[79434afda268+] RingOut "uri" : "https:.../restapi/v1.0/account/400162076008/extension/400162076009/ringout/2", "id" : 2, "status" : { "callStatus" : "Success", "callerStatus" : "Success", "calleeStatus" : "Success" } } Cancel RingOut Call Since 1.0.7 (Release 5.16) Cancels the 2-leg RingOut call. Method/URI DELETE {ringoutId} /restapi/v1.0/account/{accountId}/extension/{extensionId}/ringout/ Usage Plan Group Heavy Path Parameters Parameter Type Description accountId, extensionId integer See the section called “Generic Path Parameters” ringoutId string Internal identifier of a RingOut call Request Body None Response Body None Example Request example DELETE /restapi/v1.0/account/~/extension/~/ringout/44 HTTP/1.1 Accept: application/json Authorization: Bearer U0pDMDFQMDFQV1MwM3ynkntrtBfuwxg4QnTdVPcFSUL_Fi Response example HTTP/1.1 204 No Content CONFIDENTIAL 108 Rev.1.0.16.a.[79434afda268+] Chapter 17. Presence Get Extension Presence Status Since 1.0.2 Returns the extension presence status. The presenceStatus is returned as Offline (the parameters telephonyStatus, message, userStatus and dndStatus are not returned at all) for the following extension types: Department/Announcement Only/Take Messages Only (Voicemail)/Fax User/Paging Only Group/Shared Lines Group/IVR Menu/ Application Extension. If the user requests his/her own presence status, the response contains actual presence status even if the status publication is turned off. Important For batch requests the number of extensions in one request is limited to 30. If more extensions are included in the request, the error code 400 Bad Request is returned with the logical error code InvalidMultipartRequest and the corresponding message "Extension Presence Info multipart request is limited to 30 extensions". Method/URI GET /restapi/v1.0/account/{accountId}/extension/{extensionId(s)}/presence Batch request is supported, see Batch Requests for details. Usage Plan Group Light Required Permissions Permission ReadPresence Description Getting user presence information Path Parameters Parameter Type Batch support Description accountId string no See Generic Path Parameters extensionId string yes See Generic Path Parameters Request Body None CONFIDENTIAL 109 Rev.1.0.16.a.[79434afda268+] Presence Response Body Presence Info Property Type Description Standard resource property canonical URI, see Resource Identification Properties uri presenceStatus 'Offline' | 'Busy' | 'Available' Aggregated presence status, calculated from a number of sources telephonyStatus 'NoCall' | 'CallConnected' | 'Ringing' | 'OnHold' Telephony presence status extension Extension Info (short) [67] Information on extension, for which this presence data is returned userStatus 'Offline' | 'Busy' | 'Available' User-defined presence status (as previously published by the user) dndStatus 'TakeAllCalls'| 'DoNotAcceptAnyCalls'| 'DoNotAcceptDepartmentCalls'| 'TakeDepartmentCallsOnly' Extended DnD (Do not Disturb) status. Cannot be set for Department/Announcement/ Voicemail (Take Messages Only)/Fax User/Shared Lines Group/Paging Only Group/ IVR Menu/Application Extension extensions. The 'DoNotAcceptDepartmentCalls' and 'TakeDepartmentCallsOnly' values are applicable only for extensions - members of a Department; if these values are set for department outsiders, the 400 Bad Request error code is returned. The 'TakeDepartmentCallsOnly' status can be set through the old RingCentral user interface and is available for some migrated accounts only. message string Custom status message (as previously published by user) allowSeeMyPresence 'True' | 'False' If "True" enables other extensions to see the extension presence status ringOnMonitoredCall 'True' | 'False' If "True" enables to ring extension phone, if any user monitored by this extension is ringing CONFIDENTIAL 110 Rev.1.0.16.a.[79434afda268+] Presence Property pickUpCallsOnHold Type Description 'True' | 'False' If "True" enables the extension user to pick up a monitored line on hold Telephony Status Values Value Description NoCall The call is disconnected CallConnected Telephony connection has been established and the call is active Ringing Telephony connection is being established, destination phone is ringing, and source phone receives long tones OnHold The call is put on hold Example Request example GET /restapi/v1.0/account/400792315004/extension/400792315004/presence HTTP/1.1 Authorization: Bearer U1BCMDFUMDRKV1MwMXwpWCipXIQTrClYKKwK5DkfKVgorg Accept: application/json Response example HTTP/1.1 200 OK Content-Type: application/json Content-Length: 530 { "uri" : "https.../restapi/v1.0/account/400792315004/extension/400792315004/presence", "extension" : { "uri" : "https.../restapi/v1.0/account/400792315004/extension/400792315004", "id" : 400792315004, "extensionNumber" : "101" }, "presenceStatus" : "Available", "telephonyStatus" : "NoCall", "userStatus" : "Available", "dndStatus" : "TakeAllCalls", "message" : "Hello, World", "allowSeeMyPresence" : true, "ringOnMonitoredCall" : false, "pickUpCallsOnHold" : false } CONFIDENTIAL 111 Rev.1.0.16.a.[79434afda268+] Chapter 18. Notifications: Subscription API Create Subscription Since 1.0.6 (Release 5.15) Creates a new subscription. Note To call this method with APNS transport type you have to specify endpoint_id attribute in get token request at authorization. Method/URI POST /restapi/v1.0/subscription Usage Plan Group Medium Request Body Parameter Type Description eventFilters string Mandatory. Collection of URIs to API resources (see Event Types for details). For APNS transport type only message event filter is available deliveryMode Collection of parameters Notification delivery settings transportType 'PubNub' | 'APNS' Notifications transportation provider name. 'APNS' (Apple Push Notifications Service) encryption 'True' | 'False' Optional parameter. Specifies if the message will be encrypted or not. If request contains any presence event filter the value by default is 'true' (even if specified as 'false'). If request contains only message event filters the value by default is 'false' Response Body Subscription Info Parameter Type Description id, uri string Standard resource properties, see the section called “Resource Identification Properties” eventFilters string Collection of URIs to API resources (message-store/presence/detailed presence) CONFIDENTIAL 112 Rev.1.0.16.a.[79434afda268+] Notifications: Subscription API Parameter Type Description expirationTime datetime Subscription expiration time expiresIn integer Subscription lifetime in seconds. The default value is 900 status 'Active' | 'Suspended' Subscription status creationTime datetime Subscription creation time deliveryMode Collection of parameters Delivery mode data transportType 'PubNub' | 'APNS' Notifications transportation provider name. 'APNS' (Apple Push Notifications Service) encryption 'True' | 'False' Optional parameter. Specifies if the message will be encrypted or not. For APNS transport type the value is always "false" address string PubNub channel name. For APNS transport type - internal identifier of a device "device_token" subscriberKey string PubNub subscriber credentials required to subscribe to the channel secretKey string PubNub subscriber credentials required to subscribe to the channel. Optional (for PubNub transport type only) encryptionAlgorithm string Encryption algorithm 'AES' (for PubNub transport type only) encryptionKey string Key for notification message decryption (for PubNub transport type only) Error Codes HTTP Status Code 403 Forbidden Error Code Reason/Message 1. If all eventFilters specified in request are unavailable for the current extension, the server responds with this error code and an optional note in the message field of response payload. The filters can be unavailable due to the following reasons: 1.1 Presence event filter: "Presence" feature is turned off for account or is disabled for the current extension type 1.2 Presence event filter: the user disallowed to monitor his/her presence 1.3 Detailed presence event filter: the user disallowed this subscriber to pick up his/her calls 2. If the number of subscriptions exceeds the limit, the server returns this code with the error message: "Current limit {number of subscriptions} subscriptions was exceeded for extension {ext. number} applicationId {app ID}." The CONFIDENTIAL 113 Rev.1.0.16.a.[79434afda268+] Notifications: Subscription API HTTP Status Code Error Code Reason/Message maximum number of subscriptions is limited to 20 for each user extension on a particular application. If you, for example, login to the same extension from two different applications, you can create maximum 40 subscriptions for this extension (20 on each application) 400 Bad Request InvalidParameter If any attributes passed in the request are incorrect, the server 403 Forbidden SUB-401 No Presence on account 403 Forbidden SUB-402 No Presence on extension 403 Forbidden SUB-403 Presence monitoring is disallowed 403 Forbidden SUB-404 Presence pick-up is disallowed 403 Forbidden SUB-405 Not allowed to subscribe for notifications on another extension 403 Forbidden SUB-406 Not allowed to subscribe for notifications on another account 403 Forbidden SUB-407 Not allowed to deal with APNS subscription if endpoint ID is not provided in get token request at authorization 403 Forbidden SUB-408 Not allowed subscribe for unknown user. Implement SIP registration by calling /sip-provision method responds with this error code, and an optional note in the message field describing what is wrong. For example, if the eventFilters parameter value is empty, then the following error message is returned: "Parameter [eventFilters] is invalid [Does not specified]" Note If an event filter is duplicated then only one instance of it will be kept for that subscription. Therefore, the client will always get only a single notification per subscription per event if the subscription conforms to the event. Example 1 PubNub Transport Type Request example POST /restapi/v1.0/subscription HTTP/1.1 Accept: application/json Authorization: Bearer U0pDMDFQMDFQQVMwMnxBQUFWZmY4ZXoxMlhvUFI5dmh Content-Type: application/json Content-Length: 424 { "eventFilters": [ "/restapi/v1.0/account/~/extension/~/presence?detailedTelephonyState=true" ], "deliveryMode": { "transportType": "PubNub", "encryption": "false" } } Response example CONFIDENTIAL 114 Rev.1.0.16.a.[79434afda268+] Notifications: Subscription API HTTP/1.1 200 OK Content-Type: application/json Content-Length: 760 { "id" : "60ce3d67-9104-478c-bcb3-768d93c0151c", "creationTime" : "2014-08-20T06:07:04.614Z", "status" : "Active", "uri" : "https.../restapi/v1.0/subscription/60ce3d67-9104-478c-bcb3-768d93c0151c", "eventFilters" : [ "/restapi/v1.0/account/~/extension/400700290004/presence? detailedTelephonyState=true" ], "expirationTime" : "2014-08-20T06:22:04.614Z", "expiresIn" : 899, "deliveryMode" : { "transportType" : "PubNub", "encryption" : true, "address" : "410843294189492_7777a1d1", "subscriberKey" : "sub-c-b8b9cd8c-e906-11e2-b383-02ee2ddab7fe", "secretKey" : "sec-c-ZDNlYjY0OWMtMWFmOC00OTg2LWJjMTMtYjBkMzgzOWRmM", "encryptionAlgorithm" : "AES", "encryptionKey" : "/boiP9IObgz6mrDalnl5lA==" } } Example 2 APNS Transport Type Request example POST /restapi/v1.0/subscription HTTP/1.1 Accept: application/json Authorization: Bearer U0pDMDFQMDFQQVMwMXxBQURIZjAzWFFySGpMen Content-Type: application/json Content-Length: 240 { "eventFilters": [ "/restapi/v1.0/account/~/extension/~/message-store?direction=Inbound" ], "deliveryMode": { "transportType": "APNS", "address": "kdttV0We6coOSKcuCxJx5lyy4Srz5TpEG8JisLu+uB4=", "encryption": "false" } } Response example HTTP/1.1 200 OK Content-Language: en-US Content-Type: application/json; charset=UTF-8 Content-Length: 605 { "id" : "apns6B6474745630576536636F4F534B637543784A78356C79793453727A3554704547384A69734C752B7542343D", "creationTime" : "2015-03-18T09:23:10.025Z", "status" : "Active", "uri" : "https.../restapi/v1.0/subscription/ apns6B6474745630576536636F4F534B637543784A78356C79793453727A3554704547384A69734C752B7542343D", "eventFilters" : [ "/restapi/v1.0/account/2740078004/extension/2740078004/message-store? direction=Inbound" ], "deliveryMode" : { "transportType" : "APNS", "encryption" : false, "address" : "kdttV0We6coOSKcuCxJx5lyy4Srz5TpEG8JisLu+uB4=" } } CONFIDENTIAL 115 Rev.1.0.16.a.[79434afda268+] Notifications: Subscription API Get Subscription Since 1.0.6 (Release 5.15) Returns the requested subscription. Method/URI GET /restapi/v1.0/subscription/{subscriptionId} Usage Plan Group Light Path Parameters Parameter subscriptionId Type Description string Internal identifier of a subscription Request Body None Response Body Subscription Info [112] Error Codes HTTP Status Code Logical Error Code Possible Reason If the subscriptionId value is incorrect this error code is returned 404 Not Found Example Request example GET /restapi/v1.0/subscription/60ce3d67-9104-478c-bcb3-768d93c0151c HTTP/1.1 Authorization: Bearer U0pDMDFQMDFQQVMwMnxBQUFWZmY4ZXoxMlhvUFI5dmhYVzVsb1h5SnVT Accept: application/json Response example HTTP/1.1 200 OK Content-Type: application/json Content-Length: 760 { "id" : "60ce3d67-9104-478c-bcb3-768d93c0151c", "creationTime" : "2014-08-20T06:07:04.614Z", "status" : "Active", "uri" : "https.../restapi/v1.0/subscription/60ce3d67-9104-478c-bcb3-768d93c0151c", "eventFilters" : [ "/restapi/v1.0/account/~/extension/400700290004/presence? detailedTelephonyState=true" ], CONFIDENTIAL 116 Rev.1.0.16.a.[79434afda268+] Notifications: Subscription API "expirationTime" : "2014-08-20T06:22:04.614Z", "expiresIn" : 687, "deliveryMode" : { "transportType" : "PubNub", "encryption" : true, "address" : "410843294189492_7777a1d1", "subscriberKey" : "sub-c-b8b9cd8c-e906-11e2-b383-02ee2ddab7fe", "secretKey" : "sec-c-ZDNlYjY0OWMtMWFmOC00OTg2LWJjMTMtYjBkMzgzOWRmMzUz", "encryptionAlgorithm" : "AES", "encryptionKey" : "/boiP9IObgz6mrDalnl5lA==" } } Renew Subscription Since 1.0.6 (Release 5.15) Renews the existent subscription. Method/URI PUT /restapi/v1.0/subscription/{subscriptionId} Usage Plan Group Medium Path Parameters Parameter subscriptionId Type string Description Internal identifier of a subscription Request Body Current eventFilters (as in POST/restapi/v1.0/subscription request) or empty body Response Body Subscription Info [112] Example Request example PUT /restapi/v1.0/subscription/60ce3d67-9104-478c-bcb3-768d93c0151c HTTP/1.1 Accept: application/json Authorization: Bearer U0pDMDFQMDFQQVMwMnxBQUFWZmY4ZXoxMlhvUFI5dmhYVzVsb Content-Type: application/json Content-Length: 3 {} Response example HTTP/1.1 200 OK Content-Type: application/json Content-Length: 760 { CONFIDENTIAL 117 Rev.1.0.16.a.[79434afda268+] Notifications: Subscription API "id" : "60ce3d67-9104-478c-bcb3-768d93c0151c", "creationTime" : "2014-08-20T06:07:04.614Z", "status" : "Active", "uri" : "https.../restapi/v1.0/subscription/60ce3d67-9104-478c-bcb3-768d93c0151c", "eventFilters" : [ "/restapi/v1.0/account/~/extension/400700290004/presence? detailedTelephonyState=true" ], "expirationTime" : "2014-08-20T06:35:30.701Z", "expiresIn" : 899, "deliveryMode" : { "transportType" : "PubNub", "encryption" : true, "address" : "410843294189492_7777a1d1", "subscriberKey" : "sub-c-b8b9cd8c-e906-11e2-b383-02ee2ddab7fe", "secretKey" : "sec-c-ZDNlYjY0OWMtMWFmOC00OTg2LWJjMTMtYjBkMzgzOWRmMzUz", "encryptionAlgorithm" : "AES", "encryptionKey" : "/boiP9IObgz6mrDalnl5lA==" } } Modify Event Filters Since 1.0.6 (Release 5.15) Modifies the event filters for the existing subscription. The client application can extend or narrow the events for which it receives notifications in the frame of one subscription. Method/URI PUT /restapi/v1.0/subscription/{subscriptionId} Usage Plan Group Medium Path Parameters Parameter subscriptionId Type string Description Internal identifier of a subscription Request Body Parameter eventFilters Type string Description Collection of URIs to API resources (see Event Types). Mandatory field Response Body Subscription Info [112] Note When modifying the event filters, the subscription is renewed automatically. CONFIDENTIAL 118 Rev.1.0.16.a.[79434afda268+] Notifications: Subscription API Example Request example PUT /restapi/v1.0/subscription/78c53776-6aa5-4089-b080-150089c097bf HTTP/1.1 Accept: application/json Authorization: Bearer U0pDMDFQMDFKV1MwMnxXEhpuK23FJtRSi_rafOgPSMOorQ Content-Type: application/json Content-Length: 159 { "eventFilters": [ "/restapi/v1.0/account/~/extension/~/message-store", "/restapi/v1.0/account/~/extension/~/presence" ] } Response example HTTP/1.1 200 OK Content-Type: application/json { "eventFilters" : [ "/restapi/v1.0/account/~/extension/400978708008/message-store","/restapi/ v1.0/account/~/extension/400978708008/presence" ], "expirationTime" : "2014-04-28T15:41:32.272Z", "deliveryMode" : { "transportType" : "PubNub", "encryption" : true, "address" : "3695317637993668_ac84962a", "subscriberKey" : "sub-c-b8b9cd8c-e906-11e2-b383-02ee2ddab7fe", "secretKey" : "sec-c-ZDNlYjY0OWMtMWFmOC00OTg2LWJjMTMtYjBkMzgzOWRmMzUz", "encryptionAlgorithm" : "AES", "encryptionKey" : "WchkzJuAJT9BqoDffzg2Kg==" }, "id" : "a2206de0-1eca-48be-a951-2899e89c03bf", "creationTime" : "2014-04-28T14:26:32.272Z", "status" : "Active", "uri" : "https.../restapi/v1.0/subscription/a2206de0-1eca-48be-a951-2899e89c03bf" } Cancel Subscription Cancels the existent subscription. Method/URI DELETE /restapi/v1.0/subscription/{subscriptionId} Usage Plan Group Medium Path Parameters Parameter subscriptionId CONFIDENTIAL Type string Description Internal identifier of a subscription 119 Rev.1.0.16.a.[79434afda268+] Notifications: Subscription API Request Body None Response Body None Error Codes HTTP Status Code Logical Error Code Possible Reason If the subscriptionId value is incorrect this error code is returned 404 Not Found Example Request example DELETE /restapi/v1.0/subscription/a2206de0-1eca-48be-a951-2899e89c03bf HTTP/1.1 Accept: application/json Authorization: Bearer U0pDMDFQMDFKV1MwMnxXEhpuK23FJtRSi_rafOgPSMOorQ Response example HTTP/1.1 204 No Content Notifications Event Types Notifications which the client wants to receive can be specified by the event filters, that are set in the subscription request. The event filter is exposed as a URL, pointing to the RingCentral API resource. Currently the following event types are available for notifications: messages, presence and detailed presence. They are described in detail below. Messages Event Since 1.0.6 (Release 5.15) This event filter /restapi/v1.0/account/~/extension/~/message-store specifies that notifications will be sent in case of: • new message creation; • any message change in extension message store. Note You should obtain the updated message info by calling the GET Message List method. CONFIDENTIAL 120 Rev.1.0.16.a.[79434afda268+] Notifications: Subscription API Notification Payload Structure The client receives messages notifications payload as JSON object with the following structure: Parameter Type Description uuid string Universally unique identifier of a notification event string Event filter URI body Collection of parameters Notification payload body extensionId integer Internal identifier of an extension. Optional parameter lastUpdated datetime The time the message has been last modified changes Collection of parameters Message changes type 'Voicemail' | 'SMS' | 'Fax' | 'Pager' Message type newCount integer The number of new messages. Can be omitted if the value is zero updatedCount integer The number of updated messages. Can be omitted if the value is zero Example { "timestamp": "2014-04-29T14:29:27.408+0000", "uuid": "b11c9430-9687-4498-b12b-3fcb470bfe04", "event": "/restapi/v1.0/account/~/extension/406149828004/message-store", "body": { "extensionId": 406149828004, "lastUpdated": "2014-04-29T14:29:20.531+0000", "changes": [ { "type": "Pager", "updatedCount": 1, "newCount": 0 } { "type": "SMS", "updatedCount": 0, "newCount": 1 }, {...} ], }, } Presence Event Since 1.0.6 (Release 5.15) 1. This event filter/restapi/v1.0/account/~/extension/~/presence specifies that notifications will be sent in case of any change of the following presence information: • userStatus • dndStatus CONFIDENTIAL 121 Rev.1.0.16.a.[79434afda268+] Notifications: Subscription API • message • telephonyStatus 2. This event filter /restapi/v1.0/account/~/extension/~/presence/line/presence specifies that notifications will be sent to the client in case of changes in the presence information of extensions which are monitored by the current extension. Note The modified data itself is not returned in notification payload body if DnD status, user status or message are changed. You should obtain presence info by calling the GET Extension Presence Status method. Notification Payload Structure The client receives non-detailed presence notification payload as a JSON object with the following structure: Parameter Type Description uuid string Universally unique identifier of a notification event string Event filter URI body Collection of parameters Notification payload body extensionId integer Internal identifier of an extension. Optional parameter telephonyStatus 'NoCall' | 'CallConnected' | Telephony presence status. Returned if telephony 'Ringing' | 'OnHold' status is changed. See Telephony Status Values [111] Example { "timestamp": "2014-04-29T14:28:35.996+0000", "uuid": "08174cd9-3fe1-45e1-aa23-77043164f8f9", "event": "/restapi/v1.0/account/~/extension/406149828004/presence", "body": { "extensionId": 406149828004, "telephonyStatus": "Ringing" } } Detailed Presence Event Since 1.0.6 (Release 5.15) The additional attribute for this event filter is the list of active calls for the given extension. 1. This event filter /restapi/v1.0/account/~/extension/~/presence? detailedTelephonyState=true specifies that detailed presence notifications for the requested extension will be sent to the client in case of any change of the following presence information: • userStatus CONFIDENTIAL 122 Rev.1.0.16.a.[79434afda268+] Notifications: Subscription API • dndStatus • message • telephonyStatus 2. This event filter /restapi/v1.0/account/~/extension/~/presence/line/presence? detailedTelephonyState=true specifies that detailed presence notifications will be sent to the client in case of changes in the presence information of extensions which are monitored by the current extension. Note If both presence and detailed presence event types are specified, then the detailed presence notifications will be received. Notification Payload Structure The client receives detailed presence notifications payload as a JSON object with the following structure: Parameter Type Description uuid string Universally unique identifier of a notification event string Event filter URI body Collection of parameters Notification payload body sequence integer Order number of notification to state the chronology sessionId string Internal identifier of a call session extensionId integer Internal identifier of an extension. Optional parameter telephonyStatus 'NoCall' | 'CallConnected' | 'Ringing' | 'OnHold' Aggregated telephony call status, based on the priority of active calls. See Telephony Status Values [111] activeCalls Collection of parameters Active calls for the given extension id string Internal identifier of the call from string Phone number or extension number of a caller to string Phone number or extension number of a callee direction 'Inbound' | 'Outbound' Call direction telephonyStatus 'NoCall' | 'CallConnected' | 'Ringing' | 'OnHold' Telephony call status. See Telephony Status Values [111] for detailed status description Example { "timestamp": "2014-04-29T13:23:12.468+0000", "uuid": "a295fa1f-af6a-4518-b333-acf091bdd7ea", CONFIDENTIAL 123 Rev.1.0.16.a.[79434afda268+] Notifications: Subscription API "event": "/restapi/v1.0/account/~/extension/406149828004/presence? detailedTelephonyState=true", "body": { "sequence": 3 "extensionId": 406149828004, "sessionId" : "403389471094", "telephonyStatus": "NoCall", "activeCalls": [ { "id": null, "from": "+18558689714", "to": "6316761623", "direction": "Outbound", "telephonyStatus": "NoCall" }, {...} ], }, } Presence Line Event Since 1.0.16 (Release 7.1) This event filter /restapi/v1.0/account/~/extension/~/presence/line specifies that notifications will be sent in case the list of extensions, which presence is monitored by the current extension, has changed. Notification Payload Structure The client receives detailed presence notifications payload as a JSON object with the following structure: Parameter Type Description uuid string Universally unique identifier of a notification event string Event filter URI body Collection of parameters Notification payload body extension Collection of parameters Extension information id string Internal identifier of the extension id string Internal identifier of the returned line Example { "timestamp": "2014-04-29T13:23:12.468+0000", "uuid": "a295fa1f-af6a-4518-b333-acf091bdd7ea", "event": "/restapi/v1.0/account/~/extension/406149828004/presence/line", "body": { "extension": { "id": "677628004765" }, "id": "3" }, {...} }, CONFIDENTIAL 124 Rev.1.0.16.a.[79434afda268+] Notifications: Subscription API } CONFIDENTIAL 125 Rev.1.0.16.a.[79434afda268+] Chapter 19. Dictionary This API allows to get information on all the countries and the corresponding states, provinces and counties, available for calling. Get Single Country Since 1.0.10 (Release 6.2) Returns the information on the required country. Method/URI GET /restapi/v1.0/dictionary/country/{countryId} Usage Plan Group Light Path Parameters Parameter Type Description string countryId Internal identifier of a country Request Body None Response Body Country Info Parameter Type Description Standard resource properties ID and canonical URI; see the section called “Resource Identification Properties” id, uri name string Official name of the country isoCode string Country code according to the ISO standard, see ISO 3166 [http:// en.wikipedia.org/wiki/ISO_3166] callingCode string Country calling code defined by ITU-T [http://en.wikipedia.org/ wiki/ITU-T] recommendations E.123 [http://en.wikipedia.org/wiki/ E.123] and E.164 [http://en.wikipedia.org/wiki/E.164], see Calling Codes [http://en.wikipedia.org/wiki/List_of_country_calling_codes] Example Request example GET https.../restapi/v1.0/dictionary/country/1 HTTP/1.1 Accept: application/json Authorization: Bearer UExBMDFUMDRQV1MwMXxO-FoZwFZyHYPYGNhxFhxmEzRTwg CONFIDENTIAL 126 Rev.1.0.16.a.[79434afda268+] Dictionary Response example HTTP/1.1 200 OK Content-Type: application/json { "uri" : "https.../restapi/v1.0/dictionary/country/1", "id" : "1", "name" : "United States", "isoCode" : "US", "callingCode" : "1" } Get Countries Since 1.0.10 (Release 6.2) Returns all the countries available for calling. Method/URI GET /restapi/v1.0/dictionary/country Usage Plan Group Light Query Parameters Parameter page, perPage Type Description integer Standard paging parameters, see the section called “Common Query Parameters in Collection Resources” Standard collection metadata, see the section called “Common Collection Properties” paging, navigation Request Body None Response Body Collection [Country Info [126]] Example Request example GET /restapi/v1.0/dictionary/country?page=17&perPage=3 HTTP/1.1 Accept: application/json Authorization: Bearer U0pDMDFQMDFQQVMwMXy62rmA1DFyfjMse_RdEC4Zs0mYkA Response example HTTP/1.1 200 OK CONFIDENTIAL 127 Rev.1.0.16.a.[79434afda268+] Dictionary Content-Type: application/json { "uri" : "https.../restapi/v1.0/dictionary/country?page=17&perPage=3", "records" : [ { "uri" : "https.../restapi/v1.0/dictionary/country/14", "id" : "14", "name" : "Congo, Democratic Republic", "isoCode" : "CD", "callingCode" : "243" }, { "uri" : "https.../restapi/v1.0/dictionary/country/52", "id" : "52", "name" : "Cook Islands", "isoCode" : "CK", "callingCode" : "682" }, { "uri" : "https.../restapi/v1.0/dictionary/country/53", "id" : "53", "name" : "Costa Rica", "isoCode" : "CR", "callingCode" : "506" } ], "paging" : { "page" : 17, "totalPages" : 83, "perPage" : 3, "totalElements" : 247, "pageStart" : 48, "pageEnd" : 50 }, "navigation" : { "nextPage" : { "uri" : "https.../restapi/v1.0/dictionary/country?page=18&perPage=3" }, "previousPage" : { "uri" : "https.../restapi/v1.0/dictionary/country?page=16&perPage=3" }, "firstPage" : { "uri" : "https.../restapi/v1.0/dictionary/country?page=1&perPage=3" }, "lastPage" : { "uri" : "https.../restapi/v1.0/dictionary/country?page=83&perPage=3" } } } Get Single State Since 1.0.10 (Release 6.2) Returns the information on the required state. Method/URI GET /restapi/v1.0/dictionary/state/{stateId} Usage Plan Group Light Path Parameters Parameter stateId CONFIDENTIAL Type Description string Internal identifier of a state 128 Rev.1.0.16.a.[79434afda268+] Dictionary Request Body None Response Body State Info Parameter Type Description Standard resource properties ID and canonical URI; see the section called “Resource Identification Properties” id, uri name string Official name of the state isoCode string Short code for the state (2-letter usually) country string ID and URI of the country the state is in, as a part of the Country Info [126] Example Request example GET /restapi/v1.0/dictionary/state/13 HTTP/1.1 Accept: application/json Authorization: Bearer UExBMDFUMDRQV1MwMXz4fLQaUGXzS41vGnEw43d0JVPIUw Response example HTTP/1.1 200 OK Content-Type: application/json { "uri" : "https.../restapi/v1.0/dictionary/state/13", "id" : "13", "name" : "ALASKA", "isoCode" : "AK", "country" : { "uri" : "https.../restapi/v1.0/dictionary/country/1", "id" : "1" } } Get States of a Country Since 1.0.10 (Release 6.2) Returns all the states for the certain country. Method/URI GET /restapi/v1.0/dictionary/state Usage Plan Group Light CONFIDENTIAL 129 Rev.1.0.16.a.[79434afda268+] Dictionary Query Parameters Parameter Type Description countryId string Internal identifier of a country withPhoneNumbers 'True' | 'False' If 'True', the list of states with phone numbers available for buying is returned. The default value is 'False' page, perPage integer Standard paging parameters, see the section called “Common Query Parameters in Collection Resources” Request Body None Response Body Collection [State Info [129]] Example Request example GET /restapi/v1.0/dictionary/state?countryId=39 HTTP/1.1 Accept: application/json Authorization: Bearer UExBMDFUMDRQV1MwMXz4fLQaUGXzS41vGnEw43d0JVPIUw Response example HTTP/1.1 200 OK Content-Type: application/json { "uri" : "https.../restapi/v1.0/dictionary/state?countryId=39&page=1&perPage=100", "records" : [ { "uri" : "https.../restapi/v1.0/dictionary/state/501", "id" : "501", "name" : "Alberta", "isoCode" : "AB", "country" : { "uri" : "https.../restapi/v1.0/dictionary/country/39", "id" : "39" } }, { "uri" : "https.../restapi/v1.0/dictionary/state/505", "id" : "505", "name" : "British Columbia", "isoCode" : "BC", "country" : { "uri" : "https.../restapi/v1.0/dictionary/country/39", "id" : "39" } }, { "uri" : "https.../restapi/v1.0/dictionary/state/516", "id" : "516", "name" : "Manitoba", "isoCode" : "MB", "country" : { "uri" : "https.../restapi/v1.0/dictionary/country/39", "id" : "39" } CONFIDENTIAL 130 Rev.1.0.16.a.[79434afda268+] Dictionary }, { "uri" : "https.../restapi/v1.0/dictionary/state/517", "id" : "517", "name" : "New Brunswick", "isoCode" : "NB", "country" : { "uri" : "https.../restapi/v1.0/dictionary/country/39", "id" : "39" } }, {...} ], "paging" : { "page" : 1, "totalPages" : 1, "perPage" : 100, "totalElements" : 13, "pageStart" : 0, "pageEnd" : 12 }, "navigation" : { "firstPage" : { "uri" : "https.../restapi/v1.0/dictionary/state?countryId=39&page=1&perPage=100" }, "lastPage" : { "uri" : "https.../restapi/v1.0/dictionary/state?countryId=39&page=1&perPage=100" } } } Get All Locations Since 1.0.10 (Release 6.2) Returns all the available locations for the certain state. Method/URI GET /restapi/v1.0/dictionary/location Usage Plan Group Light Query Parameters Parameter Type Description stateId string Internal identifier of a state orderBy 'Npa' | 'City' Sorts results by the specified property. The default value is 'City' page, perPage integer Standard paging parameters, see the section called “Common Query Parameters in Collection Resources” Request Body None Response Body Collection [Location Info [132]] CONFIDENTIAL 131 Rev.1.0.16.a.[79434afda268+] Dictionary Location Info Parameter Type Description Standard resource properties ID and canonical URI; see the section called “Resource Identification Properties” uri city string Official name of the city, belonging to the certain state npa string Area code of the location (3-digit usually), according to the NANP number format, that can be summarized as NPANXX-xxxx and covers Canada, the United States, parts of the Caribbean Sea, and some Atlantic and Pacific islands. See North American Numbering Plan [http://en.wikipedia.org/wiki/ North_American_Numbering_Plan] for details nxx string Central office code of the location, according to the NANP number format, that can be summarized as NPA-NXX-xxxx and covers Canada, the United States, parts of the Caribbean Sea, and some Atlantic and Pacific islands. See North American Numbering Plan [http://en.wikipedia.org/wiki/North_American_Numbering_Plan] for details state string ID and URI of the state this location belongs to, as a part of the State Info [129] Example Request example GET /restapi/v1.0/dictionary/location?stateId=516&orderBy=City HTTP/1.1 Accept: application/json Authorization: Bearer UExBMDFUMDRQV1MwMXzqYEmFlzzQ19sSTpvsRKY6RXkQPw Response example HTTP/1.1 200 OK Content-Type: application/json { "uri" : "https.../restapi/v1.0/dictionary/location? stateId=516&orderBy=City&page=1&perPage=100", "records" : [ { "city" : "Winnipeg", "npa" : "204", "nxx" : "null", "state" : { "uri" : "https.../restapi/v1.0/dictionary/state/516", "id" : "516" } }, { "city" : "Winnipeg", "npa" : "204", "nxx" : "272", "state" : { "uri" : "https.../restapi/v1.0/dictionary/state/516", "id" : "516" } }, { "city" : "Winnipeg", "npa" : "204", "nxx" : "800", "state" : { "uri" : "https.../restapi/v1.0/dictionary/state/516", "id" : "516" } CONFIDENTIAL 132 Rev.1.0.16.a.[79434afda268+] Dictionary }, { "city" : "Winnipeg", "npa" : "204", "nxx" : "480", "state" : { "uri" : "https.../restapi/v1.0/dictionary/state/516", "id" : "516" } }, { "city" : "Winnipeg", "npa" : "204", "nxx" : "318", "state" : { "uri" : "https.../restapi/v1.0/dictionary/state/516", "id" : "516" } } ], "paging" : { "page" : 1, "totalPages" : 1, "perPage" : 100, "totalElements" : 5, "pageStart" : 0, "pageEnd" : 4 }, "navigation" : { "firstPage" : { "uri" : "https.../restapi/v1.0/dictionary/location? stateId=516&orderBy=City&page=1&perPage=100" }, "lastPage" : { "uri" : "https.../restapi/v1.0/dictionary/location? stateId=516&orderBy=City&page=1&perPage=100" } } } Get Single Timezone Since 1.0.10 (Release 6.2) Returns the information on the certain timezone. Method/URI GET /restapi/v1.0/dictionary/timezone/{timezoneId} Usage Plan Group Light Path Parameters Parameter timezoneId Type Description string Internal identifier of a timezone Query Parameters Parameter page, perPage CONFIDENTIAL Type Description integer Standard paging parameters, see the section called “Common Query Parameters in Collection Resources” 133 Rev.1.0.16.a.[79434afda268+] Dictionary Request Body None Response Body Timezone Info Parameter Type Description Standard resource properties ID and canonical URI; see the section called “Resource Identification Properties” id, uri name string Short name of the timezone description string Meaningful description of the timezone Example Request example GET /restapi/v1.0/dictionary/timezone/57 HTTP/1.1 Accept: application/json Authorization: Bearer UExBMDFUMDRQV1MwMXw3nyAG7E-TvrhWGS8VjCNy3VIiNQ Response example HTTP/1.1 200 OK Content-Type: application/json { "uri" : "https.../restapi/v1.0/dictionary/timezone/57", "id" : "57", "name" : "US/Mountain", "description" : "Mountain Time (US & Canada)" } Get All Timezones Since 1.0.10 (Release 6.2) Returns all available timezones. This API provides access to all the available time zones and their respective IDs. They may be used to configure the default time zone and time zones for specific extensions. The API supports only one operation - retrieving available time zones. Method/URI GET /restapi/v1.0/dictionary/timezone Usage Plan Group Light CONFIDENTIAL 134 Rev.1.0.16.a.[79434afda268+] Dictionary Query Parameters Parameter page, perPage Type Description string Official name of the state, which locations are to be returned Request Body None Response Body Collection [Timezone Info [134]] Example Request example GET /restapi/v1.0/dictionary/timezone?perPage=7 HTTP/1.1 Accept: application/json Authorization: Bearer UExBMDFUMDRQV1MwMXwpRl4bV49QPA2GrecHHauJzSKX5w Response example HTTP/1.1 200 OK Content-Type: application/json { "uri" : "https.../restapi/v1.0/dictionary/timezone?page=1&perPage=7", "records" : [ { "uri" : "https.../restapi/v1.0/dictionary/timezone/1", "id" : "1", "name" : "GMT", "description" : "Casablanca, Monrovia, Reykjavik" }, { "uri" : "https.../restapi/v1.0/dictionary/timezone/2", "id" : "2", "name" : "WET", "description" : "Dublin, Edinburgh, Lisbon, London" }, { "uri" : "https.../restapi/v1.0/dictionary/timezone/3", "id" : "3", "name" : "CET", "description" : "Brussels, Copenhagen, Madrid, Paris" }, { "uri" : "https.../restapi/v1.0/dictionary/timezone/4", "id" : "4", "name" : "CET", "description" : "Sarajevo, Skopje, Warsaw, Zagreb" }, { "uri" : "https.../restapi/v1.0/dictionary/timezone/5", "id" : "5", "name" : "CET", "description" : "Belgrade, Bratislava, Budapest, Ljubljana, Prague" }, { "uri" : "https.../restapi/v1.0/dictionary/timezone/6", "id" : "6", "name" : "CET", "description" : "Amsterdam, Berlin, Bern, Rome, Stockholm, Vienna" }, { "uri" : "https.../restapi/v1.0/dictionary/timezone/7", "id" : "7", "name" : "EET", "description" : "Athens, Bucharest, Istanbul" } ], CONFIDENTIAL 135 Rev.1.0.16.a.[79434afda268+] Dictionary "paging" : { "page" : 1, "totalPages" : 13, "perPage" : 7, "totalElements" : 90, "pageStart" : 0, "pageEnd" : 6 }, "navigation" : { "nextPage" : { "uri" : "https.../restapi/v1.0/dictionary/timezone?page=2&perPage=7" }, "firstPage" : { "uri" : "https.../restapi/v1.0/dictionary/timezone?page=1&perPage=7" }, "lastPage" : { "uri" : "https.../restapi/v1.0/dictionary/timezone?page=13&perPage=7" } } } Get Language List Since 1.0.14 (Release 6.6) Returns the information about supported languages. Method/URI GET /restapi/v1.0/dictionary/language Usage Plan Group Light Request Body None Response Body Parameter Type Description records Collection of parameters User interface language data id, uri string Standard resource properties ID and canonical URI; see the section called “Resource Identification Properties” name string Name of the language isoCode string Language code according to the ISO standard, see ISO 639 [http://ru.wikipedia.org/wiki/ISO_639] localeCode string Localization code paging, navigation Standard collection metadata, see the section called “Common Collection Properties” Example Request example CONFIDENTIAL 136 Rev.1.0.16.a.[79434afda268+] Dictionary GET /restapi/v1.0/dictionary/language HTTP/1.1 Accept: application/json Authorization: Bearer U0pDMDFQMDFQQVMwMnxBQUFWZmY4ZXoxMlhv Response example HTTP/1.1 200 OK Content-Language: en Content-Type: application/json; charset=UTF-8 Content-Length: 897 { "uri" : "https.../restapi/v1.0/dictionary/language?page=1&perPage=100", "records" : [ { "uri" : "https.../restapi/v1.0/dictionary/language/1033", "id" : "1033", "name" : "English (United States)", "isoCode" : "en", "localeCode" : "en-US" }, { "uri" : "https.../restapi/v1.0/dictionary/language/1049", "id" : "1049", "name" : "Russian", "isoCode" : "ru", "localeCode" : "ru-RU" } ], "paging" : { "page" : 1, "totalPages" : 1, "perPage" : 100, "totalElements" : 2, "pageStart" : 0, "pageEnd" : 1 }, "navigation" : { "firstPage" : { "uri" : "https.../restapi/v1.0/dictionary/language?page=1&perPage=100" }, "lastPage" : { "uri" : "https.../restapi/v1.0/dictionary/language?page=1&perPage=100" } } } Get Single Language Since 1.0.14 (Release 6.6) Returns language by its respective ID. Method/URI GET /restapi/v1.0/dictionary/language/{languageId} Usage Plan Group Light Path Parameters Parameter languageId CONFIDENTIAL Type string Description Internal identifier of a language; see the section called “Resource Identification Properties” 137 Rev.1.0.16.a.[79434afda268+] Dictionary Response Body None Response Body Parameter Type Description id, uri string Standard resource properties ID and canonical URI; see the section called “Resource Identification Properties” name string Name of the language isoCode string Language code according to the ISO standard, see ISO 639 [http:// ru.wikipedia.org/wiki/ISO_639] localeCode string Localization code Example Request example GET /restapi/v1.0/dictionary/language/1033 HTTP/1.1 Accept: application/json Authorization: Bearer U0pDMDFQMDFQQVMwMXxBQUFWZmY4ZXoxMlhvSDBfczRRd2ZMclB1dG Response example HTTP/1.1 200 OK Content-Type: application/json Content-Language: en Content-Length: 182 { "uri" : "https.../restapi/v1.0/dictionary/language/1033", "id" : "1033", "name" : "English (United States)", "isoCode" : "en", "localeCode" : "en-US" } CONFIDENTIAL 138 Rev.1.0.16.a.[79434afda268+]